FEDORA CORE2¿¡¼ EXEC-SHIELD¸¦ ¿ìȸÇÏ¿© STACK ±â¹Ý OVERFLOW °ø°Ý ±â¹ý Çѹø¿¡ ¼º°øÇϱâ
by Beist Security Research Group
¿ä¾à: FEDORA LINUX´Â ÇØÄ¿ÀÇ ½Ã½ºÅÛ ÇØÅ· °ø°ÝÀ» ¸·±â À§ÇØ EXEC-SHIELD¶ó´Â Ä¿³Î ±â¹ÝÀÇ º¸¾È ¼Ö·ç¼ÇÀ» Àû¿ëÇÏ°í ÀÖ´Ù. º» ¹®¼´Â GLIBCÀÇ EXEC LIBRARY ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© EXEC-SHIELDÀÇ ¹æ¾î¸¦ ¿ìȸÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÏ°í ÀÖ´Ù. ±âÁ¸ ¹æ¹ýµéÀº ARGUMENT·Î »ç¿ëÇÒ °ªÀ» ÁÖ·Î STACK ¿µ¿ª¿¡¼ ÀÌ¿ëÇÏ¿´´Âµ¥ º» ¹®¼¿¡¼´Â PROGRAM MEMORY MAPPING ¿µ¿ªÀÇ °ªÀ» »ç¿ëÇÏ¿´´Ù. °á·ÐÀûÀ¸·Î ÀÌ ¹®¼¿¡¼ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ÀÌ¿ëÇÏ¸é °ø°ÝÀ» ¼öÇàÇϴµ¥ ÀÖ¾î¼ ½ÇÆÐÇϰųª ȤÀº ¿©·¯ ¹øÀ» ½ÃµµÇÏÁö ¾Ê°í Çѹø¿¡ °ø°Ý¿¡ ¼º°øÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÀÌ ¹æ¹ýÀº EXEC-SHIELD¿¡¸¸ Àû¿ëÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï¸ç ´Ù¸¥ º¸¾È ¼Ö·ç¼Ç¿¡µµ °¡´ÉÇÏ´Ù. ¸¶Áö¸·À¸·Î º» ¹®¼´Â STACK Overflow ±â¹ÝÀ» ´ë»óÀ¸·Î ½ÇÇèÇÏ¿´Áö¸¸ FRAME POINTER ¿µ¿ª°ú RETURN ADDRESSÀÇ ÁÖ¼Ò¸¦ Á¶ÀÛÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù¸é ´Ù¸¥ Á¾·ùÀÇ OVERFLOW °ø°Ý ±â¹ýÀ̳ª FORMAT STRING °ø°Ý ±â¹ý¿¡µµ Àû¿ë½Ãų¼ö ÀÖ´Ù.
1. °³¿ä, ¹®Á¦Á¡
Fedora´Â Redhat Linux¿Í ºñ½ÁÇÏÁö¸¸ ¾ö¹ÐÈ÷ µûÁö¸é ´Ù¸¥ Á¾·ùÀÇ Linux¶ó°í ÇÒ ¼ö ÀÖ´Ù. Fedora´Â RedhatÀÌ ÈÄ¿øÇÏ°í Ä¿¹Â´ÏƼ ¹æ½ÄÀ¸·Î À¯ÁöÇØ ³ª°¡´Â ¿ÀÇ ¼Ò½º ÇÁ·ÎÁ§Æ®ÀÌ´Ù. ±×·¡¼ ±âÁ¸ÀÇ Redhat Linux¿Í´Â Â÷ÀÌÁ¡ÀÌ Á¸ÀçÇϴµ¥ ÇØÄ¿ÀÇ ÀÔÀå¿¡¼ º¸¾ÒÀ» ¶§ °¡Àå Å©°Ô ¹Ù²ï Á¡Àº exec-shieldÀÇ Àû¿ëÀÌ´Ù. exec-shield´Â Ä¿³Î ±â¹ÝÀÇ º¸¾È ¼Ö·ç¼ÇÀ¸·Î½á Overflow³ª Format String °ø°Ý ±â¹ýÀ» ÀÌ¿ëÇÏ¿© ÇØÄ¿°¡ ¾ÇÀÇÀûÀÎ ÇàÀ§¸¦ ÇÒ¼ö ¾øµµ·Ï ¹æ¾îÇÑ´Ù. exec-shield´Â ÁÖ·Î ÇÁ·Î¼¼½º ¸Þ¸ð¸®¿¡ °ü·ÃµÈ º¸¾È MechanismÀ» ¼öÇàÇÑ´Ù. ½ÇÁ¦·Î, exec-shieldÀÇ Àû¿ëÀ¸·Î ÀÎÇØ ÇØÄ¿µéÀº Fedora¿¡¼ Overflow Attack³ª Format String Attack °°Àº ±â¹ýÀ» ¼º°øÇϱⰡ Èûµé¾îÁ³´Ù. ±âÁ¸ÀÇ Linux ȯ°æ¿¡¼´Â ¾ø¾ú´ø Á¦¾àµéÀÌ, exec-shield¿¡ Á¸ÀçÇϱ⠶§¹®ÀÌ´Ù. Fedora¿¡¼ Overflow °ø°ÝÀ» ¼º°øÇϱⰡ ¾ÆÁÖ ºÒ°¡´ÉÇß´ø °ÍÀº ¾Æ´Ï¾úÀ¸³ª ´ëºÎºÐÀÇ °ø°Ý ±â¹ýµéÀÌ Á¦ÇÑµÈ »óȲ¿¡¼¸¸ °¡´ÉÇÏ¿´´Ù. Áï °ø°Ý¿¡ ¼º°øÇϱⰡ ³Ê¹« Èûµé¾ú¾ú´Ù. ¿¹¸¦ µé¾î ÇØÄ¿´Â °ø°ÝÀ» ¼öÇàÇÒ ¶§ ÀÌ¿ëÇÒ ¸Þ¸ð¸®ÀÇ ÁÖ¼ÒµéÀ» brute force µîÀ» ÅëÇØ ¾ò¾î³»¾ß¸¸ ÇÏ´Â °æ¿ìµµ ÀÖ¾ú´Ù. ¿©±â¼ ¼Ò°³ÇÏ´Â ¹æ¹ý ¿ª½Ã ¾ÆÁÖ ¿Ïº®ÇÑ ¹æ¹ýÀº ¾Æ´Ï´Ù. ÀÌ ¹®¼´Â, ÇØÄ¿°¡ ÀÌ¿ëÇÏ°íÀÚ ÇÏ´Â ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ¾Ë¾Æ³»±â À§ÇÏ¿© brute force µîÀ» ÇÒ ÇÊ¿ä ¾øÀÌ ÇÑ ¹ø¿¡ °ø°Ý¿¡ ¼º°øÇÏ´Â ±â¹ý¿¡ ´ëÇÑ ¼³¸íÀ» ¸ñÀûÀ¸·Î ÇÏ¿´´Ù. ±×·¯³ª ÀÌ ¹æ¹ýÀº LOCAL ȯ°æ¿¡¼¸¸ °¡´ÉÇÏ°í REMOTE ȯ°æ¿¡¼´Â Àû¿ëµÇÁö ¾Ê´Â´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ¶ÇÇÑ ÀÌ ¹®¼´Â ÀϹÝÀûÀÎ Stack Overflow °ø°Ý ±â¹ýÀ» ¼³¸í ÇÒ °ÍÀÌÁö¸¸, ¼³¸íÇÏ´Â ¹æ¹ý·ÐÀ» ÀÀ¿ëÇÑ´Ù¸é ´Ù¸¥ Á¾·ùÀÇ Overflow ±â¹ýÀ̳ª Format String¿¡µµ Àû¿ë °¡´ÉÇÒ ¼ö ÀÖ´Ù. ¸ÕÀú, ±âÁ¸ÀÇ Redhat Linux¿Í Fedora´Â ¾î¶² Â÷ÀÌÁ¡ÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¸°Ú´Ù. ¿©±â¼´Â Redhat Linux 9.0 ¹öÀüÀ» ´ë»óÀ¸·Î Å×½ºÆ®ÇÏ¿´´Ù. LIBRARY¿Í STACK¿¡¼ °¡Àå ¸¹Àº Â÷ÀÌÁ¡ÀÌ ÀÖ¾ú´Ù. PROGRAM TEXT SEGMENT ¿µ¿ª°ú PROGRAM DATA SEGMENT ¿µ¿ªÀ» Ãß°¡ÀûÀ¸·Î ¼³¸íÇÏ¿´´Âµ¥ ±× ÀÌÀ¯´Â ÀÌ ¹®¼¿¡¼ »ç¿ëÇÏ´Â ±â¹ýÀÌ ÀÌ ¿µ¿ªµé°úµµ °ü·ÃÀÌ µÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½ Ç¥´Â ±âÁ¸ÀÇ Redhat Linux¿Í FedoraÀÇ Â÷À̸¦ Á¤¸®ÇÑ °ÍÀÌ´Ù. ¸Þ¸ð¸® ¸ÅÇÎÀº ÇÁ·Î±×·¥ÀÇ Å©±â³ª Á¾·ù¿¡ µû¶ó ´Þ¶óÁú¼ö Àִµ¥ ¿©±â¼´Â ¾Æ·¡ÀÇ test.c¿Í °°ÀÌ ±âº»ÀûÀÎ ÇÁ·Î±×·¥À» ´ë»óÀ¸·Î ¾Ë¾Æº¸¾Ò´Ù.
--test.c-- int main(int argc, char *argv[])
- ÇÁ·Î¼¼½º ¸Þ¸ð¸® ¸ÅÇÎ ±¸¼º Ç¥ -
- ÁÖ¿ä Ư¡ Ç¥ -
(ÀÌ¿Ü¿¡µµ ¿©·¯ Â÷ÀÌÁ¡ÀÌ ´õ ÀÖÀ¸³ª ÀÌ ¹®¼¿¡¼´Â ÀÌ ¹®¼¿¡¼ Á¦½ÃÇÏ´Â ÇØÅ· ¹æ¹ý·Ð¿¡ °ü·ÃµÈ °Íµé¸¸ ´Ù·çµµ·Ï ÇÏ°Ú´Ù.) ´ÙÀ½Àº °¢ OSÀÇ /proc/PROCESS_ID/maps ÆÄÀÏÀ» Ãâ·ÂÇÑ °ÍÀÌ´Ù. (FedoraÀÇ °æ¿ì¿¡´Â ½ÇÇà½Ã¸¶´Ù ´Ù¸¥ °á°ú°¡ ³ª¿Ã¼öµµ ÀÖ´Ù.)
- Redhat Linux 9.0 -
- Fedora Core2 -
ÀÌ Áß¿¡¼ Fedora¿¡¼ ´Þ¶óÁø °¢ ¿µ¿ª¿¡ ´ëÇÑ ºÎ°¡ ¼³¸íÀ» ÇÏ°Ú´Ù. - Stack Fedora ¿î¿µÃ¼Á¦ÀÇ StackÀº Random StackÀ̶ó´Â °Í ÀÌ¿Ü¿¡, 2 °¡Áö »çÇ×ÀÌ ´õ Ãß°¡µÇ¾ú´Ù. (1) ±âÁ¸ÀÇ Redhat Linux¿Í ´Ù¸¥ ÁÖ¼Ò ¹üÀ§¸¦ »ç¿ëÇÏ°í ÀÖ°í, (2) Stack ¿µ¿ª¿¡¼ÀÇ ½ÇÇàÀÌ ±ÝÁöµÇ¾ú´Ù. ÁÖ¼Ò ¹üÀ§°¡ ´Ù¸£´Ù´Â °ÍÀº ÇØÄ¿¿¡°Ô Å« ºÒ¸®ÇÔÀÌ µÇÁö ¾Ê´Â´Ù. ÀÌÀ¯´Â Library ¿µ¿ªÃ³·³ ¸Þ¸ð¸®ÀÇ 16mb ¹Ì¸¸ ÁÖ¼Ò¿¡ StackÀÌ ¸ÅÇεǾî ÀÖ´Ù¸é Null ¹®ÀÚ ÀÔ·Â ºÒ°¡ µîÀÇ Á¦¾àÀ¸·Î ÀÎÇØ ºÒ¸®ÇÒ¼öµµ ÀÖÁö¸¸, ±×·¸Áö ¾Ê±â ¶§¹®¿¡ Á¤»óÀûÀ¸·Î µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÏ´Â °ÍÀº ºÒÆíÇÔÀÌ ¾ø´Â À§Ä¡ÀÌ´Ù. ±×·¯³ª Random StackÀº ÇØÄ¿¿¡°Ô ¹®Á¦°¡ µÇ´Â ºÎºÐÀÌ´Ù. Stack ¿µ¿ª¿¡¼ µ¥ÀÌÅ͸¦ ÂüÁ¶ÇÏ·ÁÇÒ ¶§³ª ÇØÄ¿°¡ ¿Ã·Á ³õÀº ÄÚµåÀÇ À§Ä¡¸¦ ã´Âµ¥ ¾î·Æ±â ¶§¹®ÀÌ´Ù. ¶ÇÇÑ ´õ Å« ¹®Á¦´Â ¼³·É ÄÚµåÀÇ À§Ä¡¸¦ ã¾Ò´Ù°í ÇÏ´õ¶óµµ ½ÇÇà ¼Ó¼ºÀÌ ºÎ¿©µÇ¾î ÀÖÁö ¾ÊÀº ¿µ¿ªÀ̱⠶§¹®¿¡ ½ÇÇàÀ» ÇÒ¼ö°¡ ¾ø´Ù. ±×·¸Áö¸¸, read³ª write´Â °¡´ÉÇϱ⠶§¹®¿¡ Á¤È®ÇÑ À§Ä¡¸¸ ¾Ë°í ÀÖ´Ù¸é µ¥ÀÌÅÍÀÇ Àб⳪ ÂüÁ¶´Â °¡´ÉÇÏ´Ù. - Library Library ¿µ¿ªÀÇ Random MappingÀÇ °æ¿ì¿£ Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù. (Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ - PROGRAM TEXT SEGMENT Program Segment¿¡¼ TEXT ¿µ¿ªÀº ÇÁ·Î±×·¥ÀÇ ½ÇÇà °¡´ÉÇÑ Äڵ带 MappingÇÑ ¿µ¿ªÀ» ¸»ÇÑ´Ù. ´ç¿¬È÷ ÀÌ ¿µ¿ªÀº ÇÁ·Î±×·¥ÀÌ ±¸µ¿µÉ¶§ ÂüÁ¶ÇÏ°í ¶Ç ½ÇÇàµÇ¾î¾ßÇÒ ¿µ¿ªÀ̱⠶§¹®¿¡ ½ÇÇà ¼Ó¼ºÀÌ Æ÷ÇÔµÈ »óÅÂÀÌ´Ù. - PROGRAM DATA SEGMENT ÀÌ ¿µ¿ªÀº DATA SegmentÀÌ´Ù. ÀÌ ¿µ¿ªÀº ºñ·Ï ½ÇÇà ±ÇÇÑÀº ¾øÁö¸¸ read ȤÀº write°¡ °¡´ÉÇÏ´Ù. Áï, ÀÌ ¸Þ¸ð¸® ¿µ¿ªÀº ÇØÄ¿°¡ ÂüÁ¶Çϱâ À§ÇØ Àаųª ¾Æ´Ï¸é »õ·Î¿î ³»¿ëÀ¸·Î µ¤¾î¾º¿ì´Â °ÍÀÌ °¡´ÉÇÏ´Ù´Â À̾߱âÀÌ´Ù.
°³¿ä¿¡¼ ´Ù·é ³»¿ëÀ» °á·Ð ÁþÀÚ¸é FedoraÀÇ exec-shield´Â ÇØÄ¿°¡ Overflow °ø°ÝÀ» ¼º°øÇϱ⿡ »ó´çÈ÷ ±î´Ù·Î¿î Á¶°ÇÀ̶ó ÇÒ ¼ö ÀÖ´Ù. °ø°³µÈ Overflow °ø°Ý ±â¹ýµéÀº ´ëºÎºÐ ¸ÔÈ÷Áö ¾Ê´Â´Ù. ¸î °¡Áö ¿¹¸¦ µé¾îº¸°Ú´Ù. (¼³¸í¿¡ ÇÊ¿äÇÑ ±âÃÊ Áö½ÄÀº ¾î´À Á¤µµ »ý·«ÇÏ¿´´Ù.)
(1) ¿©·¯ °³ÀÇ Library¸¦ µ¿½Ã¿¡ »ç¿ëÇÏ¿© °ø°ÝÇÏ´Â ¹æ¹ý °ø°Ý ÄÚµåÀÇ ¸¶Áö¸·¿¡ Library ÇÔ¼ö ÁÖ¼Ò¸¦ ³Ö´Â °ÍÀº ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ±×·¯³ª ¿©·¯ ÇÔ¼ö¸¦ µ¿½Ã¿¡ »ç¿ëÇÏ¿© °ø°ÝÇÒ ¶§´Â ¹®Á¦°¡ µÇ´Âµ¥, ÇÔ¼öÀÇ ÁÖ¼Ò¿¡ Æ÷ÇԵǾî ÀÖ´Â NULL byte°¡ ¹®Á¦ ¶§¹®ÀÌ´Ù. ¹®Á¦°¡ µÇ´Â °æ¿ì¸¦ ¼³¸íÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº µÎ ÇÔ¼ö¸¦ ¿¹·Î µé°Ú´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â ÇØÄ¿°¡ °ø°ÝÇÒ ¶§ »ç¿ëÇÏ·Á ÇÏ´Â ÇÔ¼öµéÀÌ¶ó °¡Á¤ÇÑ´Ù. À§¿Í °°ÀÌ ÀÔ·Â ÇؾßÇϴµ¥ Áß°£¿¡ \x00 (NULL byte)°¡ Æ÷ÇԵǾîÀֱ⠶§¹®¿¡ ÀÔ·ÂÀÌ ¿Ï¼ºµÇÁö ¾Ê´Â´Ù. ±×·¯³ª 16mb ¹Ì¸¸ÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ °®´Â À§Ä¡¶ó Çصµ ÇÔ¼ö¸¦ ¸¶Áö¸·¿¡ Çѹø¸¸ »ç¿ëÇÒ °æ¿ì¿¡´Â ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ´ÙÀ½ÀÇ °æ¿ì¿¡´Â ¹®Á¦°¡ ¾ø´Ù.
(À̶§ ¸¶Áö¸· ¹ÙÀÌÆ®´Â ÀÔ·ÂÀ» »ý·«Çصµ »ó°ü¾ø´Ù.) (2) Stack ¿µ¿ªÀ» ½ÇÇàÇÏ´Â ¹æ¹ý Stack ¿µ¿ªÀÇ ¸Þ¸ð¸®´Â Äڵ带 ½ÇÇàÇÏÁö ¸øÇϱ⠶§¹®¿¡ ¿©·¯ Á¦¾à »çÇ×ÀÌ ¸¹´Ù. ½ÇÇàÀÌ ¾Æ´Ï¶ó ´Ü¼øÈ÷ ÂüÁ¶¸¦ À§ÇÑ ÀÛ¾÷µµ ¿ì¸®°¡ ¿øÇÏ´Â µ¥ÀÌÅÍÀÇ ¸Þ¸ð¸® À§Ä¡¸¦ Á¤È®È÷ ¾Ë¾Æ¾ß Çϱ⠶§¹®¿¡ brute force°¡ ÇÊ¿äÇÒ ¶§µµ ÀÖ´Ù. (3) ÇϳªÀÇ Library ÇÔ¼ö¸¸ ÀÌ¿ëÇÏ´Â ¹æ¹ý °¡²û ¾î¶² Library ÇÔ¼öÀÇ °æ¿ì¿¡´Â ¿©·¯ °³ÀÇ ÇÔ¼ö È£Ãâ ÀÛ¾÷ ¾øÀÌ, ´Ü Çϳª¸¸ÀÇ »ç¿ëÀ¸·Îµµ SHELLÀ» ȹµæÇÒ ¼ö ÀÖ´Â °æ¿ìµµ Àִµ¥, ÀÌ °æ¿ì ÇÔ¼öÀÇ ¸Å°³ º¯¼ö¸¦ ÁöÁ¤Çϱâ À§ÇØ º¸Åë Stack ¿µ¿ªÀ» »ç¿ëÇÑ´Ù. ±×·¯³ª Stack ¿µ¿ªÀº RandomÈ µÇ°í, ¶Ç RandomÈ µÇ´Â ¿µ¿ªÀÌ Å©±â ¶§¹®¿¡ ¸Å°³ º¯¼öÀÇ À§Ä¡¸¦ Á¤È®È÷ ã±â°¡ Èûµé´Ù.
2. ¹æ¹ý·Ð
¸ÕÀú, °³¿äÀÇ °á·ÐµéÀ» Á¤¸®Çغ¸ÀÚ¸é ÇØÄ¿´Â °ø°Ý ½Ã, return address¿¡¼ óÀ½À¸·Î À̵¿ÇÒ Àå¼Ò·Î StackÀ» ¼±ÅÃÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇÏ¸é ½ÇÇà ¼Ó¼ºÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. °á±¹ óÀ½ ÀÌ¿ëÇؾßÇÒ Àå¼Ò´Â Library ¿µ¿ªÀ̾î¾ß ÇÑ´Ù. ³ªÁß¿¡ ´Ù½Ã Stack ¿µ¿ªÀ» ÀÌ¿ëÇÏµç ´Ù¸¥ ¿µ¿ªÀ» ÀÌ¿ëÇϵç óÀ½¿¡´Â ¹Ýµå½Ã ½ÇÇà °¡´ÉÇÑ Àå¼ÒÀÎ Library ¿µ¿ªÀ̾î¾ß ÇÑ´Ù. (ȤÀº Program Text ¿µ¿ªÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ°ÚÁö¸¸ ÀÌ ¹®¼´Â Library ¿µ¿ªÀ» ´ë»óÀ¸·Î ¼³¸íÇÑ´Ù.) ¿©±â¼´Â Overflow °ø°ÝÀ» ÇÒ¶§ °¡Àå À¯¿ëÇÑ ÇÔ¼ö Áß¿¡ ÇϳªÀÎ execl() ÇÔ¼ö¸¦ ÀÌ¿ëÇÒ °ÍÀÌ´Ù. (execl ÇÔ¼ö´Â ³»ºÎÀûÀ¸·Î execve() system callÀ» È£ÃâÇÑ´Ù.) execl()ÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù. int execl( const char *path, const char *arg, ...); ¸ÕÀú, execl¿¡ ´ëÇÑ °ø°Ý¹ýÀ» Á¤È®ÇÏ°Ô ¼÷ÁöÇϱ⠹ٶõ´Ù. ÀÌ ¹æ¹ýÀº vangelis´Ô°ú loafers´ÔÀÌ ¾²½Å ±Û¿¡ »ó¼¼È÷ ¼³¸í µÇ¾î ÀÖ´Ù. ±×·¯³ª ±âÁ¸ÀÇ execl()À» »ç¿ëÇÑ ¹æ¹ýÀº ±âÁ¸ÀÇ Redhat Linux¿¡¼´Â º° ¹®Á¦ ¾øÀÌ Àû¿ëµÉ¼ö ÀÖÀ¸³ª Fedora ¿î¿µÃ¼Á¦¿¡ Àû¿ëÇϱâ´Â ¹®Á¦°¡ ÀÖ´Ù. ¿Ö³ÄÇÏ¸é ±âÁ¸ÀÇ execl() ÇÔ¼ö¿¡¼ »ç¿ëÇÏ´Â argument´Â Stack ¿µ¿ªÀÇ µ¥ÀÌÅ͸¦ ÂüÁ¶Çϴµ¥ FedoraÀÇ StackÀº RandomÇÏ°Ô MappingµÇ±â ¶§¹®ÀÌ´Ù. ¸¸¾à, ƯÁ¤ µ¥ÀÌÅÍ¿¡ ´ëÇÑ ÂüÁ¶°¡ ¾Æ´Ï¶ó ½ÇÇàÀ» Çϱâ À§Çؼ¶ó¸é NOP Äڵ带 ¸¹ÀÌ »ç¿ëÇÏ¿© À§Ä¡¸¦ ãÀ» È®·üÀ» ³ôÀÌ¸é µÇ°ÚÁö¸¸, ÀÌ °æ¿ì´Â ½ÇÇàÀÌ ¾Æ´Ï¶ó ÂüÁ¶À̱⠶§¹®¿¡, »ç¿ëÇÏ°íÀÚ ÇÏ´Â ¿µ¿ªÀ» Á¤È®ÇÏ°Ô ¾Ë°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù. ±×·¸±â ¶§¹®¿¡ °ø°ÝÀ» ÇÑ ¹ø¿¡ ¼º°øÇϱâ À§Çؼ´Â Stack°ú °°ÀÌ RandomÇÏ°Ô MappingµÇ´Â ¿µ¿ªÀÌ ¾Æ´Ï¶ó °íÁ¤µÈ °ªÀ» °®´Â ¿µ¿ªÀ» ÀÌ¿ëÇØ¾ß ÇÑ´Ù. ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¿¡´Â ´Ù¾çÇÑ ¿µ¿ª°ú °ªµéÀÌ Á¸ÀçÇÏÁö¸¸ ÀÌ ¸ðµç °ÍµéÀÌ ÇØÄ¿¿¡°Ô ÀÌ¿ëµÉ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ¸Å°³ º¯¼ö¿¡ »ç¿ëÇϱâ À§Çؼ´Â ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇØ¾ß ÇÑ´Ù. (1) execl() ÇÔ¼öÀÇ ¸Å°³ º¯¼ö Çü½Ä¿¡ ¸Â´Â °ªÀ̾î¾ß ÇÔ execl() ÇÔ¼ö ¿øÇü¿¡¼ º¸¾ÒµíÀÌ °ø°Ý ½Ã¿¡´Â ´ÙÀ½ÀÇ ¿¹¿Í °°ÀÌ ÃÖ¼ÒÇÑ 3°³ ÀÌ»óÀÇ ÀÎÀÚ¸¦ °¡Á®¾ß ÇÑ´Ù. ex) execl("/bin/sh", "sh", NULL); Áï, ¸Þ¸ð¸®¿¡ À§Ä¡ÇÏ´Â ÃÖ¼Ò 12 byteÀÇ ¿¬¼ÓµÈ µ¥ÀÌÅ͵é Áß¿¡, ù¹ø° 4¹ÙÀÌÆ®´Â ƯÁ¤ ¹®ÀÚ¿À» °¡¸®Å°°í ÀÖ´Â Æ÷ÀÎÅÍ¿©¾ßÇϸç, µÎ¹ø° ¿ª½Ã ¸¶Âù°¡Áö´Ù. ¼¼¹ø° °ªÀº 0x00000000 Áï, NULL °ªÀ̾î¾ß ÇÑ´Ù. ²À À§¿Í ¶È°°Àº °æ¿ìÀÇ 12 byte ¿µ¿ªÀ» ãÀ» ÇÊ¿ä´Â ¾ø´Ù. Áï, execl() ÇÔ¼ö´Â ÃÖ¼ÒÇÑÀÇ ¸Å°³ º¯¼ö·Î 3°³¸¦ ¿ä±¸ÇÏ´Â °ÍÀÌ°í ±× ÀÌ»óÀº °¡º¯ÀûÀ̱⠶§¹®¿¡ ¸Å°³ º¯¼ö°¡ 4°³, 5°³ ÀÌ»óÀ̾ °¡´ÉÇÏ´Ù. ±×·¯³ª ¸¸¾à Á¶°ÇÀÌ Çϳª¶óµµ ¸ÂÁö ¾Ê´Â´Ù¸é Overflow µµÁß¿¡ ¿¡·¯°¡ ¹ß»ýµÉ °ÍÀÌ´Ù. (2) ½ÇÁ¦ ¸Þ¸ð¸® ¿µ¿ª »ó¿¡ Á¸ÀçÇÏ´Â °ªÀ̾î¾ß ÇÔ ¿¹¸¦ µé¾î 1, 2¹ø° ¸Å°³ º¯¼ö´Â ƯÁ¤ ¹®ÀÚ¿ÀÌ ´ã°ÜÀÖ´Â ÁÖ¼Ò¸¦ °®°í ÀÖ¾î¾ß Çϴµ¥ ¸Å°³ º¯¼ö¿¡ ¾²ÀÏ °¢ ÁÖ¼ÒµéÀÌ °®°í ÀÖ´Â °ªÀÌ ÇÁ·Î¼¼½º ¸Þ¸ð¸® »ó¿¡ ·ÎµùµÈ ¿µ¿ªÀÌ ¾Æ´Ï¶ó¸é, Á¸ÀçÇÏÁö ¾Ê´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ÂüÁ¶Çϱ⠶§¹®¿¡ Segment fault°¡ ÀϾ °ÍÀÌ´Ù. (3) ¸Þ¸ð¸® ±ÇÇÑ¿¡ write°¡ Çã¿ëÀÌ µÇ¾î¾ß ÇÔ execl()ÀÌ ¿ÏÀüÈ÷ ½ÇÇàµÇ±â À§Çؼ´Â ¸¹Àº ¾î¼Àºí¸®¾î ¸í·ÉÀ» °ÅÃÄ¾ß ÇÑ´Ù. À̶§ ¿ì¸®°¡ ÀǵµÇÏÁö ¾ÊÀº °®°¡Áö ¿¬»êÀÌ ½ÇÇàµÉ ¼ö Àִµ¥, ±×Áß¿¡´Â ¿ì¸®°¡ ÁöÁ¤ÇÑ ¿µ¿ª¿¡ »õ·Î¿î °ªÀ» µ¤¾î¾º¿ì´Â ¿¬»êÀ» ÇÒ¶§µµ ÀÖ´Ù. À̶§ ¸¸¾à write°¡ Çã¿ëµÇÁö ¾Ê´Â ¸Þ¸ð¸® ¿µ¿ªÀ̶ó¸é Segment fault°¡ ÀϾ¸ç °ø°ÝÀº ½ÇÆÐÇÒ °ÍÀÌ´Ù. (4) °íÁ¤µÈ ¿µ¿ªÀ̾î¾ß ÇÔ ¿ì¸®ÀÇ ¸ñÀûÀº Brute forceÀ» ÅëÇؼ ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ã´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÑ ¹ø¿¡ ¼º°øÇÏ±æ ¿øÇϹǷΠStack°ú °°ÀÌ RandomÇÏ°Ô MappingµÇ´Â Àå¼Ò´Â »ç¿ëÇÏÁö ¸»¾Æ¾ßÇÑ´Ù. (5) ¸Þ¸ð¸® ÁÖ¼ÒÀÇ À§Ä¡°¡ 16mb ÀÌ»óÀ̾î¾ß ÇÔ 16mb ÀÌÇÏÀÏ °æ¿ì, °ø°Ý ½Ã ÁÖ¼Ò °ªÀ» ÀÔ·ÂÇÒ ¶§ ÃÖ»óÀ§ ¹ÙÀÌÆ®°¡ NULL byte°¡ Æ÷ÇԵDZ⠶§¹®¿¡ °ø°ÝÀÌ ½ÇÆÐÇÒ ¼ö ÀÖ´Ù. Áï, ÀÌ ¸»Àº ¸Å°³ º¯¼ö·Î Library ¿µ¿ªÀ» ÁöÁ¤ÇÒ ¼ö ¾ø´Ù´Â À̾߱âÀÌ´Ù. À§ÀÇ 5°¡Áö Á¶°ÇÀº ºÐ¸íÈ÷ ½¬¿î Á¶°ÇÀº ¾Æ´Ï´Ù. ±×·¯³ª ÀÌ Á¶°ÇµéÀ» ¸¸Á·ÇÏ´Â ¿µ¿ªÀÌ Fedora¿¡¼ Á¸ÀçÇϴµ¥ ¹Ù·Î PROGRAM DATA SEGMENT ¿µ¿ªÀÌ´Ù. ÀÌ ¿µ¿ªÀº ¸ÅÇεǴ À§Ä¡°¡ Ç×»ó °íÁ¤µÇ¾îÀÖ°í ¶ÇÇÑ ÇÁ·Î¼¼½º°¡ Àç½ÇÇàµÇ¾îµµ ÇÁ·Î¼¼½º ¸Þ¸ð¸® ¾È¿¡ ´ã±â°Ô µÉ °ªÀº °íÁ¤µÇ¾îÀÖ´Ù. ±×¸®°í read¿Í write°¡ Çã¿ëµÈ´Ù. execl() ÇÔ¼ö¿¡ »ç¿ëÇÒ¸¸ÇÑ ¸Å°³ º¯¼öµµ Á¸ÀçÇÏ°í ÀÖ´Ù. (DATA SEGMENT ¿µ¿ª¿¡ ´ã±ä °ªµéÀº ½Ã½ºÅÛ È¯°æ¿¡ µû¶ó¼, ȤÀº ÇÁ·Î±×·¥¿¡ µû¶ó¼ ´Þ¶óÁú ¼ö ÀÖ´Ù. ÇÊÀÚ´Â º»ÀÎÀÇ ¼¹ö¿¡¼¸¸ Å×½ºÆ®¸¦ Çغ¸¾Ò±â ¶§¹®¿¡ ´Ù¸¥ ¼¹öÀÇ °á°ú´Â ¸ð¸£°Ú´Ù. ±×·¯³ª ´Ù¸¥ ¼¹ö¿Í ÇÁ·Î±×·¥ÀÇ È¯°æ¿¡¼µµ ¿ì¸®°¡ ÇÊ¿äÇÑ ¿µ¿ªÀÇ °ªµéÀ» ÃæºÐÈ÷ ãÀ»¼ö ÀÖÀ» °Å¶ó°í »ý°¢µÈ´Ù.) °á·ÐÀûÀ¸·Î, ¿ì¸®´Â execl() ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¶§ »ç¿ëÇÒ ¸Å°³ º¯¼ö¸¦ DATA SEGMENT ¿µ¿ª¿¡ Á¸ÀçÇÏ´Â °ªÀ¸·Î ÀÌ¿ëÇÒ °ÍÀÌ°í ÀÌ·¯ÇÑ ¹æ¹ýÀ» ÀÌ¿ëÇÏ¸é ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ã±â À§Çؼ ÇÏ´Â brute force °úÁ¤ ¾øÀÌ °ø°Ý¿¡ ¼º°øÇÒ ¼ö ÀÖ´Ù.
3. ½ÇÁ¦ °ø°Ý °úÁ¤
2. ¹æ¹ý·Ð¿¡¼ ´Ù·é °ÍÀ» °£´ÜÇÏ°Ô ´Ù½Ã Á¤¸®ÇÏÀÚ¸é execl() ÇÔ¼ö¸¦ »ç¿ëÇϵÇ, ÇÔ¼öÀÇ ¸Å°³ º¯¼ö·Î ÀÌ¿ëÇÒ ¿µ¿ªÀº PROGRAM DATA SEGMENT ¸Þ¸ð¸® ¿µ¿ªÀÌ´Ù. ¿©±â¼ Å×½ºÆ®ÇÏ°Ô µÉ Ãë¾à ÇÁ·Î±×·¥ÀÇ ¼Ò½º´Â ´ÙÀ½°ú °°´Ù. 4byte Å©±âÀÇ buffer¿¡ 12byte¸¦ µ¤¾î¾º¿ï ¼ö Àֱ⠶§¹®¿¡ ÇØÄ¿°¡ µ¤¾î¾º¿ï ¼ö ÀÖ´Â ¿µ¿ªÀº main() ÇÔ¼öÀÇ [RET] (return address) ±îÁöÀÌ´Ù.
-- vul.c -- #include <stdio.h> int main(int argc, char *argv[]) char buf[4]; }
Fedora¿¡¼ÀÇ PROGRAM DATA SEGMENT ¸Þ¸ð¸® ¿µ¿ª¿¡ ´ëÇؼ ´Ù½Ã Çѹø ¾Ë¾Æº¸°Ú´Ù. [beist@localhost bof]$ cat /proc/PROCESS-ID/maps ÀÌ Áß¿¡¼ PROGRAM DATA SEGMENT ¸Þ¸ð¸® ¿µ¿ªÀÇ ¹üÀ§´Â 0x8049000~0x804a000 ÀÌ´Ù. È®ÀÎÇÑ ¹Ù¿Í °°ÀÌ ÀÌ ¿µ¿ª¿¡¼´Â read¿Í write°¡ Çã¿ëµÈ »óÅÂÀÌ´Ù. ¿ì¸®°¡ »ç¿ëÇÒ execl() ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ È®ÀÎÇغ¸°Ú´Ù. (gdb) disassemble execl ¿ì¸®°¡ »ç¿ëÇÒ ¿µ¿ªÀº 0x004b8a03 ¿µ¿ª(execl+3)ºÎÅÍÀÌ´Ù. ¾ÕÀÇ push %ebp¿Í mov %esp, %ebp °úÁ¤À» »ý·«ÇÏ´Â ÀÌÀ¯´Â ¸¸¾à ÀÌ ¿µ¿ªÀÇ ¸í·É¾îµéÀ» ½ÇÇà½ÃÅ°°Ô µÈ´Ù¸é ¿ì¸®°¡ ÀÔ·ÂÇÑ %ebpÀÇ °ªÀÌ ¼Õ»óµÇ±â ¶§¹®ÀÌ´Ù. ¿ì¸®ÀÇ ebp¸¦ º¸È£Çϱâ À§Çؼ ROCEDURE ÀÇ ÇÁ·Ñ·Î±×, Áï execl+0, +1 °úÁ¤À» °Ç³Ê¶Ù¾î¾ßÇÑ´Ù. RETURN ADDRESS·Î ÁöÁ¤ÇÒ ÁÖ¼Ò´Â 0x004b8a03ÀÌ´Ù. ÀÌÁ¦ ¿ì¸®°¡ »ç¿ëÇÒ Àû´çÇÑ ¸Å°³ º¯¼öµéÀ» ã¾ÆºÁ¾ßÇÑ´Ù. (gdb) x/20x 0x8049000 ¸Å°³ º¯¼ö¿¡ ¾²À̱â Àû´çÇÑ ¸Þ¸ð¸® ÁÖ¼ÒÀÌ´Ù. 0x8049564, 0x8049568, 0x804956c ¿µ¿ªÀÌ ¹Ù·Î ±× ¿µ¿ªÀÌ µÇ¸ç, °¢°¢ execl() ÇÔ¼ö È£Ã⠽à ù¹ø°, µÎ¹ø°, ¼¼¹ø° ¸Å°³ º¯¼ö·Î µé¾î°¡°Ô µÈ´Ù. Áï, execl(0x8049564, 0x8049568, 0x804956c, °¡ µÈ´Ù. (¿©±â¼´Â ¸¶Áö¸· NULLÀ» »ý·«½ÃÄ×´Ù.) °¢ ÁÖ¼Ò¿¡ ´ã±ä ³»¿ëÀ» È®ÀÎÇغ¸°Ú´Ù.
- 0x8049564 (0x4469f0) - (gdb) x/7x 0x4469f0 0x4469f0¿¡ ´ã±ä µ¥ÀÌÅÍÀÇ ±æÀÌ´Â 25¹ÙÀÌÆ®°¡ µÈ´Ù. (ÀÌ°÷¿¡¼ »ç¿ëµÈ __libc_start_mainÀº Ưº°ÇÑ Àǹ̰¡ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, ±×Àú ÀÌ ¿µ¿ª¿¡ ¿ì¸®°¡ ¾µ¸¸ÇÑ Àû´çÇÑ °ªÀÌ Æ÷ÇԵǾî ÀÖ¾úÀ» »ÓÀÌ´Ù.) - 0x8049568 (0x80482ba) - (gdb) x/x 0x80482ba ÀÌ ¿µ¿ªÀº ¿ì¸®°¡ ½ÇÇàÇÒ (link ÆÄÀÏ) ÇÁ·Î¼¼½ºÀÇ argv[0]·Î µé¾î°¥ °ªÀ¸·Î, Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù. filename°ú argv[0]Àº ºñ½ÁÇغ¸ÀÌÁö¸¸ ´Ù¸£´Ù. argv[0]Àº Çü½ÄÀûÀÎ °ÍÀÌ¸ç ½ÇÇàµÇ´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ÇÁ·Î±×·¥ À̸§Àº ½ºÅÃÀÇ ¸¶Áö¸· ºÎºÐ Âë¿¡ À§Ä¡ÇØÀÖ´Ù. - 0x804956c (0x00000000) - ÀÌ ¿µ¿ªÀº NULLÀÌ´Ù.
0x4469f0¿¡ µé¾îÀÖ´Â 25¹ÙÀÌÆ® ±æÀÌÀÇ µ¥ÀÌÅÍ´Â execl() ÇÔ¼ö È£Ãâ½Ã¿¡ »ç¿ëÇÒ ½ÇÁ¦ ÆÄÀÏ À̸§ÀÌ´Ù. ±×·¸±â ¶§¹®¿¡ ÀÌ µ¥ÀÌÅÍ °ªÀ¸·Î ½Éº¼¸¯ ¸µÅ©¸¦ °É¾îµÎ¾î¾ß ÇÑ´Ù. (½Éº¼¸¯ ¸µÅ© ÆÄÀÏÀ» »ý¼ºÇÏÁö ¾Ê°í ÀÌ·¯ÇÑ À̸§À» °®´Â °ø°Ý ÆÄÀÏÀ» Á÷Á¢ »ý¼ºÇصµ »ó°üÀº ¾ø´Ù. ±×·¸Áö¸¸ ¿©±â¿¡¼´Â ½Éº¼¸¯ ¸µÅ©¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÏ°Ú´Ù.) ¸ÕÀú ½Éº¼¸¯ ÆÄÀÏ·Î ¿¬°áµÉ °ø°Ý ÆÄÀÏÀ» ÀÛ¼ºÇؾßÇÑ´Ù. ÀÌ °ø°Ý ÆÄÀÏÀº setreuid µî°ú °°ÀÌ ÇÁ·Î¼¼½ºÀÇ ÇöÀç ±ÇÇÑÀ» Àç¼³Á¤ÇÏ°í SHELLÀ» ½ÇÇàÇÏ´Â ±â´ÉÀ» ¼öÇàÇÑ´Ù.
-- attack.c -- main()
execl()¿¡¼ ½ÇÇàÇÏ´Â ÆÄÀÏÀº À§ °ø°Ý ÆÄÀÏÀ» ½Éº¼¸¯ ¸µÅ©ÇÑ´Ù. [beist@localhost bof]$ ln -s /home/beist/bof/attack "`perl -e 'print \ vul ÇÁ·Î±×·¥À» °ø°Ý ½Ã¿¡ ÀÎÀÚ·Î ³Ö´Â ÄÚµå´Â ´ÙÀ½°ú °°´Ù. '[', ']' ·Î ¹ÀÎ °¢ ´ÜÀ§´Â 4¹ÙÀÌÆ®ÀÌ´Ù. [garbage] - [ù ¹ø° ¸Å°³ º¯¼ö À§Ä¡] - [execl + 3] ¾Õ¼ ¾Ë¾Æº» °Íó·³ ù ¹ø° ¸Å°³ º¯¼ö·Î »ç¿ëÇÒ °ªÀÇ À§Ä¡´Â 0x8049564 ÀÌ´Ù. ±×·¯³ª °ø°Ý ½Ã¿¡ ÀÌ À§Ä¡ÀÇ °ªÀ» ±×´ë·Î ÀÔ·ÂÇؼ´Â ¼º°øÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé execl() ÇÔ¼ö´Â execve() ÇÔ¼ö¸¦ ³»ºÎÀûÀ¸·Î È£ÃâÇÏ¿© execve system callÀ» ó¸®Çϴµ¥, execve() ÇÔ¼ö¿¡¼ ÆÄÀÏ À̸§¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Á®¿Ã¶§ ebp+8À» ÇÑ À§Ä¡¿¡¼ ¶§¹®ÀÌ´Ù. execve system call ÁøÇà ½Ã¿¡ »ç¿ëµÇ´Â °¢ ÁÖ¿ä ·¹Áö½ºÅ͵éÀÌ´Ù.
Âü°í·Î execl() -> execve()·Î ³Ñ¾î°¬À»¶§ execve() ÇÔ¼ö ³»¿¡¼ Frame PointerÀÇ °ªÀº, Áï ebp´Â ¿ì¸®°¡ ÀÔ·ÂÇÑ [ù ¹ø° ¸Å°³ º¯¼ö À§Ä¡]·Î µÈ´Ù. ±×¸®°í ¿©±â¼ +8 À§Ä¡¿¡ 0x004469f0 °ªÀÌ ³õÀδÙ. ±×·¸±â ¶§¹®¿¡ ½ÇÁ¦·Î °ø°ÝÇÒ ¶§´Â [ù ¹ø° ¸Å°³ º¯¼ö À§Ä¡]¿¡¼ -8À» ÇÑ °ªÀ¸·Î ³Ö¾î¾ß ÇÑ´Ù. ±×·¡¾ß ebp+8À» ÇÏ¿´À» ¶§ ¿ì¸®°¡ ¿øÇÏ´Â °ªÀ¸·Î ¸ÂÃçÁö±â ¶§¹®ÀÌ´Ù. Á¤¸®¸¦ ÇÏÀÚ¸é [ À§¿Í °°Àº °ø°Ý °ªÀ¸·Î, µð¹ö±ë °úÁ¤À» °ÅÃļ ½ÇÁ¦·Î execve() ÇÔ¼ö¿¡¼ÀÇ °ªÀ» °£´ÜÇÏ°Ô È®ÀÎÇغ¸°Ú´Ù. [beist@localhost bof]$ gdb vul ÀÌÁ¦ ¸¶Áö¸·À¸·Î ½ÇÁ¦ °ø°ÝÀ» ¼öÇàÇÏ¿© º¸°Ú´Ù. [beist@localhost bof]$ ls vul ¼º°øÀûÀ¸·Î root ±ÇÇÑÀÇ SHELLÀ» ¾ò¾î³ÂÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
4. ¸¶Ä¡´Â ¸»
exec-shieldÀÇ Àû¿ëÀ¸·Î ÇØÅ·¿¡ ´ëÇÑ ¹æ¾î°¡ °ß°íÇØÁø Fedora ½Ã½ºÅÛ¿¡¼ Overflow¸¦ ÇÑ ¹ø¿¡ ¼º°øÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸¾Ò´Ù. ÀÌ ¹®¼¿¡¼ ¼³¸íÇÑ ¹æ¹ýÀº ÇØÄ¿ÀÇ »óȲÀÌ Local¿¡ Á¢±ÙÇÒ ¼ö ÀÖÀ» ¶§¿¡¸¸ ÇÑÁ¤µÈ´Ù. ±×·¯³ª Remote¿¡¼ ¼º°øÇÏ´Â ¹æ¹ýµµ ±×¸® ¾î·Á¿î ÀÏÀº ¾Æ´Ò °Í °°´Ù. ÀϹÝÀûÀ¸·Î ÇØÄ¿ ÀÔÀå¿¡¼ º¸¾ÒÀ» ¶§ Overflow³ª Formatstring °°Àº ½Ã½ºÅÛ¿¡ ¹Î°¨ÇÑ °ø°ÝÀº Localº¸´Ù´Â Remote ȯ°æÀÌ ´õ ±î´Ù·Î¿î °ÍÀÌ »ç½ÇÀÌ´Ù. ¿Ö³ÄÇÏ¸é °ø°Ý¿¡ ¼º°øÇϱâ À§Çؼ´Â ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÂüÁ¶ÇؾßÇÒ ÀÏÀÌ ¸¹Àºµ¥ Remote ȯ°æ¿¡¼´Â ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ¾Ë ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¯³ª ÀÌ °æ¿ì´Â LocalÀÏ °æ¿ì¿¡¸¸ ÇØ´çµÇ´Â À̾߱âÀÌ°í Ãë¾à ÇÁ·Î±×·¥À» Remote¿¡¼ °ø°ÝÇÒ ¶§´Â ÇØ´çµÇÁö ¾Ê´Â´Ù. LocalÀÏ °æ¿ì¿¡´Â ÀϹÝÀûÀ¸·Î ÇØÄ¿ÀÇ ÇöÀç ±ÇÇÑ°ú ȹµæÇÏ°íÀÚ ÇÏ´Â ±ÇÇÑÀÌ ´Ù¸£´Ù. Áï, Ãë¾àÁ¡À» °®´Â ÇÁ·Î±×·¥¿¡ ÇÒ´çµÈ Set-UID ±ÇÇÑ°ú´Â ´Ù¸£´Ù´Â À̾߱âÀÌ´Ù. ±×·¸Áö¸¸ RemoteÀÏ °æ¿ì¿¡´Â ±×·± °æ¿ì°¡ ¾øÀÌ, ¹Ù·Î ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â ÇÁ·Î¼¼½ºÀÇ ±ÇÇÑÀ» ¾òÀ» ¼ö ÀÖ´Ù. ¸Å°³ º¯¼ö·Î »ç¿ëÇÒ ÀÎÀÚ´Â "/bin/sh"³ª ±âŸ ºñ½ÁÇÑ ±â´ÉÀ» ¼öÇàÇÏ´Â Á¤µµ¸¦ ÁöÁ¤ÇÏ¸é µÉ°Å¶ó »ý°¢ÇÑ´Ù. (¹°·Ð, ¿©·¯ °¡Áö ¿¹¿Ü »óȲÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. À§¿¡¼µµ ´Ù·ç¾ú¾úÁö¸¸, ÇØÄ¿°¡ °ø°ÝÀ» ÁøÇàÇÒ ¶§´Â ƯÁ¤ ¿µ¿ª¿¡ write¸¦ ÇÏ´Â ÀÛ¾÷ÀÌ ¼öÇàµÇ´Â ¾î¼Àºí¸®¾î Äڵ尡 ÀÖÀ» ¼öµµ Àִµ¥ ÇØ´ç ¿µ¿ª¿¡ write ¼Ó¼ºÀÌ ÇÒ´çµÇ¾î ÀÖÁö ¾ÊÀ» °æ¿ì¿¡ Segment Fault°¡ ³¯ ¼öµµ ÀÖ´Ù.) Fedora ¿î¿µÃ¼Á¦¿¡¼ Remote¸¦ ÇÑ ¹ø¿¡ °ø·«ÇÒ ¼ö ÀÖ´Â ±â¹ý¿¡ ´ëÇؼ ¾ÆÁ÷ ¸¹Àº ¿¬±¸¸¦ Çغ¸Áö´Â ¸øÇßÁö¸¸ ÇÁ·Î±×·¥ ½ÇÇà ÇÔ¼ö±º°ú ¶Ç, ´Ù¸¥ Library ¿µ¿ªÀÇ ¾î¼Àºí¸®¾î ÄÚµåµéÀ» ÀÌ¿ëÇÑ´Ù¸é °¡´É¼ºÀº ¾ó¸¶µçÁö Á¸ÀçÇÒ¼ö ÀÖ´Ù°í »ý°¢ÇÑ´Ù. ¶ÇÇÑ º» ¹®¼¿¡¼ ¼³¸íÇÑ °ø°Ý ¹æ¹ý¿¡¼ LibraryÀÇ Random Mapping¿¡ °üÇÑ »óȲÀº ¿°µÎÇصÎÁö ¾Ê¾Ò´Ù. Å×½ºÆ® °á°ú RandomÇÏ°Ô MappingµÇ´Â ¿µ¿ªÀº ´Ü 2 °¡Áö ¿µ¿ª ¹Û¿¡ ¾ø¾ú°í, MappingµÇ´Â ¿µ¿ªµµ ÁÖ·Î ÇÑ ±ºµ¥¿¡ ´õ ¸¹ÀÌ ÆíÁß µÇ¾îÀÖ¾ú±â ¶§¹®¿¡ Mapping µÇ´Â ¿µ¿ªÀÌ ÇÑ°¡Áö¶ó°í °¡Á¤ÇÏ°í Å×½ºÆ®¸¦ ÇÏ¿´´Ù. ±×·¯³ª º¸´Ù È®½ÇÇÑ ¿¬±¸°¡ ¿ä±¸µÈ´Ù.
5. Âü°í ¹®Çå & »çÀÌÆ® (1) Smashing The Stack For Fun And Profit -Aleph1- (2) Advanced return-into-lib(c) exploits -nergal- (3) Á¦3ȸ HackerSchool Hacking ´ëȸ ´ëȸ º¸°í¼ -loafers- (4) Return-into-libc Test -Vangelis- (5) Omega Project -lamagra- (6) Fedora web site (7) exec-shield WEB SITE
|