-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ::: Stack Frame Pointer Overflow °³³ä ÀÌÇØÇϱâ ::: written by naska21 in WiseGuys -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- :: ¸ñÂ÷ :: 0x00. ÁغñÇϱâ 0x01. ÀÌÇØÇϱâ 0x02. ¸¶¹«¸® -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 0x00. ÁغñÇϱâ ÀÌ ¹®¼­¸¦ °øºÎ Çϱâ ÀÌÀü¿¡ ÀÌ ¹®¼­¸¦ Àд »ç¶÷¿¡°Õ ½ºÅÿ¡ °üÇÑ ¹è°æ Áö½Ä ÀÌ ¹Ì¸® ±ò·Á ÀÖ¾î¾ßÇϸç, ±âº»ÀûÀÎ bofÀÇ °³³äÀ» ÀÌÇØÇß±æ ¹Ù¶õ´Ù. °Ô´Ù°¡ ÇÁ·Î±×·¥ÀÌ ½ÇÇà µÇ´Â µ¿¾È ½ºÅÿ¡ ¾î¶°ÇÑ Á¤º¸°¡ ½×¿©°¡´ÂÁö, ±×¸®°í ±×·¯ÇÑ Á¤º¸µéÀº ¾î¶°ÇÑ ¿ªÇÒÀ» ÇÏ´ÂÁö¿¡ ´ëÇؼ­µµ ÀÌ°÷¿¡¼­ ¹°·Ð ¾ð±ÞÇÒ °ÍÀÌ Áö¸¸ ¹Ì¸® ¾Ë°í ÀÖ´Ù¸é ÀÌÇØ°¡ ½¬¿ï °ÍÀÌ´Ù. ±×¸®°í ¸¶Áö¸·À¸·Î ¾î¼Àºí¸®¾î¸¦ Á¶±ÝÀÌ¶óµµ ÀÌÇØÇÒ ¼ö ÀÖ´Ù¸é ÀÌÇØÇϴµ¥ Å« µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ¿ì¼± ¿ì¸®°¡ ¾î¶² ÇÁ·Î±×·¥À» ½ÇÇàÇÒ¶§ ½ºÅÿ¡´Â ¾î¶°ÇÑ Á¤º¸µéÀÌ ½×ÀÌ°Ô µÉ ±î? ±×¸²À¸·Î ÀÌÇظ¦ µ½ÀÚ.. | ... | Low address +------------+ | ... | +------------+ | SFP | +------------+ | RET | +------------+ High address ¾î¶² ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°Ô µÉ¶§, ½ºÅÿ¡´Â ½ÇÇà µÇ´Â ÇÔ¼ö¿¡ °ü·ÃµÈ Á¤º¸µéÀÌ ½×ÀÌ°Ô µÈ´Ù. ¸®ÅÏ ¾îµå·¹½º(eip), ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ(sfp), Áö¿ªº¯¼öµé... ¸®ÅÏ ¾îµå·¹½º¿¡´Â ÇØ´ç ÇÔ¼ö°¡ Á¾·áµÇ°í ³­ ÈÄ ´ÙÀ½ ½ÇÇà ÄÚµåÀÇ ÁÖ¼Ò¸¦ ÀúÀå ÇÏ°í ÀÖ´Ù. ÇÔ¼ö°¡ Á¾·áµÇ°í ³­ ÈÄ ÇÁ·Î¼¼½º´Â ret¸¦ ½ºÅÿ¡¼­ ²¨³»¾î ÇØ´ç ÁÖ ¼Ò·Î À̵¿ÇÏ¿© ´ÙÀ½ Äڵ带 °è¼Ó ¼öÇàÇÏ°Ô µÉ °ÍÀÌ´Ù. º¯¼öÀÇ boundary check¸¦ ÇÏÁö ¾ÊÀº Ãë¾àÇÑ ÇÁ·Î±×·¥¿¡¼­ º¯¼ö¸¦ ¿À¹öÇÃ·Î¿ì ½ÃÄÑ ÀÌ ret¸¦ µ¤¾î¾²¹Ç·Î¼­ ÇÁ·Î±×·¥ÀÇ È帧À» ¿øÇÏ´Â °÷À¸·Î ¹Ù²Ù´Â °ÍÀÌ ¹Ù·Î stack overflow °ø°ÝÀÌ´Ù. Frame pointer overflow´Â ret°¡ ¾Æ´Ñ sfpÀÇ 1¹ÙÀÌÆ®¸¦ µ¤¾î ¾²¹Ç·Î½á ¿ì¸®°¡ ¿øÇÏ´Â ´ë·Î ÇÁ·Î±×·¥ÀÇ ½ÇÇà È帧À» ¹Ù²Ü¼ö°¡ ÀÖ´Ù. ¿ì¸®°¡ ÀÌ ¹®¼­¿¡¼­ °øºÎ ÇÒ ³»¿ëÀº ¹Ù·Î sfpÀÎ °ÍÀÌ´Ù. ±×·¸´Ù¸é sfp´Â ¹«¾ùÀÌ°í, ¾î¶² ¿ø¸®·Î ÇÁ·Î±×·¥ ÀÇ ½ÇÇà È帧À» ¹Ù²Ù´Â °¡´ÉÇÏ°Ô µÇ´Â °ÍÀϱî? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 0x01. ÀÌÇØÇϱ⠿켱 ¹Ì¸® ¾ð±ÞÇØ ³õÀ» °ÍÀº ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ ¿À¹öÇ÷οì´Â main()¿¡¼­´Â Àû¿ëÀÌ µÇÁö ¾Ê´Â´Ù´Â Á¡ÀÌ´Ù. ±× ÀÌÀ¯´Â ³ªÁß¿¡ ¾Ë¾Æ º¸°Ú´Ù. ¿ì¼± ¾î¶² ÇÁ·Î½ÃÁ®°¡ ¼öÇàµÉ¶§ ³»ºÎÀûÀ¸·Î ½ºÅÿ¡ ¹«½¼ ÀÏÀ» ÇÏ´ÂÁö ¾î¼ÀÄÚµå ¸¦ »ìÆ캼 ÇÊ¿ä°¡ ÀÖ´Ù. ÇÁ·Î±×·¥ÀÇ ½ÇÇà È帧À» ¾Ë±â À§Çؼ­ÀÌ´Ù. ÀÌ Äڵ忡¼­´Â ebpÀÇ ÀÇ¹Ì¿Í ¿ªÇÒ¿¡ ´ëÇØ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ÀÌ¹Ì ¾Ë°í ÀÖ´Â ºÐÀº ´ÙÀ½À¸·Î ³Ñ¾î°¡µµ ÁÁ´Ù. main() { int a = 10; printf("%d\n", a); } ÀÌ ¼Ò½º¸¦ ÄÄÆÄÀÏ ÇÏ¿© gdb·Î µð½º¾î¼ÀÇØ º¸°Ú´Ù. Âü°í·Î ÀÌ ¹®¼­¿¡¼­´Â ÄÄÆÄÀÏ ¿É¼Ç (-mpreferred-stack-boundary=2)À¸·Î ÄÄÆÄÀÏ Çß´Ù. [root@test acm]# gdb -q ./sfp (gdb) disas main Dump of assembler code for function main: 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x4,%esp 0x8048466 : movl $0xa,0xfffffffc(%ebp) 0x804846d : pushl 0xfffffffc(%ebp) 0x8048470 : push $0x80484e8 0x8048475 : call 0x804833c 0x804847a : add $0x8,%esp 0x804847d : leave 0x804847e : ret 0x804847f : nop End of assembler dump. (gdb) ¾î¼À Äڵ带 ÈÈ¾î º¸ÀÚ. 0x8048460
: push %ebp --> ÇöÀçÀÇ ebp°ªÀ» ½ºÅÿ¡ ÀúÀåÇÑ´Ù. ¹Ù·Î À̺κÐÀÌ sfp°¡ µÈ´Ù. ±×·³ ret´Â? ret°¡ ½ºÅÿ¡ ½×ÀÌ´Â°Ç ¾î¼ÀÄڵ忡´Â »ý·«ÀÌ µÇ¾î ÀÖ´Ù. ebp°ªÀÌ ¹«¾ùÀÎÁö´Â µÚ¿¡ ¼³¸íÇϵµ·Ï ÇÑ´Ù. 0x8048461 : mov %esp,%ebp --> ÇöÀçÀÇ esp(½ºÅÃÆ÷ÀÎÅÍ)°ªÀ» ebp¿¡ ÀúÀåÇÑ´Ù. ±×·³ ÇöÀç »óÅ¿¡¼­ ½ºÅÃÀ» ±× ·Á º¸ÀÚ.. | ... | Low address +------------+ | ... | esp(ebp)--->+------------+ | SFP |-> ÀÌÀü ebp°ªÀ» °¡Áö°í ÀÖ´Ù. +------------+ | RET | +------------+ High address ÀÌ ±×¸²À» Àß ´«¿©°Ü ºÁ µÎ½Ã±æ.. 0x8048463 : sub $0x4,%esp --> À̺κÐÀº a¶ó´Â intÇü(4byte)º¯¼ö¸¦ »ç¿ëÇϱâ À§ÇØ 4¹ÙÀÌÆ® ¸¸Å­ ½ºÅÿ¡ °ø °£À» ÇÒ´çÇÏ´Â ºÎºÐÀÌ´Ù. esp¿¡¼­ 4¸¦ »«´Ù. Áï ½ºÅà Æ÷ÀÎÅ͸¦ 4¹ÙÀÌÆ® ¸¸Å­ À̵¿½ÃŲ´Ù. ¾îµð·Î? 4¸¦ »°À¸¹Ç·Î ÁÖ¼Ò°ªÀÌ °¨¼Ò Çß´Ù. Áï, À§ÂÊÀ¸·Î ¿Ã¶ó °¥¼ö·Ï ÁÖ¼Ò°ªÀÌ °¨¼ÒÇϹǷÎ, ÇöÀç »óŸ¦ ±×¸²À¸·Î º¸¸é, (Âü°í : ½ºÅÃÀÇ ÇÑÄ­Àº ±âº»ÀûÀ¸·Î ¿öµå ´ÜÀ§(4byte)ÀÌ´Ù.) | ... | Low address esp---->+------------+ | a | ebp---->+------------+ | SFP | +------------+ | RET | +------------+ High address ÀÌ·± Çü½ÄÀÌ µÇ°Ú´Ù. ebp´Â ±×´ë·Î ÀÖ°í esp¸¸ ½ºÅñ׸²¿¡¼­ À§ÂÊÀ¸·Î À̵¿ Çϸ鼭 Áö¿ªº¯¼ö a¸¦ »ç¿ëÇϱâ À§ÇÑ °ø°£À» ÇÒ´ç Çß´Ù. 0x8048466 : movl $0xa,0xfffffffc(%ebp) --> a¿¡ 0xa(½ÊÁø¼ö 10)À» ³Ö¾îÁÖ´Â ºÎºÐÀÌ´Ù. ±Ùµ¥ À̺κÐÀ» Àß º¸½Ã¶ó. a¶ó´Â °÷À» °¡¸£Å°±â À§ÇØ 0xfffffffc(intÇüÀ¸·Î -4¸¦ ³ªÅ¸³¿)(%ebp)¸¦ »ç¿ë ÇÏ¿´´Ù. Áï.. ebp¸¦ ±âÁØÀ¸·Î -4ÇÑ °÷À» ÂüÁ¶ÇØ Áö¿ª º¯¼ö a¿¡ °ªÀ» ÇÒ´çÇÑ °ÍÀÌ´Ù. ***¿©±â¼­ ebpÀÇ ¿ªÇÒÀ» ¼³¸íÇÏ°Ú´Ù. esp´Â popÀ̳ª push°°ÀÌ ½ºÅÿ¡ °ªÀ» ³Ö°Å ³ª »©³¾¶§ À¯µ¿ÀûÀ¸·Î °ªÀÌ º¯Çϸ鼭 À̵¿À» ÇÑ´Ù. ½ºÅÃÆ÷ÀÎÅÍ´Â Ç×»ó ½ºÅÃÀÇ °¡Àå À­ºÎºÐÀ» °¡¸£Å°°í ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. µû¶ó¼­ Áö¿ªº¯¼ö¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â »ó´ëÀûÀ¸·Î °Å¸®°¡ Ç×»ó ÀÏÁ¤ÇÑ ¾î¶°ÇÑ ±âÁØÁ¡ÀÌ ÇÊ¿äÇÏ°Ô µÈ °ÍÀÌ´Ù ±× ±âÁØÁ¡ÀÌ ¹Ù·Î ebp·¹Áö½ºÅÍÀÎ °ÍÀÌ´Ù. 0x804846d : pushl 0xfffffffc(%ebp) --> printf("%d\n", a);¸¦ ¼öÇàÇϱâ À§ÇØ ½ºÅÿ¡ ÀÎÀÚ aÀÇ °ªÀ» ¸ÕÀú ³Ö¾î ÁØ´Ù. ¿©±â¼­µµ ebp°ªÀ» ±âÁØÀ¸·Î Áö¿ª º¯¼ö aÀÇ °ªÀ» ÂüÁ¶ÇÏ¿´´Ù. 0x8048470 : push $0x80484e8 --> printf("%d\n", a);¿¡¼­ "%d\n"ÀÌ ÀÖ´Â ÁÖ¼Ò¸¦ pushÇÏ¿´´Ù. 0x8048475 : call 0x804833c --> printfÇÔ¼ö¸¦ È£ÃâÇß´Ù. 0x804847a : add $0x8,%esp --> ÀÎÀÚ¸¦ ³Ñ°Ü ÁÖ±â À§ÇØ ½è´ø ½ºÅðø°£À» ¹ÝȯÇß´Ù. 0x804847d : leave 0x804847e : ret --> ³ªÁß¿¡ ´Ù½Ã ¼³¸íÇÏ°Ú´Ù. ÀÚ.. ¿©±â±îÁö ebpÀÇ ÀÌÇظ¦ µ½±â À§ÇØ ¾î¼ÀÄÚµå·Î ¼³¸íÀ» ÇÏ¿´½À´Ï´Ù. ¾Æ±î sfp¿¡ ÀÌÀü ebp°ªÀÌ µé¾î°¡´Â °É È®ÀÎ ÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ÇÏÁö¸¸ À̰͸¸ °¡Áö°í´Â sfp¿¡ ´ëÇÑ ÀÌÇØ°¡ ºÎÁ·ÇÒ °Í °°½À´Ï´Ù. ±×·¯¸é sfpÀÇ ÀÌÇظ¦ À§ÇØ ÇϳªÀÇ ¼Ò½º¸¸ ´õ º¾½Ã´ç.. (¾î.. ¸»Åõ°¡ ¹Ù²¼´ç..-0-;;) sub() { int c; int d; } main() { int a; int b; sub(); } ÄÄÆÄÀÏ Çؼ­ gdb·Î »ìÆ캸¸é, [root@test acm]# gcc sfp.c -o sfp -mpreferred-stack-boundary=2 main() ºÎºÐ.. [root@test acm]# gdb -q ./sfp (gdb) disas main Dump of assembler code for function main: 0x8048438
: push %ebp 0x8048439 : mov %esp,%ebp 0x804843b : sub $0x8,%esp 0x804843e : call 0x8048430 0x8048443 : leave 0x8048444 : ret 0x8048445 : lea 0x0(%esi),%esi 0x8048448 : nop sub() ºÎºÐ.. (gdb) disas sub Dump of assembler code for function sub: 0x8048430 : push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : sub $0x8,%esp 0x8048436 : leave 0x8048437 : ret End of assembler dump. (gdb) ±×·³ ¿©±â¼­ °ú ¿¡ break point¸¦ °É¾î³õ±¸ ½ÇÇàÇØ º¸¸é¼­ ebp, espÀÇ º¯È­¸¦ »ìÆì º¸°Ú½À´Ï´Ù. (gdb) b *main+3 Breakpoint 1 at 0x804843b (gdb) b *sub+3 Breakpoint 2 at 0x8048433 (gdb) r Starting program: /home/naska/acm/./sfp Breakpoint 1, 0x0804843b in main () (gdb) info reg $ebp $esp ebp 0xbffffa28 0xbffffa28 esp 0xbffffa28 0xbffffa28 ÀÌÁ¦ºÎÅÏ ½ºÅÃÀ» ¿·À¸·Î ±×¸®°Ú½À´Ï´Ù.. ¿À¸¥ÂÊÀÌ ³ôÀº ÁÖ¼Ò(½ºÅÃÀÇ ¹Ù´Ú) ÀÌ°í ¿ÞÂÊÀÌ ³·Àº ÁÖ¼Ò(½ºÅÃÀÇ top)ÀÔ´Ï´Ù. ÀÌ »óÅ¿¡¼­ ½ºÅÃÀ» ±×·Á º¸¸é,
[sfp][ret] ^--ebp, esp Áï, ÇöÀç, ebp°ª°ú esp°ªÀÌ °°ÁÒ.. °è¼Ó ½ÇÇàÇغ¸ÁÒ.. (gdb) ni 0x0804843e in main () (gdb) info reg $ebp $esp ebp 0xbffffa28 0xbffffa28 esp 0xbffffa20 0xbffffa20 ni¸í·ÉÀº nexti, ¾î¼À ÇÑ ¸í·ÉÀ» ½ÇÇà½ÃÅ°´Â °Ì´Ï´Ù. È£¿À.. esp°ªÀÌ 8°¨¼Ò Çß½À´Ï´Ù. ebp´Â ±×´ë·Î ÀÚ½ÅÀÇ ÀÚ¸®¸¦ ÁöÅ°°í ÀÖ±º¿ä. 0x804843b : sub $0x8,%esp À̺κÐÀÌ ½ÇÇàµÈ ÈÄ°¡ µÇ°ÚÁÒ.. ½ºÅÃÀ» ±×·Á º¸¸é,
[b][a][sfp][ret] ^-esp ^-ebp °è¼Ó Çغ¸ÁÒ.. (gdb) ni Breakpoint 2, 0x08048433 in sub () (gdb) info reg $ebp $esp ebp 0xbffffa18 0xbffffa18 esp 0xbffffa18 0xbffffa18 ÀÌÁ¨ sub()·Î ³Ñ¾î °¬½À´Ï´Ù. ¾î¼À Äڵ带 º¸¸é ¾Æ½Ã°ÚÁö¸¸ sub()¿¡¼­´Â sub()ÀÇ Áö¿ªº¯¼ö°¡ Àֱ⠶§¹®¿¡ »õ·Î¿î sub()ÀÇ ebp¸¦ ¼³Á¤ÇØÁà¾ß ÇÕ´Ï´Ù. ±×·¡¾ß sub() ÀÇ Áö¿ªº¯¼ö·Î Á¢±ÙÀÌ ¿ëÀÌÇϱ⠶§¹®ÀÌÁÒ. ±×·±µ¥ sub()°¡ ³¡³­ ÈÄ¿¡´Â main()ÀÇ ebp°¡ ´Ù½Ã ÇÊ¿äÇÏ°ÚÁÒ? ±×·¡¼­ main()ÀÇ ebp¸¦ sfp¿¡ ÀúÀåÇÏ´Â °Ì´Ï´Ù. ÇöÀç »óÅ¿¡¼­ ½ºÅÃÀ» ´ýÇÁÇØ º¸ÁÒ.. (gdb) x/2x $esp 0xbffffa18: 0xbffffa28 0x08048443 sub()ÀÇ sub()ÀÇ ¾ÆÇÏ~ sfp¿¡ °ú¿¬ main()ÀÇ ebp°¡ ÀúÀåµÇ¾î ÀÖ±º¿ä.. 0x804843e : call 0x8048430 0x8048443 : leave ¿©±â¼­ 0x08048443ÀÌ sub()°¡ callµÇ°í ³ª¼­ ´ÙÀ½ ¸í·ÉÄÚµåÀÇ ÁÖ¼ÒÀ̹ǷΠret°¡ È®½ÇÇÑ°Í °°³×¿ä.. ±×·³ ÇöÀçÀÇ ½ºÅÃÀ» ±×·Áº¸¸é,
[sfp][ret][b][a][sfp][ret] ebp,esp-^ | ^ +-------------+ °è¼Ó ½ÇÇàÇսôç.. (gdb) ni 0x08048436 in sub () (gdb) info reg $ebp $esp ebp 0xbffffa18 0xbffffa18 esp 0xbffffa10 0xbffffa10 ¿©±â¼­µµ Áö¿ªº¯¼ö c¿Í d¸¦ ÇÒ´çÇÏ´À¶ó ½ºÅÃÆ÷ÀÎÅÍ°¡ 8byte°¨¼ÒÇßÁÒ. ½ºÅà »óÅ´Â,
[d][c][sfp][ret][b][a][sfp][ret] esp-^ ebp-^ | ^ +-------------+ °è¼Ó ½ÇÇàÇØ º¸¸é, (gdb) ni 0x08048437 in sub () (gdb) info reg $ebp $esp ebp 0xbffffa28 0xbffffa28 esp 0xbffffa1c 0xbffffa1c ¿À¿Ê.. ebp°¡ main()ÀÇ ebp·Î ¹Ù²¼³×¿ä.. ÈåÈå.. À̺κÐÀº leave¸í·ÉÀ» ½ÇÇàÇÑ °á °úÀÔ´Ï´Ù. esp´Â 0xbffffa1c¿¡ Àֳ׿ä.. ¿©±â´Â ¾îµô±î¿ä~? º¾½Ã´ç.. (gdb) x/x $esp 0xbffffa1c: 0x08048443 ¿ÀÈ£~ ¹Ù·Î sub()ÀÇ retÀ̱º¿ä~.. ÇöÀç leave¸í·ÉÀ» ½ÇÇàÇÏ°í ret¸¦ ½ÇÇàÇϱâ Àü ½ºÅÃÀÇ »óÅ ÀÔ´Ï´ç.. ±×·³ ¿©±â¼­ leave¸í·É¿¡ ´ëÇØ ¼³¸íÇØ µå¸®°Ú½À´Ï´Ù. leave¸í·É ½ÇÇà °á°úÈÄ ¿ì¸®´Â ebp°ªÀÌ ÀÌÀü ÇÔ¼öÀÇ ebp°ªÀ» µ¹·Á¹Þ´Â°É È®ÀÎÇß±¸ ¿ä. esp´Â ret¿¡ À§ÇØÇϴ°ÍÀ» È®ÀÎÇß½À´Ï´Ù. leave¸í·ÉÀº mov ebp, esp pop ebp ÀÌ µÎ ¸í·ÉÀ» ¼öÇàÇÕ´Ï´Ù. Áï, esp°ªÀ» ÇöÀçÀÇ ebpÁï, sfp°¡ Àִ°÷À¸·Î À̵¿½ÃŲ ÈÄ, sfp°ªÀ» popÇؼ­ ebp ¿¡ ÀúÀåÇÏ´Â °ÍÀÔ´Ï´Ù.(Âü°í·Î leave¿Í ret´Â ÇÔ¼ö°¡ Á¾·áµÉ¶§ ½ÇÇàµÇ¹Ç·Î Áö¿ªº¯ ¼ö´Â À̶§ ¼Ò¸êÇÕ´Ï´Ù.) µû¶ó¼­ sfp¿¡ µé¾îÀÖ´ø main()ÀÇ ebp°ªÀº ÇöÀçÀÇ ebp°ª¿¡ ÀúÀåµÇ°í, esp°ªÀº sfp¸¦ °¡¸£Å°°í ÀÖ´Ù°¡ pop ebp¿¡ ÀÇÇØ 4°¡ Áõ°¡ÇϹǷΠret¸¦ °¡¸£Å°°Ô µÇ´Â °ÍÀÔ´Ï´Ù. °è¼Ó ½ÇÇàÇØ º¸¸é, (gdb) ni 0x08048443 in main () (gdb) info reg $ebp $esp ebp 0xbffffa28 0xbffffa28 esp 0xbffffa20 0xbffffa20 ÈÞ.. ÀÌÁ¦ sub()°¡ È£ÃâµÇ±â ÀÌÀü »óÅ·Πµ¹¾Æ¿À°Ô µÇ¾ú±º¿ä.. ¿©±â¼­ ret¼öÇà½Ã ½ºÅÿ¡¼­ ret¸¦ ²¨³»¼­ eip¿¡ ÀúÀåÇÑÈÄ eip¿¡ ÀúÀåµÈ ÁÖ¼ÒÀÇ ½Ç ÇàÄڵ带 ¼öÇàÇÕ´Ï´Ù. (°£´ÜÈ÷ ¸»Çؼ­ ÀýÂ÷Àû ÇÁ·Î±×·¡¹Ö¿¡¼­ ´Ù¸¥°÷À¸·Î °¬´Ù°¡ µÇµ¹¾Æ ¿Ã¶§ goto¹®À» »ç¿ëÇÏ´Â °Í°ú °°½À´Ï´Ù.:gw-basic) ÀÚ.. ¿©±â±îÁö ÇÁ·Î±×·¥ ¼öÇà È帧À» ÂÒ¾Ç ÈÈ¾î º¸¸é¼­ ebp, sfp¿¡ ´ëÇØ ¾Ë¾ÆºÃ´Â µ¥¿ä.. ±×·³ ¾î¶»°Ô Çؼ­ sfpÀÇ ¹Ù²ï 1¹ÙÀÌÆ®°¡ ÇÁ·Î±×·¥ ¼öÇà È帧À» ¹Ù²Ü ¼ö ÀÖ À»±î¿ä? ¿©±â±îÁö ÀÌÇظ¦ ´Ù Çϼ̴ٸé ÀÌ¹Ì ¾Ë°í °è½ÇÅÙµ¥.. ¿ì¼± main()ÀÌ È£ÃâµÇ±¸¿ä. ±× ´ÙÀ½ main() ¿¡¼­ sub()°¡ È£ÃâµÇ¾ú½À´Ï´Ù. ¿©±â¼­ overflow°¡ ÀϾ¼­ sub()ÀÇ sfpºÎºÐ¸¸ °ªÀÌ º¯°æµÇ¾ú´Ù°í ÇսôÙ. ÀÌÁ¨ ÀÌ sub()°¡ Á¾·áµÇ¸é¼­ leave¸¦ ¼öÇàÇÕ´Ï´Ù. À̶§ esp´Â sub()ÀÇ ebpÁï.. sfp¸¦ °¡¸£Å°°Ô µÉ °ÍÀÌ°í, pop ebp, Áï, main()ÀÇ ebp¸¦ µ¹·Á ¹Þ´Â °úÁ¤¿¡¼­ º¯°æµÈ sfp°ªÀ» °¡Á®¿À°Ô µÇ¹Ç·Î main()ÀÇ ebp´Â main() ÀÇ sfp¸¦ °¡¸£Å°´Â °ªÀÌ ¾Æ´Ñ ´Ù¸¥ °ªÀ» °®°Ô µÇ°ÚÁö¿ä.. ±×·³ ¿©±â¼­(leave¸¦ ¼öÇàÇÏ°í ³­ ÈÄ) Á¤»óÀûÀÎ °æ¿ìÀÇ ½ºÅÃÀº
[sfp][ret][b][a][sfp][ret] ^--esp ^--ebp ¾Æ±îó·³ sub()ÀÇ sfp°¡ º¯°æµÈÈÄ leave°¡ ¼öÇàµÇ¾úÀ» °æ¿ìÀÇ ½ºÅÃÀº
[sfp][ret][b][a][sfp][ret] ^--esp *ebp:¾îµò°¡ ÀÌ»óÇÑ°÷.. ¿¹¸¦ µé¾î ¿ø·¡ sub()ÀÇ sfp°¡ main()ÀÇ ebp Áï, main()ÀÇ &sfp°ªÀ» °¡Áö¹Ç·Î bffffa08À̾ú´Ù°í ÇÒ¶§, ¿À¹öÇ÷Π°¡ ÀϾ¼­ sub()ÀÇ sfp°¡ bffffa48·Î º¯°æµÇ¾ú´Ù°í Çϸé, main()ÀÇ ebp°¡ bffffa48ÀÌ µÇ´Â °ÍÀÌÁÒ.. ¿ø·¡ main()ÀÇ ebp´Â bffffa08À̾ú´Âµ¥ ¸»ÀÌÁÒ.. ÀÌ·¸°Ô main()ÀÇ ebp°¡ ¹Ù²î°í ³ª¼­, sub()ÀÇ ret°¡ ¼öÇàµÇ°í ´Ù½Ã °è¼ÓÇÏ¿© main()ÀÇ ´ÙÀ½ ¸í·ÉÀÌ ¼öÇàµÇ´Ù°¡, main()ÀÇ leave°¡ ¼öÇàµÇ°Ô µË´Ï´Ù. À̶§ mov ebp, esp¿¡ ÀÇÇØ º¯°æµÇ¾î ¹ö¸° ebp·Î esp°¡ À̵¿ÇÏ°Ô µË´Ï´Ù. ±×¸®°í pop ebp¿¡ ÀÇÇØ 4¹ÙÀÌÆ®ÀÇ ¾î¶°ÇÑ °ªÀÌ ²¨³»¾î ÁøÈÄ(ÀÌ ¶§ pop¸í·É¿¡ ÀÇÇØ esp´Â 4°¡ Áõ°¡ÇÏ°Ô µÇ°ÚÁÒ..), ±×°÷¿¡¼­ ret¸í·É¿¡ ÀÇÇØ eip°ªÀ» ¾ò¾î ´ÙÀ½ ¸í·ÉÀ» ¼öÇàÇÏ°Ô µÇÁÒ.. µû¶ó¼­ À̶§ º¯°æµÇ¹ö¸° ebp+4¿¡ &shellcode°¡ ÀÖ´Ù¸é ÀÌ ÇÁ·Î¼¼½º´Â ¸¶Ä¡ ±×°ÍÀÌ return addressÀξç eip·Î ²¨³»¾î shellcode¸¦ ¼öÇàÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 0x02. ¸¶¹«¸® Áö±Ý±îÁö ¿ì¸®´Â sfp°ªÀÇ º¯°æ¿¡ ÀÇÇØ ÇÁ·Î±×·¥ÀÇ ¼öÇà È帧À» ¿øÇÏ´Â °÷À¸·Î ¹Ù ²Ü¼ö ÀÖ´Â ¿ø¸®¿¡ ´ëÇØ ¾Ë¾Æ º¸¾Ò½À´Ï´Ù. Âü°í·Î gcc2.96¿¡¼­´Â ÀÌ·± °æ¿ì°¡ µå¹° ÁÒ? ´õ¹Ì°ª ¶«½Ã 1byte ¿À¹öÇØ°¡Áö°í´Â sfp¸¦ ¹Ù²Ù±â Èûµéµí.. ¿òÇÏÇÏÇÏ~ °ÍµÎ ¾î¶»°Ôµç °¡´ÉÇϵµ·Ï ³ë·ÂÇغÁ¾ß°ÚÁö¿ä~.. ±×·³ ÁñÇÙ~ ;) ** º¸³Ê½º ** ** ¿Ö? main()ÀÇ sfp´Â ¹é³¯ µ¤¾î½áµµ ÇÁ·Î±×·¥ ½ÇÇà¿¡´Â ¿µÇâÀ» ¹ÌÄ¡Áö ¸øÇϴ°¡? Àú´Â ¸ðµç °ÍÀ» È®½ÇÈ÷ ¾ËÁö´Â ¸øÇÏÁö¸¸.. Á¦°¡ µð¹ö±ëÀ» ÅëÇØ ¾Æ´Â°Í¸¸ ¸»¾¸µå¸® ¸é.. main()ÀÇ ret¸¦ x/16i ·Î ¿¡¼ÀÄڵ带 »ìÆ캸¸é.. ¿ì¼±.. main()ÀÌ ³¡³­ÈÄ ½ÇÇàµÇ´Â ÄÚµå´Â __libc_start_main ÀÇ ÄÚµå¶ó´Â°É ¾Ë¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀ» ÂÞ¿í ³¡±îÁö »ìÆ캸¸é leave¸í·ÉÀº ¾ø°í ret¸¸ ÀÖ½À´Ï´Ù. ¾Æ¸¶µµ ¿©±â¼­´Â ÀÌÀü ebp¸¦ µÇµ¹·ÁÁÙ ÇÊ¿ä°¡ ¾ø³ªº¾´Ï´Ù.. È÷È÷ sfp°ªÀÇ º¯°æÀ¸·Î ÇÁ·Î±×·¥ÀÇ ½ÇÇàÈ帧ÀÌ ¹Ù²î¾îÁú¶§´Â leave¸¦ ÇßÀ»¶§ esp°ªÀÌ ¹Ù ²î°í ±×·Î ÀÎÇØ ¾û¶×ÇÑ eip¸¦ ²¨³»¿À±â ¶§¹®Àε¥.. leave°¡ ¾øÀ¸´Ï ¾Æ¹« »ó°üÀÌ ¾ø°ÚÁÒ ±×¸®°í Çϳª´õ.. main()ÀÇ sfp°ªÀº?? µµ´ëü ¸Ó½Ã³Ä?? main()ÀÇ sfp°ªÀ» ÃßÀûÇØ º¸¸é.. 0x00000000 À» °¡¸£Å°°í ÀÖ°í +4byteÇÑ °÷¿¡´Â ¾î¶² ÁÖ¼Ò°¡ ÀÖ½À´Ï´Ù. ±× ÁÖ¼Ò¸¦ ¾î¼ÀÄÚµå·Î »ìÆ캸¸é 'hlt'°¡ ³ª¿À´Âµ¥¿ä, ÀÌ ¸í·ÉÀº process halt·Î½á.. ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃÅ°´Â ¸í·ÉÀÌÁÒ.. Èå.. ´õ ÀÚ¼¼ÇÑ °ÍÀº Àúµµ ´õ °øºÎÇØ ºÁ¾ß °Ú½À´Ï´Ù..