Andreas Thuemmel, a.thuemmel@web.de -Version 1.0, 15-02-2001- 1. ¾È³» ¹× ¿ä¾à Æ÷¸ä½ºÆ®¸µ¹ö±×´Â ·ÎÄà À̳ª ¿ø°Ý°ø°Ý¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â »õ·Î¿î ±â¼úÀÌ´Ù. 1999³â 9¿ù À§Çè¿¡ ´ëÇÑ ³»¿ëÀÌ ¹ßÇ¥µÇ°í 2000³â 6¿ù wu-ftpd 2.6.0¿¡ ´ëÇÑ °ø°ÝÄڵ尡 ¹ßÇ¥µÇ¾ú´Ù. °ø°ÝÄÚµå´Â 1³âÁ¤µµ ¾ð´õ±×¶ó¿îµå¿¡¼­ ¹èÆ÷µÇ¾úÀ¸¸ç 2000³â ¿©¸§ÀÌÈÄ ¸¹Àº ¼öÀÇ Æ÷¸Ë½ºÆ®¸µ¹ö±×¸¦ ±âÃÊ·ÎÇÑ °ø°ÝÄڵ尡 ¹ßÇ¥µÇ¾úÀ¸¸ç ¸®´ª½º¿Í À¯´Ð½º ¹èÆ÷ÀÚµé°ú ¹ê´õµéÀÇ °ü½É»ç°¡ µÇ¾ú´Ù. . ¿ø°Ý °ø°Ý: wu-ftpd, BSD ftpd, proftpd, rpc.statd, PHP 3¿Í 4, TIS-Firewall Toolkit, ... . ·ÎÄà °ø°Ý: lpr, LPRng, ypbind, BSD chpass ¿Í fstat, libcÀÇ localistaion, ... . ¶ó¸é ¿úÀº Æ÷¸ä½ºÆ®¸µ¹ö±×¸¦ ÀÌ¿ëÇÏ¿© wu-ftpd¿Í rpc.statd ±×¸®°í LPRngµîÀ» °ø°ÝÇÑ´Ù. ÀÌ ±â»ç´Â Æ÷¸ä½ºÆ®¸µ °ø°ÝÄÚµåÀÇ ¼ÓÀÓ¼ö¿Í Á¦ÇÑ»çÇ׵ ´ëÇÏ¿© »ý°¢ÇÏ°í ºÐ¼®ÇϱâÀ§Çؼ­ ¾²¿©Á³´Ù. ¿ö½ÌÅÏ´ëÇÐÀÇ ftp¼­¹ö(wu-ftpd 2.6.0)¿Í Red Hat Linux 6.2¸¦ ÀÌ¿ëÇØ¼­ ½ÇÁúÀûÀÎ ¿¹¸¦ µé°ÍÀÌ´Ù. ÀÌ ±â»çÀÇ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù. . ¹®Á¦ÀÇ Á¤ÀÇ . ½ºÅØÀбâ . ¹®ÀÚ¿­ º¯¼öÀÇ ³»¿ë Àбâ . Á¤¼ö°ªÀÇ ¾²±â . Æ÷¸Ë½ºÆ®¸µ ¹ö±×¿¡ ´ëÇÑ ¹æ¾î ÷ºÎÀÇ »ùÇÃÄÚµå´Â ÀÌ ±â»çÀÇ ¿¹¸¦ À§ÇÏ¿© ¾²¿©Á³´Ù. ÀÌ ÄÚµå´Â ¸î¸îÀÇ ´Ù¸¥½Ã½ºÅÛ¿¡¼­ À¯¿ëÇÑ Æ÷¸äÆ®½º¸µÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù. 2. ¹®Á¦¿Í »ý°¢ C¾ð¾î(C++Æ÷ÇÔ)¿¡¼­´Â ÀμöÀÇ ¼ö¸¦ °¡º¯ÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô Á¤ÀǵǾîÀÖ´Ù. ºÒ·ÁÁú¶§¿¡ ¸î°³ÀÇ Àμö°¡ ÇÔ¼ö¿¡ ÁÖ¾îÁ³´ÂÁöÀ» ¾Ë·ÁÁØ´Ù. Ç¥ÁØ CÀÇ °æ¿ì fprintf(), printf(), sprintf(), snprintf(), vprintf(), vsprintf(), vsnprintf(), setproctitle()¿Í syslog()µîÀÌ À̵éÁßÀÇ ÇϳªÀÌ´Ù. ÀÌ ¸ðµç ÇÔ¼öµéÀº °øÅëµÈ Á¡ÀÌ µÎ°¡Áö ºÎºÐÀÌ ÀÖ´Ù. . óÀ½Àμö´Â ºÒ·ÁÁø Æ÷¸ä¹®ÀÚ¿­ÀÌ´Ù. . ´ÙÀ½¿¡ ¿À´Â Àμö´Â Æ÷¸ä¹®ÀÚ¿­ÀÇ ÇüÅ¿¡ µû¶ó ¿©·¯°®·Î º¯È¯µÈ´Ù. ´ÙÀ½¿¡ À̾߱âÇÏ´Â ºÎºÐµéÀº ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï printf()ÇÔ¼ö¸¦ ±âÁØÀ¸·Î ¼³¸íÇÑ´Ù. ´ÙÀ½¿¡ ¼³¸íÇÏ´Â ¹®ÀåµéÀº Æ÷¸ä¹®ÀÚ¿­À» ó¸®ÇÏ´Â ¸ðµç ÇÔ¼ö¿¡¼­ Àß µ¿ÀÛÇÑ´Ù. Æ÷¸ä¹®ÀÚ¿­Àº ´ÙÀ½ÀÇ µÎ°¡Áö°æ¿ì¿¡ »ç¿ëÇÑ´Ù. . µû¶ó¿À´Â Àμö¸¦ ¹®ÀÚ¿­·Î º¯°æÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇ . ¾ó¸¶³ª ¸¹Àº Àμö°¡ ÇÊ¿ä·Î ÇÏ´ÂÁö Á¤ÀÇ Æ÷¸ä¹®ÀÚ¿­ÀÚ½ÅÀº Ãâ·Â½ºÆ®¸²À¸·Î º¹»çµÇ°í µû¶ó¿À´Â ÀμöµéÀ» ¾î¶»°Ô º¯È¯ÇÒ°ÍÀÎÁö¿¡ ´ëÇÑ Á¤ÀǸ¦ ´ãÀº º¯È¯ÁöÁ¤ÀÚµéÀÎ Æò¹üÇÑ ¹®ÀÚµéÀÇ È¥ÇÕÀ¸·Î µÇ¾îÀÖ´Ù. int i = 20; int j = 10; char *format_string = "The numbers are %d and %d"; printf(format_string, i, j); À§ÀÇ ÄÚµå´Â "The numbers are 20 and 10"À̶ó°í Ç¥ÁØÃâ·ÂÀ¸·Î ÀμâÇÑ´Ù. "%d"°¡ º¯È¯ÁöÁ¤ÀÚ ÀÌ´Ù. º¯È¯ÁöÁ¤ÀÚ´Â %·Î ½ÃÀÛÇÑ´Ù. %µÚ¿¡ µû¶ó¿À´Â ¹®ÀÚµéÀº Ãâ·Â(Á¤·Ä, Æø, paddingµî)ÀÇ ÇüŸ¦ ÁöÁ¤Çϰí, ÁÖ¾îÁø ÀμöÀÇ ÇüŸ¦ °áÁ¤ÇÑ´Ù. Ãâ·Â½ºÆ®¸²¿¡¼­ ¸ðµç %ÀÇ ÇüÅÂÁö½ÃÀÚ´Â ÀûÀýÇÑ ÀμöÀÇ °ªÀ¸·Î ´ëÄ¡µÈ´Ù. (%ÀÚü¸¦ Ãâ·ÂÇÏ´Â %%´Â Á¦¿Ü) Áß¿äÇÑ º¯È¯Áö½ÃÀÚ´Â ´ÙÀ½°ú °°´Ù. . %d - Á¤¼ö(int)¸¦ ½ÊÁø¹ý¼ö(decimal) . %x - Á¤¼ö(int)¸¦ 16Áø¹ý¼ö(hex) . %s - ¹®ÀÚ¿­ ¹öÆÛ¿À¹öÇ÷οì¿Í °°ÀÌ Æ÷¸ä½ºÆ®¸µ¹ö±×ÀÇ ¹®Á¦´Â ÇÁ·Î±×·¥°³¹ß»õÀÇ ¹«Áö¿Í °ÔÀ¸¸§¿¡ÀÇÇÏ¿© ¹ß»ýÇÑ´Ù. ´ÙÀ½ÀÇ Äڵ带 »ý°¢ÇØ º¸ÀÚ char *user_supplied_input; [...] printf(user_supplied_input); ¶Ç´Â char *user_supplied_input; char *some_string; [...] sprintf(some_string, "%s", user_supplied_input); [...] printf(some_string); ¾çÂʰæ¿ì´Ù »ç¿ëÀÚ°¡ Á¦°øÇÑ ÀÔ·ÂÀÌ printf()ÇÔ¼öÀÇ Æ÷¸ä¹®ÀÚ¿­·Î Á¦°øµÈ´Ù. printf("%s", user_supplied_input); º¸´Ù´Â printf("%s", some_string); ÀÌ ´õ¿í Á¤È®ÇÑ »ç¿ë¹ýÀÌ´Ù(?). À§ÀÇ ¿¹¿¡¼­ »ç¿ëÀÚ°¡ %x°¡ Æ÷ÇԵǾî ÀÖ´Â ¹®ÀÚ¿­À» ÀÔ·ÂÇÑ´Ù¸é ¾î¶² Çö»óÀÌ ¹ß»ýÇÒ±î? printf()´Â Á¤¼ö Àμö°¡ Æ÷¸ä¹®ÀÚ¿­ÀÇ µÚ¿¡ ÀÖÀ»°ÍÀ̶ó°í °¡Á¤ÇÒ °ÍÀÌ´Ù. ±×·¯³ª °Å±â¿¡´Â Àμö°¡ ¾ø´Ù. À̿Ͱ°Àº À߸øµÈÁ¡Àº ÄÄÆÄÀϽÿ¡ ÀνĵÇÁö ¾Ê´Â´Ù. ¿¹: wu-ftpd 2.6.0 wu-ftpd 2.6.0ÀÇ ¹®Á¦´Â vreply()(src/ftpd.c)¿¡ ÀÖ´Ù. °£´ÜÇÏ°Ô vreply()´Â ´ÙÀ½°ú °°ÀÌ º¸ÀδÙ. void vreply([...], char *fmt, [...]) { char buf[BUFSIZ]; [...] snprintf(buf, sizeof(buf), fmt); [...] } À̿Ͱ°Àº °æ¿ì¿¡ site exec¸í·ÉÀÇ *fmt´Â SITE EXEC¸í·É°ú ÇÔ²² »ç¿ëÀÚ°¡ Á¦°øÇÑ ¹®ÀÚ¿­À» Æ÷ÇÔÇϰí ÀÖ´Ù. ÀÌ ¹æ¹ýÀ¸·Î ftp»ç¿ëÀÚ´Â snprintf()¸¦ Á¦¾îÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àå¿¡¼­´Â ¾î¶»°Ô ÀÌ·¯ÇÑ ¹ö±×°¡ °ø°ÝµÇ´ÂÁö º¸¿©ÁÙ °ÍÀÌ´Ù. 3. ½ºÅÃÀбâ ÇÔ¼ö¿¡ ÀÎÀÚ¸¦ ³Ñ°ÜÁָ鼭 caller´Â Ȱ¼ºÈ­ ÀÚ·á(activation record(or frame))¸¦ ½ºÅÿ¡ ³Ö´Â´Ù. ¿¹¸¦ µé¸é ÇÔ¼ö f(int i, int *j)°¡ ºÒ·ÁÁú¶§¿¡ ´ÙÀ½°ú °°Àº ½ºÅÃÀÇ ±¸Á¶¸¦ °¡Áö°Ô µÈ´Ù. | +----------------------------+ <--------- Bottom of stack | | Local variables, | | | saved registers, | | | activation record of | | | other functions | | | | | | | | +----------------------------+ // ------------------------- | | | // -- -- | | Pointer to J | // -- ÀÌ ºÎºÐÀÌ f()¿¡ -- | | | // -- ´ëÇÑ È°¼ºÈ­ ÀÚ·á -- | +----------------------------+ // -- °¡ µÈ´Ù. -- | | | // -- -- | | value of I | // -- -- | | | // -- -- | +----------------------------+ // -- -- | | | // -- -- | | Return address to caller | // -- -- | | f() | // -- -- | | | // -- -- | +----------------------------+ // ------------------------- | | saved registers | | +----------------------------+ | | local variables of | | | f() | | | | | +----------------------------+ <--------- Top of stack V ¸¸¾à Àû´çÇÑ Àμö°¡ ¾ø´Â»óÅÂÀÇ Æ÷¸ä½ºÆ®¸µÀ» printf()¿¡ ÁØ´Ù¸é ¾î¶² »óȲÀÌ ³ªÅ¸³¯±î? printf()¸¦ À§ÇÑ ¸ðµç Àμö´Â ½ºÅÿ¡ ³õ¿©Áø´Ù. printf()´Â activation record°¡ Æ÷¸ä½ºÆ®¸µÀÇ ¸ðµç º¯È¯Áö½ÃÀÚ°¡ °¡¸®Å°´Â ¼ö¸¸Å­ÀÇ Àμö°¡ ½ºÅÿ¡ ÀÖ´Ù°í °¡Á¤ÇÏ°Ô µÈ´Ù. ¸ðµç %´Â ½ºÅØ¿¡¼­ Àû´çÇÑ À§Ä¡ÀÇ °ªÀ» ÀÐ°Ô µÈ´Ù. À̰ÍÀº ½ºÅÃÀ» ¾Æ·¡ÂÊÀ¸·Î ÀÐ°ÔµÇ°í ½ÇÁúÀûÀΠȰ¼ºÈ­ ÀÚ·á(activation record)ÀÇ ¹üÀ§¸¦ ¹þ¾î³µ´ÂÁö¿Í »ó°ü¾øÀÌ Ãâ·Â½ºÆ®¸²ÂÊÀ¸·Î Àμ⸦ ÇϰԵȴÙ. activation record¿¡´Â ¹üÀ§°Ë»ç°¡ ¾ø´Ù. ÀϹÝÀûÀÎ »óȲ¿¡¼­ ¸ð¸ä½ºÆ®¸µÀº caller¿¡ ÀÇÇØ ÀûÀýÇÑ Å©±âÀÇ ÀÚ·á°¡ ½ÇÁ¦ activation record¿¡ ³Ö¾îÁö°Ô µÈ´Ù. Æ÷¸ä½ºÆ®¸µ Á¶ÀÛ °ø°ÝÀÚ´Â printf()°¡ ½ÇÁ¦ activation recordº¸´Ù Å©´Ù¶ó°í »ý°¢ÇÏ°Ô ¸¸µç´Ù. À̿Ͱ°Àº ¹æ¹ýÀ¸·Î printf()ÇÔ¼ö°¡ Ãâ·Â½ºÆ®¸²À¸·Î Ãâ·ÂÀ» ÇÏ°ÔµÇ¸é °ø°ÝÀÚ´Â ½ºÅÃÀÇ °ªµéÀ» ÀÐÀ»¼ö ÀÖ°Ô µÈ´Ù. ¿¹: wu-ftpd 2.6.0 Red Hat 6.2 ¸®´ª½º½Ã½ºÅÛ¿¡¼­ÀÇ ftp¼¼¼Ç¿¹¸¦ µé¾îº»´Ù. ftpŬ¶óÀÌ¾ðÆ® ´ë½Å¿¡ netcaÀ» »ç¿ëÇÏ¿´´Ù. »ç¿ëÀÚÀÇ ÀÔ·ÂÀº ±½Àº(?)±Û¾¾·Î Ç¥ÇöÇÑ´Ù. »ç¿ëÀÚ "andreas"°¡ "SITE EXEC %x %x %x %x"¸í·ÉÀ» ½ÇÇàÇÑ´Ù. %x´Â Æ÷¸ä½ºÆ®¸µÀ¸·Î Àνĵǿ© °á°ú´Â "31 bffff53c 1ee 6d"·Î ³ªÅ¸³ª ½ÇÁ¦ ftpd processÀÇ ½ºÅðªÀ» Ãâ·ÂÇÑ´Ù. % nc jeddy3 21 220 jeddy3 FTP server (Version wu-2.6.0(2) Thu Aug 3 18:24:27 CEST 2000) ready. USER andreas 331 Password required for andreas. PASS 2138 230 User andreas logged in. SITE EXEC %x %x %x %x 200-31 bfffff53c 1ee 6d 200 (end of '%x %x %x %x') QUIT 221-You have transferred 0 bytes in 0 files. 221-Total traffic for this session was 291 bytes in 0 transfers. 221-Thank you for using the FTP service on jeddy3. 221 Goodbye. 4. ÇÁ·Î¼¼¼­ ¸Þ¸ð¸®ÀÇ ÀÓÀÇ À§Ä¡ÀÇ ¹®ÀÚ¿­ Àб⠸¸¾à printfÀÇ Ãâ·ÂÀÌ »ç¿ëÀÚ¿¡°Ô º¸¿©Áø´Ù¸é, °ø°ÝÀÚ´Â ½ºÅÃÀÇ ³»¿ë¸¸À» º¸´Â°ÍÀÌ ¾Æ´Ï°í, text³ª data¶Ç´Â heapµîÀÇ ÀÓÀÇÀ§Ä¡ÀÇ ¹®ÀÚ¿­À» ÀÐÀ» ¼ö ÀÖ´Ù. ¾î¶»°Ô ÀÌ·¸°Ô µ¿ÀÛÇÏ´ÂÁö´Â ¹®ÀÚ¿­ Àμö°¡ ¾î¶»°Ô ÇÔ¼ö¿¡°Ô Àü´ÞµÇ´ÂÁö¿¡ °üÇÑ ³»¿ëÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. ¹®ÀÚ¿­Àμö¿¡ ´ëÇÑ activation record´Â ÂüÁ¶(Æ÷ÀÎÅͰ°Àº..)°ª¸¸À» ÀúÀåÇϰí ÀÖ´Ù. µû¶ó¼­ %s¸¦ ÀÌ¿ëÇØ¼­ ¿øÇÏ´Â ³»¿ëÀ» Ç¥½ÃÇϱâ À§Çؼ­´Â Æ÷ÀÎÅ͸¦ activation record¿¡ ±â·ÏÇÏ¿©¾ß ÇÑ´Ù. ±×·¯³ª °ø°ÝÀÚ´Â ÇÁ·Î±×·¥Äڵ带 ¼öÁ¤ÇÒ¼ö ¾ø°í Ãß°¡ÀûÀÎ Æ÷ÀÎÅ͸¦ printf()ÀÇ ½ºÅÿ¡ ³ÖÀ»¼ö ÀÖÀ» »ÓÀÌ´Ù. ±×µéÀº %s¸¦ ÀԷ¹®ÀÚ¿­¿¡ ³ÖÀ»¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾î¶»°Ô ÀûÀýÇÑ Æ÷ÀÎÅ͸¦ activation record¿¡ ³ÖÀ»¼ö ÀÖÀ»±î? ±×°Í¿¡ ´ëÇÑ Á¤´äÀº Æ÷¸ä½ºÆ®¸µ¿¡ ÀÖ´Ù. Æ÷¸ä½ºÆ®¸µÀÚ½ÅÀÌ ½ºÅÿ¡ ÀúÀåµÈ´Ù°í °¡Á¤ÇØ º¸ÀÚ. (Áö±ÝºÎÅÍ Æ®¸¯) %d³ª %x¸¦ %s¾Õ¿¡ ³Ö¾îÁÖ¸é printf()´Â Æ÷¸ä½ºÆ®¸µÀÇ ½ÃÀۺκоձîÁö ½ºÅÃÀб⸦ ½ÇÇàÇÑ´Ù. Æ÷¸ä½ºÆ®¸µ ÀÚ½ÅÀº °ø°ÝÀÚ°¡ °ü½ÉÀÖ´Â ¹®ÀÚ¿­À» Áö½ÃÇÏ´Â ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅ͸¦ ±¸¼ºÇÏ´Â ¸î¹ÙÀÌÆ®(32ºñÆ® architecturesÀΰæ¿ì 4¹ÙÀÌÆ®)·Î ½ÃÀÛÇÑ´Ù. printf()°¡ %s¸¦ ÇØ¼®Çϱ⠽ÃÀÛÇϸé, printf()´Â Á¤È®ÇÏ°Ô Æ÷ÀÎÅÍ¿¡¼­ ¹®ÀÚ¿­À» ÃßÃâÇÏ°Ô µÈ´Ù.(?) À§¿Í °°Àº °æ¿ìÀÇ printf()°¡ Ãâ·ÂÇÏ´Â ¿¹¸¦ º¸¸é +----------------------+----------------------------------+-------------------+ | Adress of string | Lots of trash: local vars, | the string | | copied as characters | registers, return addresses, | that attacker is | | to the output stream | that are interpreted as integers| interested in | +----------------------+----------------------------------+-------------------+ À§¿Í°°Àº °æ¿ìÀÇ Æ®¸¯Àº activation record¸¦ Æ÷¸ä½ºÆ®¸µÀÌ ½ÃÀÛÇÏ´Â À§Ä¡±îÁö È®ÀåÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹æ¹ýÀ¸·Î °ø°ÝÀÚ´Â activation recordÀÇ ¸îºñÆ®¸¦ Á¦¾îÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¾Õ¿¡¼­ º¸¿©Áø ±â¼úÀÎ Æ÷¸ä½ºÆ®¸µÀÌ ÇÔ¼öÀÇ ·ÎÄú¯¼öó·³ ½ºÅØ¿¡ ÀúÀåµÉ¶§¿¡¸¸ °¡´ÉÇÑ ±â¼úÀÌ´Ù. ´Ù¸¥¸»·Î Ãâ·Â½ºÆ®¸²ÀÌ ´Ù¸¥¹öÆÛ·Î ÀμâµÇ¸é(sprintf), À̹öÆÛ¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. µÎ¹øÂ° Á¦¾à»çÇ×ÀÌ ÀÖ´Ù. C¿¡¼­ ¹®ÀÚ¿­Àº ASCIIZÇüÅ·ΠÀúÀåµÇ¾î¾ß ÇÑ´Ù. ±×·¯¹Ç·Î Æ÷ÀÎÅͰ¡ Áö½ÃÇÏ´Â ¹®ÀÚ¿­¿¡´Â 0x00À» Æ÷ÇÔÇÒ ¼ö ¾ø´Ù. 32-bit¾ÆÅ°ÅØÃ³¿¡¼­ À̰ÍÀº 2%ÀÇ ÁÖ¼Ò°ø°£ÀÌ Á¡°ËµÇÁö ¾Ê´Â´Ù´Â ¶æÀÌ´Ù. Remark: ½ºÅÿ¡ ÀÖ´Â Æ÷¸ä½ºÆ®¸µÀ» ã±â À§ÇÏ¿© ÃæºÐÇÑ %xµé·Î %sÀ» ä¿ì¸é °á°ú´Â °Å´ëÇÑ Æ÷¸ä½ºÆ®¸µ¿¡ ÀÖ´Ù.(?) CÇ¥ÁضóÀ̺귯¸®¿¡¼­ Áö¿øµÈ´Ù¸é, $Ç÷¡±×ÀÇ »ç¿ëÀº ÁÖ¾îÁø Àμö·Î Á÷Á¢ JUMPÇÏ´Â ¾ÆÁÖ È¿°úÀûÀÎ ¹æ¹ýÀÌ´Ù. À̰ÍÀº ÀԷ¹öÆÛÀÇ °ø°£À» Àß¾àÇÒ »Ó¸¸¾Æ´Ï¶ó, ·ÎÄú¯¼öµéÀ̳ª ·¹Áö½ºÅͰª°ú Á¤¼ö·Î º¯È¯µÈ ¸®ÅÏÁÖ¼Ò°¡ À߸ø Ãâ·ÂµÇ´Â°ÍÀ» ¸·¾ÆÁØ´Ù. ¿¹: wu-ftpd 2.6.0 À̹ø¿¡´Â Á»´õ Á¶½ÉÇØ¼­ ¸¸µé¾îÁø Æ÷¸ä½ºÆ®¸µÀÌ "SITE EXEC"ÀÇ Àμö·Î »ç¿ëµÈ´Ù. "AA"´Â paddingÀ» À§Çؼ­ »ç¿ëµÈ´Ù. ´ÙÀ½ÀÇ ÀÌ»óÇÑ ¹®ÀÚ¿­ "@e°¡°¡"¿Í "pj°¡°¡"´Â passwd±¸Á¶Ã¼ *pwÀÇ pw_name°ú pw_passwdÇʵ带 Áö½ÃÇÏ´Â Æ÷ÀÎÅÍÀÎ 0x8086a70°ú 0x8086540À» Ç¥ÇöÇÏ´Â ¹®ÀÚµéÀÌ´Ù. "277$"´Â 277 %X¸¦ ´ë½ÅÇØ¼­ »ç¿ëµÇ¾ú´Ù. ¾Æ·¡¿¡¼­ º¸¿©Áö´Â "andreas"´Â pw->pw_nameÀÇ °ªÀ̰í "$1$P3aRAfUA$ATCfz9G/KGUiKn9NZSV6M1"´Â pw->pw_passwd(/etc/passwdó·³ ¾Ïȣȭ)°ªÀÌ´Ù. % nc jeddy3 21 220 jeddy3 FTP server (Version wu-2.6.0(2) The Aug 3 18:24:27 CEST 2000) ready. 4.1.1 USER andreas 331 Password required for andreas. 4.1.2 PASS 2138 230 User andreas logged in. 4.1.2.1 SITE EXEC AA@e°¡°¡%227$s 200-aa@2°¡°¡andreas 200 (end of 'aa@e°¡%277$s') SITE EXEC AApj°¡%227$s 200-aapj°¡$1$P3aRAfUA$ATCfz9G/KGUiKn9NZSV6M1 200 (end of 'aapj°¡%277$s') 5. ÇÁ·Î¼¼¼­ÀÇ ÀÓÀÇÀÇ À§Ä¡¿¡ Á¤¼ö°ª ¾²±â ÀϹÝÀûÀÎ ¹®ÀÚ¿­·Î º¯È¯ÇÏ´Â º¯È¯ÁöÁ¤ÀÚ ¿Ü¿¡ Ưº°ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÏ´Â ÁöÁ¤ÀÚ·Î %nÀÌ ÀÖ´Ù. BSDÀÇ ¸àÆäÀÌÁö¿¡´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾîÀÖ´Ù. . %n: The number of characters written so far is into the integer indicated by the [corresponding] int * (or variant) pointer agrument. (Á¤¼öÆ÷ÀÎÅͰ¡ Áö½ÃÇϰí Àִ°÷¿¡ Ãâ·ÂµÈ ¹®ÀÚÀÇ °¹¼ö¸¦ Á¤¼ö°ªÀ¸·Î ±â·ÏÇÑ´Ù.) ¿¹¸¦µé¸é ´ÙÀ½ÀÇ ÀϺΠÄÚµåÀÇ °á°ú·Î i=5ÀÌ´Ù. int i; printf("12345%n", &i); À§¿¡¼­ º»°Íó·³ printf()°¡ ¸Þ¸ð¸®ÀÇ ¾Æ¹«À§Ä¡¿¡³ª Á¤¼ö°ªÀ» ¾µ ¼ö ÀÖ´Ù. ÁÖ¾îÁø Æ÷¸ä½ºÆ®¸µÀÌ ½ºÅÿ¡ À§Ä¡Çϰí, °ø°ÝÀÚ°¡ ¾ÕÀå¿¡¼­ ¼³¸íÇÑ ±â¼úÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù¸é, ÃæºÐÇÑ %xµÚ¿¡ %nÀ» »ç¿ëÇÏ¿© ½ºÅÃÀ» µû¶ó¼­ ³»·Á°£ ´ÙÀ½ Æ÷¸ä½ºÆ®¸µÀÌ À§Ä¡ÇÑ °÷¿¡ ´Ù´Ù¸¦¼ö ÀÖ´Ù. Æ÷¸ä½ºÆ®¸µÀº ´ÙÀ½À» ÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®·Î ±¸¼ºµÈ ¹ÙÀÌÆ®µé(Æ÷ÀÎÅÍ·Î ¹ø¿ªµÈ)·Î ½ÃÀÛÇÑ´Ù. °ø°ÝÀÚ°¡ ÇÒ¼ö ÀÖ´Â°Í . Áß¿äÇÑ ÇÁ·Î±×·¥ÀÇ Á¢±ÙÁ¦¾î¸¦ ´þ¾î¾²±â . ³»ºÎ¿¬°á Å×À̺íµé, ÇÔ¼öÆ÷ÀÎÅÍ, setjmp/longjmp¹öÆÛµé, ½ºÅÃÀÇ ¸®ÅÏÁÖ¼ÒµîÀÇ ´þ¾î¾²±â ±×·¯³ª ¾²¿©Áø °ªÀº %nÀÌ ³ªÅ¸³ª±â Àü±îÁöÀÇ Ãâ·ÂµÈ ¹®ÀÚµéÀÇ °¹¼ö¿¡ ÀÇÇÏ¿© °áÁ¤µÈ´Ù. Á¤¸»·Î ¿ÏÇÏ´Â Á¤¼ö°ªÀ» ±â·ÏÇÒ ¼ö ÀÖÀ»±î? ±×°ÍÀº °¡´ÉÇÏ´Ù, ÇÏÁö¸¸ ´Ù¸¥ µÎ°³ÀÇ Æ®¸¯ÀÌ ÇÊ¿äÇÏ´Ù. ù¹øÂ° Æ®¸¯Àº ´õ¹ÌÃâ·Â¹®ÀÚ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. 1000À» ±â·ÏÇϱâ À§Çؼ­´Â 1000°³ÀÇ ´õ¹Ì¹®ÀÚ¸¦ Ãâ·ÂÇÏ¸é µÈ´Ù. ¹°·Ð ½ºÅÃÀ» µû¶ó ³»·Á°¡¸ç Æ÷¸ä½ºÆ®¸µ¿¡ ´Ù´Ù¸£±âÀ§ÇÑ %xÀÇ »ç¿ë±æÀ̸¦ °í·ÁÇØ¾ß ÇÑ´Ù. (%.8x°¡ 32-bit±¸Á¶¿¡¼­ ÁÁÀº¼±ÅÃÀÌ´Ù. À̰ÍÀÇ Ãâ·Â±æÀÌ´Â ½ÇÁ¦ Ãâ·ÂµÇ´Â°Í°ú »ó°ü¾øÀÌ 8ÀÚ¸®ÀÌ´Ù. ¶ÇÇÑ $Ç÷¡±×µµ »ç¿ë °¡´ÉÇÏ´Ù.) 1000°³ÀÇ ´õ¹Ì¹®ÀÚ¸¦ Ãâ·ÂÇÏ´Â ±äÆ÷¸ä½ºÆ®¸µÀÇ »ç¿ëÀ» ÇÇÇϱâ À§ÇÏ¿©, ÆøÁöÁ¤ÀÚ°¡ »ç¿ëµÉ ¼ö ÀÖ´Ù. .... À̿Ͱ°Àº À̷п¡ ÀÇÇÏ¿© ¿øÇÏ´Â °ªÀ» ±â·ÏÇÒ ¼ö´Â ÀÖÁö¸¸ Ç¥ÁØ C¶óÀ̺귯¸®ÀÇ ±¸Çö¿¡ µû¶ó ÀÓÀÇÀÇ ±ä Æø ÁöÁ¤ÀÚ¸¦ »ç¿ëÇÒ ¼ö ¾ø´Â Ưº°ÇÑ Á¦ÇÑÀÌ °É¸®´Â °æ¿ì°¡ À־ µÎ¹øÂ° Æ®¸¯ÀÌ ÇÊ¿äÇÏ´Ù. µÎ¹øÂ° Æ®¸¯Àº %nÀ» ÇѹøÀÌ»ó »ç¿ëÇÏ´Â °ÍÀÌ´Ù. %nÀ» ÇѹøÀÌ»ó »ç¿ëÇϸé, ÇϳªÀÇ ÁÖ¼Ò¿¡ ´ëÇÏ¿© À̵¿ÀÌ µÇ¸é¼­ ¸î¹øÀÇ ¾²±â°¡ ÁøÇàµÈ´Ù. ¿¹¸¦µé¸é ¸®Æ²¿£µð¾È 32ºñÆ®(IA32°°Àº) ±¸Á¶¿¡¼­ "misaligned"±â·ÏÀÌ Çã¶ôµÇ´Âµ¥, À̰ÍÀº ÇϳªÀÇ Æ÷ÀÎÅÍ¿¡¼­ 1¾¿ Áõ°¡ÇÏ¿© 4¹øÀÇ ¼º°øÀûÀÎ Á¤¼öÀÇ ±â·ÏÀÌ °¡´ÉÇÏ´Ù. À̿Ͱ°Àº ¹æ¹ýÀº Ç×»ó 3¹ÙÀÌÆ®ÀÇ ÀڷḦ ´þ¾î¾²¹Ç·Î ³²¾ÆÀÖ´Â ÇϳªÀÇ ¹ÙÀÌÆ®´Â ´ÙÀ½ ¾²±â¿¡¼­ º¯°æµÇÁö¾Ê°í ³²¾ÆÀÖ°Ô µÈ´Ù. ¼­·Î´Ù¸¥ %n»çÀÌ¿¡ ù¹øÂ°Æ®¸¯ÀÌ »ç¿ëµÇ°í ´ÙÀ½ ±â·Ï¿¡¼­ ¹ÙÀÌÆ®ÀÇ °ªÀ» Á¶Á¤ÇÔÀ¸·Î¼­ LSB°¡ º¯°æµÇÁö ¾Êµµ·Ï ÇÑ´Ù. À̰°Àº ¹æ¹ýÀº ÇϳªÀÇ ¹ÙÀÌÆ® ±â·Ï½Ã¿¡ 255°³ÀÇ ´õ¹Ì¹®ÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ºò¿£µð¾È ±¸Á¶¿¡¼­ÀÇ À§ÀÇ ³»¿ëÀÌ µÚÁýÇô¼­ ³ªÅ¸³­´Ù. °¢°¢ÀÇ ¼º°øÀûÀÎ ±â·ÏÀº 1¾¿ °¨¼ÒÇϸ鼭 ±â·ÏµÈ´Ù. ~~~¾Æ ±ÍÂù¾Æ~~~~~~ ¿¹: wu-ftpd 2.6.0 ¸¶Áö¸·À¸·Î "SITE EXEC"´Â ½ºÅÃÀÇ ¸®ÅÏÁÖ¼Ò¸¦ ´þ¾î¾²±â À§Çؼ­ »ç¿ëµÈ´Ù. ½ÇÁúÀûÀÎ Æ÷¸ä½ºÆ®¸µÀº ÷ºÎ¿¡ ÁÖ¾îÁø ÄÚµå·Î »ý¼ºµÇ¾ú´Ù. (Àμö´Â -n 1098 -m 0xbfffe4c8 -k 0xbfffd55a -d ÀÌÁö¸¸ ½Ã½ºÅÛ¸¶´Ù ´Ù¸¦¼ö ÀÖ´Ù.) %hnÁöÁ¤ÀÚ(hÇ÷¡±×´Â int´ë½Å¿¡ short int¸¦ ÀǹÌÇÑ´Ù.)´ÙÀ½¿¡´Â x86ÀÇ ¸®´ª½º ½© Äڵ尡 µû¶ó¿Â´Ù. ftpÁ¦¾î¹®ÀÚȸÇǰ¡ ÇÊ¿äÇÏ´Ù.(0xff¸¦ µÎ¹ø»ç¿ëÇϸé 0xffÇϳªÀÇ Àǹ̰¡ µÈ´Ù.) ´ÙÀ½ÀÇ ¿¹¸¦ º¸¸é °ø°ÝÀÚ´Â ½©À» ¾ò¾ú°í, "uname -a"¿Í "id"¸í·É¾î¸¦ »ç¿ëÇÏ¿© root°¡ µÇ¾úÀ½À» È®ÀÎÇϰí ÀÖ´Ù. % nc jeddy3 21 220 jeddy3 FTP server (Version wu-2.6.0(2) Thu Aug 3 18:24:27 CEST 2000) ready. 5.1.1 USER andreas 331 Password required for andreas. 5.1.2 PASS 2138 230 User andreas logged in. SITE EXEC AA.............format string ............Áß°£¿¡ %hnÀÌ ³×°³ÀÖ´Ù..................... 200-aa...........................^^............................................. 200 (end of 'aa ........................................) uname -a Linux jeddy3 2.2.14-5.0 #1 Tue Mar ..... id uid=0(root) gid=0(root) ¹öÆÛ¿À¹öÇ÷οì ó·³, ¼º°øÀûÀÎ °ø°ÝÀ» À§Çؼ­ °ø°ÝÀÚ´Â ¸î°³ÀÇ ÇÁ·Î¼¼½º³»ºÎ ÁÖ¼Ò¿¡ ´ëÇØ¼­ ¾Ë°í Àְųª ÃßÃøÇØ¾ß ÇÑ´Ù. . ´þ¾î¾²±â ¿øÇÏ´Â ÁÖ¼ÒÀÇ À§Ä¡(¿¹: ¸®ÅÏÁÖ¼Ò) . ¾²°íÀÚ ÇÏ´Â °ª(¿¹: °ø°ÝÀÚÀÇ ½©ÄÚµå ÁÖ¼Ò) . Æ÷¸ä½ºÆ®¸µ±îÁö ³»·Á°¡±âÀ§ÇØ ÇÊ¿äÇÑ ¹ÙÀÌÆ®(ÀÌ Á¤º¸´Â ¹öÆÛ¿À¹öÇ÷ο쿡¼­´Â ÇÊ¿ä¾ø´Â °ÍÀÌ¿´´Ù.) ¸¸¾à Ãâ·ÂÀÌ °ø°ÝÀÚ¿¡°Ô º¸³»Áö¸é, °ø°ÝÀÚ´Â ½ºÅÃÀ» ÀÐÀ»¼ö ÀÖ´Ù. À̰ÍÀº °ø°ÝÀÚ°¡ À§ÀÇ °ªÀ» ÃßÃøÇϱ⠽±°ÔÇÑ´Ù. ¿ø·¡ ¾Ë·ÁÁø wu-ftpd¸¦ À§ÇÑ expolitÄÚµå´Â À̰ÍÀ» ã´Â°ÍÀ» ÀÚµ¿È­ Çß´Ù. ÁøÁ¤ÇÑ ½ºÅ©¸³Æ®±âƼ expolitÀÌ´Ù.