======================================================== "¹ÙÀ̳ʸ® ÆÄÀÏÀ» ºÐ¼®ÇÏ¿© ¼Ò½º·Î ¸¸µé±â" 2002/ 07/ 05 NaNu9 in Null@Root NaNuIX@null2root.org ======================================================== o. ¹«ÇÑÇÑ »ðÁú ÈçÈ÷ ½ÇÀü¿¡¼­ ¹ÙÀ̳ʸ®¸¸ ÀÖ´Â Ãë¾àÇÁ·Î±×·¥ÀÌ ÁÖ¾îÁý´Ï´Ù. °©°©ÇÏÁÒ.. Çѹø ºÎµúÇô º¸°Ú½À´Ï´Ù. ¹ÙÀ̳ʸ® ÇÁ·Î±×·¥À» ºÐ¼®Çؼ­ ¼Ò½º¸¦ ¸¸µå´Â ¹æ¹ý(?À̶ó±â º¸´Ù °úÁ¤)°ú ºÐ¼®ÇÏ´Â ¹æ¹ýÀ» ã¾Æº¸°Ú½À´Ï´Ù. ÀÌ·¸°Ô ¹«½ÄÇÏ°Ô ´ýºô¼ö Àִ°ÍÀº C ¾ð¾îÀÇ ¿¹¾à¾î(Reserved Word)°¡ ¸î°³ ¾ÊµÇ°í ´ëºÎºÐÀÌ ÇÔ¼ö·Î ÀÌ·ç¾îÁ® Àֱ⠶§¹®¿¡ ÇÔ¼öÀÇ ±¸¼ºÀ¸·Î ¼Ò½º¸¦ ¸¸µé¾î °¡´Â ¹æ¹ýÀÔ´Ï´Ù. À̹ø¿¡ ¼±ÅÃÇÑ ÇÁ·Î±×·¥Àº ±æÀ̵µ ¸¸¸¸Ä¡ ¾ÊÀº ·¹º§7->8 ÇÁ·Î±×·¥ÀÔ´Ï´Ù. -r-sr-xr-x 1 level8 level7 15878 Jun 25 00:12 yupgigirl ÀÌ·¸°Ô µÇ¾î Àֳ׿ä 1. ¸ÕÀú ½ÇÇàÀ» Çؼ­ ¾î¶»°Ô µ¹¾Æ°¡´ÂÁö °£´ÜÇÏ°Ô »ìÆ캸°Ú½À´Ï´Ù. ½ÇÇà¿¡ ¾Õ¼­ ±æ°Ô ÀÔ·ÂÇϱ⠹ø°Å·Î¿ì´Ï ln -s /home/level7/yupgigirl lvl08 ÀÌ·¸°Ô °£´ÜÇÏ°Ô ¸µÅ©¸¦ ÇصΰڽÀ´Ï´Ù. ./lvl08 200 ¾È³çÇϼ¼¿ä. (null)´Ô! À̸§ : qazwsxedcrfv <-- ¾Æ¹«²¨³ª ÀÔ·ÂÇغ½. ´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â 20°³ ÀÔ´Ï´Ù. Input char : asdfghjkl Input char : Input char : Input char : 123 Input char : 12 Input char : 12 ´ç½ÅÀÌ ÀÔ·ÂÇÑ ´Ü¾î´Â afj <-- ÀԷ¿¡ ´ëÇÏ¿© Ãâ·ÂÀÌ...°Ç³Ê¶Ü(?) dhlwtsgxbdfsg 32ÀÔ´Ï´Ù. Èì... ÀÌ·¸°Ô µ¹¾Æ°¡´Â ÇÁ·Î±×·¥ À̶ó´Â°Í ¹Û¿¡... ¹¹°¡ ¹ºÁö ¸ð¸£°Ú³×¿ä. ÀÚ.. ÀÌÁ¦ºÎÅÍ º»°ÝÀûÀ¸·Î ºÐ¼®À» ÇÏ¿© ¼Ò½ºÇÁ·Î±×·¥À¸·Î ¸¸µé¾î º¸°Ú½À´Ï´Ù. 2. ÀÌÁ¦ ¹ÙÀ̳ʸ® ÇÁ·Î±×·¥À» ºÐ¼®ÇØ º¸°Ú½À´Ï´Ù. ¿©±â¼­ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥Àº ÀϹÝÀûÀ¸·Î Á¦°øµÇ¾î ÀÖ´Â objdump¿Í gdb¸¦ »ç¿ëÇÕ´Ï´Ù. ¸ÕÀú objdump -S lvl08À» ÇÏ¿© ÇÁ·Î±×·¥À» ¿ª¾î¼Àºí ½ÃÄÑ º¾´Ï´Ù. ¿©±â¿¡¼­ »ç¿ëÀÚ ÇÔ¼ö°¡ ¾î¶²°ÍÀÌ ÀÖ´ÂÁö ºÐ¼®ÇÕ´Ï´Ù. Message, print_total, main ÀÌ Àֳ׿ä. Á»´õ ¼¼ºÎÀûÀ¸·Î µé¾î°¡ º¸°Ú½À´Ï´Ù. 3. objdump¿¡¼­´Â Ãâ·Â µÇÁö ¾Ê´ø ÇÔ¼öÀÇ À̸§±îÁö Ãâ·ÂÇØÁÖ´Â gdb¸¦ µ¹·Á º¸°Ú½À´Ï´Ù. shell> $ gdb ./lvl08 gdb¿¡¼­ ¿ª¾î¼ÀºíÀ» ½ÃÄÑ º¸°Ú½À´Ï´Ù. disas Message ¸¦ Çغ¸´Ï ´ÙÀ½°ú °°ÀÌ ³ª¿À³×¿ä... 0x8048730 : push %ebp 0x8048731 : mov %esp,%ebp 0x8048733 : sub $0x8,%esp 0x8048736 : sub $0x4,%esp <-- ¿©±â±îÁö´Â C ÇÔ¼öÀÇ ¿øÇüÀÔ´Ï´Ù. 0x8048739 : sub $0x8,%esp 0x804873c : pushl 0x8(%ebp) 0x804873f : call 0x80485c8 0x8048744 : add $0xc,%esp 0x8048747 : mov %eax,%eax 0x8048749 : push %eax 0x804874a : pushl 0x8(%ebp) 0x804874d : push $0x1 0x804874f : call 0x8048568 0x8048754 : add $0x10,%esp 0x8048757 : sub $0xc,%esp 0x804875a : pushl 0x8049c44 0x8048760 : call 0x8048578 0x8048765 : add $0x10,%esp 0x8048768 : leave <-- ÇÔ¼ö¸¦ ³¡³»´Â ºÎºÐ ÀÔ´Ï´Ù. 0x8048769 : ret À½.. Message¶ó´Â ÇÔ¼ö¿¡´Â strlen, write, fflush ÀÌ·¸°Ô 3°¡ÁöÀÇ ÇÔ¼ö°¡ »ç¿ëµÇ¾ú³×¿ä. °¢°¢ÀÇ ÇÔ¼ö¿¡ ´ëÇÑ ±âº»ÀûÀÎ ±¸¼ºÀÌ ¾î¶»°Ô µÇ´ÂÁö ¾Ë¾Æ º¸°Ú½À´Ï´Ù. ´Ù ¾Æ´Â ¹æ¹ýÀ¸·Î ¸®´ª½ºÀÇ man ¸í·ÉÀ» »ç¿ëÇÏ¸é µË´Ï´Ù. man strlenÀ» Çغ¸´Ï size_t strlen(const char *s); ¹®ÀÚ¿­ ±æÀ̸¦ °è»êÇÏ´Â ÇÔ¼ö·Î½á ³¡ÀÌ `\0'ÀÎ ¹®ÀÚ¸¦ »©°í ¹®ÀÚ¿­ sÀÇ ±æÀ̸¦ °è»êÇؼ­ µ¹·ÁÁÖ´Â ÇÔ¼ö³×¿ä. ´ÙÀ½Àº man write¸¦ Çغ¸°Ú½À´Ï´Ù. ÀÌ write´Â ¸í·Éµµ ÀÖ°í ÇÔ¼öµµ ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î man -a write¸¦ ÇÏ¿© Q¸¦ ´©¸£¸é ÇÔ¼ö¿¡ ´ëÇÑ ºÎºÐÀ» º¼¼ö ÀÖ½À´Ï´Ù. ssize_t write(int fd, const void *buf, size_t count); ¸¶Âú°¡Áö·Î man fflush¸¦ Çϸé int fflush(FILE *stream); ¶ó´Â °ÍÀ» ¾Ë¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½Àº ¿ª¾î¼Àºí ¸®½ºÆ®¿Í ÇÔ¼öÀÇ ¿øÇüÀ» ¾î¶»°Ô ¿¬°áÇÒ±î¿ä? ÀÌ°ÍÀº C ÄÄÆÄÀÏ·¯°¡ ±ÔÄ¢À» °¡Áö°í ÀÖ½À´Ï´Ù. C ¿¡´Â 2°¡ÁöÀÇ º¯¼öÀü´Þ ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. Çϳª´Â Á÷Á¢ °ªÀ» Àü´ÞÇÏ´Â ¹æ¹ý°ú, Æ÷ÀÎÆ®¸¦ Àü´ÞÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. Áï size_t strlen(const char *s); ÀÌ ÇÔ¼öÀÇ s º¯¼ö¸¦ Àü´ÞÀ» ÇÏ´Â ¹æ¹ýÀ¸·Î º¯¼öÀÇ ¹øÁö¸¦ ½ºÅÿ¡ ÀúÀåÇÏ¿© ½ÇÇàÇÔ¼ö¸¦ call ÇÏ¿© ½ÇÇàÇÏ´Â °Í ÀÔ´Ï´Ù. º¯¼öÀÇ ¹øÁö¸¦ Àü´ÞÇÏ¿©, ÀÌ ¹øÁö¿¡ ±×·± µ¥ÀÌŸ°¡ ÀÖ´Ù.. ÀÌ·±½ÄÀÌÁÒ. ÀÚ.. ±×·³ ºÐ¼®µÈ ¿ª¾î¼Àºí ¸®½ºÆ®¸¦ º¸°Ú½À´Ï´Ù. ¹Ù·Î À̺κÐÀÌÁÒ. 0x8048739 : sub $0x8,%esp <-- dummy 0x804873c : pushl 0x8(%ebp) <-- parameter 0x804873f : call 0x80485c8 0x8048744 : add $0xc,%esp size_t strlen(const char *s); ¿¡´Â Àü´Þº¯¼ö°¡ Çϳª ¹Û¿¡ ¾ø´Âµ¥ ½ºÅÃÀ» »©ÁÖ´Â ±º¿ä.. À̺κÐÀÌ gccÀÇ ¹öÁ¯¿¡ µû¶ó¼­ Ãß°¡µÇ´Â dummy ºÎºÐÀÔ´Ï´Ù. 0x804873c : pushl 0x8(%ebp) <-- À̺κÐÀÌ *s ÀÇ ¹øÁöÀÔ´Ï´Ù. ÀÌ Ç¥ÇöÀº ebp ·¹Áö½ºÅÍ + 8 ¹øÁöÀÇ ³»¿ëÀ» ½ºÅÿ¡ ÀúÀåÇ϶ó´Â ÀÇ¹Ì ÀÔ´Ï´Ù. ¿¨.. ±×·±µ¥ 0x8(%ebp) °¡ ¾îµðÂë Àϱî¿ä? ÀÚ.. ÀÌ Message ÇÔ¼ö°¡ ½ÇÇàµÇ´Â ¸Þ¸ð¸®ÀÇ ±¸Á¶¸¦ ºÐ¼®Çغ¸°Ú½À´Ï´Ù. 0x0000 +---------------------+ <-- ¸Þ¸ð¸®ÀÇ ³·Àº ¹øÁö | | ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ | dummy | 4 Byte [ebp] +---------------------+ <-- ÇÁ·Î±×·¥ ½ÃÀ۽à [esp] ·¹Áö½ºÅÍ | ebp | 4 Byte +---------------------+ | RET Address | <-- Message() ÇÔ¼ö°¡ ½ÇÇàµÉ¶§ [RET] [ebp]+8 +---------------------+ | str | <-- Message(*str) +---------------------+ ¿©±â¼­ str Àº ÀÓÀÇ·Î ºÙÀÎ º¯¼ö¸í ÀÔ´Ï´Ù. | | ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ | | <-- StackÀÇ ÇÏÀ§ 0xFFFF +---------------------+ <-- ¸Þ¸ð¸®ÀÇ ³ôÀº ¹øÁö strÀ» ¹Ù·Î ½ºÅÿ¡ ÀúÀåÇϳ׿ä. ±×·¡¼­ size_t strlen(const char *s); ÇÔ¼ö´Â strlen(*str); À¸·Î µË´Ï´Ù. ±×¸®°í strlen()¸¦ ½ÇÇàÇÑ °á°ú´Â eax ·¹Áö½ºÅÍ·Î µ¹·Á ÁÝ´Ï´Ù. ÀÌ°ÍÀ» º¸´Ï Message(*str)À¸·Î ±¸¼ºÀÌ µÈ´Ù´Â °ÍÀ» ¾Ë¼ö°¡ ÀÖ½À´Ï´Ù. ´ÙÀ½Àº ssize_t write(int fd, const void *buf, size_t count); °¡ ¾î¶»°Ô ÄÄÆÄÀÏ µÇ¾î ÀÖ´ÂÁö º¸°Ú½À´Ï´Ù. 0x8048747 : mov %eax,%eax <-- strlenÀ» ½ÇÇàÇÑ °á°ú 0x8048749 : push %eax <-- count 0x804874a : pushl 0x8(%ebp) <-- *buf = str 0x804874d : push $0x1 <-- fd = 1 0x804874f : call 0x8048568 0x8048754 : add $0x10,%esp µû¶ó¼­ ssize_t write(int fd, const void *buf, size_t count); ÇÔ¼ö´Â write(1, str, strlen(str)); ÀÌ·¸°Ô µË´Ï´Ù. ´ÙÀ½Àº int fflush(FILE *stream); ºÎºÐÀ» »ìÆ캸°Ú½À´Ï´Ù. 0x8048757 : sub $0xc,%esp <-- dummy 0x804875a : pushl 0x8049c44 <-- stdout (¿Ö stdoutÀ̳ı¸¿ä? ¼³¸íÀº ¾Æ·¡¿¡...) 0x8048760 : call 0x8048578 0x8048765 : add $0x10,%esp ¿©±â¿¡¼­ pushl 0x8049c44 ÀÌ ÀÖ±º¿ä. ÀÌ°ÍÀº objdump -x lvl08 À» ÇÏ¿© ÇØ´ç¹øÁö°¡ ÀÏÄ¡ÇÏ´Â ºÎºÐÀ» ã½À´Ï´Ù. 08049c44 g O .bss 00000004 stdout@@GLIBC_2.0 stdoutÀ̶ó´Â ¹øÁö¿Í ÀÏÄ¡ÇÏ´Â ±º¿ä.. µû¶ó¼­ fflush(stdout); À¸·Î µË´Ï´Ù. ÀüüÀûÀ¸·Î Á¤¸®¸¦ Çغ¸¸é ´ÙÀ½ÀÇ ÇÔ¼ö°¡ ¸¸µé¾î Áý´Ï´Ù. void Message(char *str) { write(1, str, strlen(str)); fflush(stdout); } ´ÙÀ½Àº print_total ÇÔ¼ö¸¦ ºÐ¼®ÇØ º¸°Ú½À´Ï´Ù. gdb¿¡¼­ disas print_total À¸·Î ¿ª¾î¼ÀºíÀ» ÇÕ´Ï´Ù. ±×¸®°í °¢ ÇØ´ç ÇÁ·Î±×·¥¿¡¼­ ºÐ¼®À» Çغ¸°Ú½À´Ï´Ù. (gdb) disas print_total 0x804876c : push %ebp 0x804876d : mov %esp,%ebp 0x804876f : sub $0x78,%esp 0x8048772 : pushl 0xc(%ebp) 0x8048775 : push $0x8048a60 0x804877a : push $0x100 0x804877f : push $0x8049c80 0x8048784 : call 0x80485f8 0x8048789 : add $0x10,%esp 0x804878c : sub $0xc,%esp 0x804878f : push $0x8049c80 0x8048794 : call 0x8048730 0x8048799 : add $0x10,%esp Áß°£ »ý·« 0x80487c8 : sub $0xc,%esp 0x80487cb : pushl 0x8049c48 0x80487d1 : call 0x8048548 0x80487d6 : add $0x10,%esp 0x80487d9 : mov %eax,%eax 0x80487db : mov %al,0xffffff97(%ebp) Áß°£ »ý·« 0x8048851 : leave 0x8048852 : ret ´ÙÀ½.. print_total¶ó´Â ÇÔ¼ö¿¡´Â snprintf, Message, fgetc ÀÌ·¸°Ô 3°¡ÁöÀÇ ÇÔ¼ö°¡ »ç¿ëµÇ¾ú³×¿ä. Áߺ¹µÇ´Â ÇÔ¼öµéÀÌ ³ª¿À´Âµ¥ °³º°ÀûÀ¸·Î ÇÔ¼ö¸¦ ºÐ¼®Çغ¸°Ú½À´Ï´Ù. ¸ÕÀú print_total ÇÔ¼ö°¡ ½ÇÇàµÉ¶§ ´ë·«ÀûÀÎ ¸Þ¸ð¸®ÀÇ ±¸Á¶¸¦ ºÐ¼®ÇØ º¸°Ú½À´Ï´Ù. 0x0000 +---------------------+ <-- ¸Þ¸ð¸®ÀÇ ³·Àº ¹øÁö | | ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ | | ff8c +---------------------+ | int | ff90 +---------------------+ | char * | ff97 +---------------------+ | char | 4byte ff98 +---------------------+ | char | 90 byte +---------------------+ | dummy | 8 Byte [ebp] +---------------------+ <-- ÇÁ·Î±×·¥ ½ÃÀ۽à [ebp] ·¹Áö½ºÅÍ | ebp | 4 Byte +---------------------+ | RET Address | <-- print_total(par1, par2) ÇÔ¼ö°¡ ½ÇÇàµÉ¶§ [RET] [ebp]+8 +---------------------+ | par1 | <-- parameter 1 [ebp]+c +---------------------+ ¿©±â¼­ par1,2 ´Â ÀÓÀÇ·Î ºÙÀÎ º¯¼ö¸í ÀÔ´Ï´Ù. | par2 | <-- parameter 2 +---------------------+ | | ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ | | <-- StackÀÇ ÇÏÀ§ 0xFFFF +---------------------+ <-- ¸Þ¸ð¸®ÀÇ ³ôÀº ¹øÁö ±×·¯¸é snprintf¸¦ ºÐ¼®Çغ¸°Ú½À´Ï´Ù. ÇÔ¼öÀÇ ¿øÇüÀº ´ÙÀ½°ú °°½À´Ï´Ù. int snprintf(char *str, size_t size, const char *format, ...); ¿ª¾î¼ÀºíµÈ »óŸ¦ º¸°Ú½À´Ï´Ù. 0x8048772 : pushl 0xc(%ebp) <-- par2 0x8048775 : push $0x8048a60 <-- format = printÇÒ Æ÷¸ä 0x804877a : push $0x100 <-- size = 0x100 0x804877f : push $0x8049c80 <-- pointer = tmp_buf 0x8048784 : call 0x80485f8 0x8048789 : add $0x10,%esp ¿©±â¿¡¼­ pushl 0x8048a60 ÀÌ ÀÖ±º¿ä. ÀÌ°ÍÀº objdump -s lvl08 À» ÇÏ¿© ÇØ´ç¹øÁö°¡ ÀÏÄ¡ÇÏ´Â ºÎºÐÀ» ã½À´Ï´Ù. Contents of section .rodata: 8048a60 b4e7bdc5 c0cc20c0 d4b7c2c7 d220bcf6 ...... ...... .. 8048a70 20c0d6b4 c220b9ae c0da20bc f6b4c220 .... .... .... 8048a80 2564b0b3 20c0d4b4 cfb4d92e 0d0a0a00 %d.. ........... ¹º°¡¸¦ Ãâ·ÂÇÏ´Â Æ÷¸äÀε¥ Àú »óÅ·δ ¹ºÁö ¸ð¸£°Ú³×¿ä. ÇÁ·Î±×·¥À» °£´ÜÈ÷ Å×½ºÆ® ÇÒ¶§ Ãâ·ÂÇÑ »óŸ¦ ±âÁØÀ¸·Î ¸¸µé¾î º¸¸é "´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â %d°³ ÀÔ´Ï´Ù.\n" Àεí ÇÕ´Ï´Ù. ´ÙÀ½Àº pushl $0x8049c80 ÀÌ ÀÖ±º¿ä. ÀÌ°ÍÀº objdump -x lvl08 À» ÇÏ¿© ÇØ´ç¹øÁö°¡ ÀÏÄ¡ÇÏ´Â ºÎºÐÀ» ã½À´Ï´Ù. 08049c80 g O .bss 00000100 tmp_buf µû¶ó¼­ int snprintf(char *str, size_t size, const char *format, ...); ÇÔ¼ö´Â snprintf(tmp_buf, sizeof(tmp_buf), "´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â %d°³ ÀÔ´Ï´Ù.\n", par2); ÀÌ·¸°Ô ¸¸µé¾î Áý´Ï´Ù. ´ÙÀ½Àº Message¸¦ ºÐ¼®ÇØ º¸°Ú½À´Ï´Ù. ±×·±µ¥ ÀÌ ÇÔ¼ö´Â ÀúÀ§¿¡¼­ ºÐ¼®À» Çß¾úÁÒ. ÇÔ¼öÀÇ ¿øÇüÀÌ void Message(char *str); ÀÌ·¸°Ô µÇ¾ú¾úÁÒ. ¿ª¾î¼ÀºíµÈ »óŸ¦ º¸°Ú½À´Ï´Ù. 0x804878c : sub $0xc,%esp <-- Dummy 0x804878f : push $0x8049c80 <-- ¹º°¡¸¦ Ãâ·ÂÇÒ ¸Þ½ÃÁöÀÇ ÁÖ¼ÒÀÌ°ÚÁÒ. 0x8048794 : call 0x8048730 0x8048799 : add $0x10,%esp ¿©±â¿¡¼­µµ pushl $0x8049c80 ÀÌ ÀÖ±º¿ä. ÀÌ°ÍÀº objdump -x lvl08 À» ÇÏ¿© ÇØ´ç¹øÁö°¡ ÀÏÄ¡ÇÏ´Â ºÎºÐÀ» ã½À´Ï´Ù. 08049c80 g O .bss 00000100 tmp_buf tmp_buf¸¦ Ãâ·ÂÇϴ°ÍÀ» ¾Ë¼ö°¡ Àֳ׿ä. ±×·¯´Ï±î snprintf()¿¡¼­ Á¶ÇÕÇسõÀº ¹öÆÛÀÇ µ¥ÀÌŸ¸¦ Ãâ·ÂÇÏ´Â ºÎºÐÀ̱º¿ä. Message(tmp_buf); ÀÌ·¸°Ô ÇÁ·Î±×·¥ µÇ¾îÀÖ¾ú°Ú³×¿ä. ´ÙÀ½Àº fgetc ÇÔ¼ö°¡ ¹ºÁö ¾Ë¾Æº¸°Ú½À´Ï´Ù. ¸ÕÀú ÀÌ ÇÔ¼öÀÇ ¿øÇüÀÌ ¾î¶»°Ô µÇ¾îÀÖ´ÂÁö ¾Ë¾ÆºÁ¾ßÁÒ. man fgetc¸¦ Çغ¸°Ú½À´Ï´Ù. int fgetc(FILE *stream); ÀÌ·¸°Ô ±¸¼ºµÇ¾î Àֳ׿ä. ¸¶Âù°¡Áö·Î ¿ª¾î¼ÀºíµÈ »óŸ¦ º¸°Ú½À´Ï´Ù. 0x80487c8 : sub $0xc,%esp <-- Dummy 0x80487cb : pushl 0x8049c48 <-- stdin 0x80487d1 : call 0x8048548 0x80487d6 : add $0x10,%esp ¿©±â¿¡¼­ pushl 0x8049c48 ÀÌ ÀÖ±º¿ä. ÀÌ°ÍÀº objdump -x lvl08 À» ÇÏ¿© ÇØ´ç¹øÁö°¡ ÀÏÄ¡ÇÏ´Â ºÎºÐÀ» ã½À´Ï´Ù. 08049c48 g O .bss 00000004 stdin@@GLIBC_2.0 stdinÀ̶ó´Â ¹øÁö¿Í ÀÏÄ¡ÇÏ´Â ±º¿ä.. µû¶ó¼­ fgetc(stdin); À¸·Î µË´Ï´Ù. ÀÌ»ó ºÐ¼®ÇÑ 3°¡Áö ÇÔ¼ö¸¦ ±âÁØÀ¸·Î print_total() ÇÔ¼ö¸¦ ºÐ¼®ÇØ º¸°Ú½À´Ï´Ù. (gdb) disas print_total 0x804876c : push %ebp 0x804876d : mov %esp,%ebp 0x804876f : sub $0x78,%esp <-- ¿©±â±îÁö´Â C ÇÔ¼öÀÇ ¿øÇüÀÔ´Ï´Ù. +-> ³»ºÎ º¯¼ö¸¦ »ç¿ëÇϴ°ÍÀ» ¾Ë¼ö°¡ ÀÖ½À´Ï´Ù. char ff98[90]; char ff97; char *ff90; int ff8c; snprintf(tmp_buf, sizeof(tmp_buf), "´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â %d°³ ÀÔ´Ï´Ù.\n", par2); 0x8048772 : pushl 0xc(%ebp) 0x8048775 : push $0x8048a60 0x804877a : push $0x100 0x804877f : push $0x8049c80 0x8048784 : call 0x80485f8 0x8048789 : add $0x10,%esp Message(tmp_buf); 0x804878c : sub $0xc,%esp 0x804878f : push $0x8049c80 0x8048794 : call 0x8048730 0x8048799 : add $0x10,%esp ff90 = ff98; 0x804879c : lea 0xffffff98(%ebp),%eax <-- (ebp-0x68)¹øÁö¸¦ eax·Î °¡Á®¿È 0x804879f : mov %eax,0xffffff90(%ebp) <-- eax ³»¿ëÀ» (ebp-0x70)¹øÁö¿¡ ÀúÀåÇÔ for(ff8c=0; ff8c < par2; ff8c++) { 0x80487a2 : movl $0x0,0xffffff8c(%ebp) <-- ff8c = 0 0x80487a9 : lea 0x0(%esi),%esi 0x80487ac : mov 0xffffff8c(%ebp),%eax 0x80487af : cmp 0xc(%ebp),%eax <-- ff8c ¿Í par2 ¸¦ ºñ±³ 0x80487b2 : jl 0x80487b8 0x80487b4 : jmp 0x8048820 0x80487b6 : mov %esi,%esi Message("Input char : "); 0x80487b8 : sub $0xc,%esp 0x80487bb : push $0x8048a90 0x80487c0 : call 0x8048730 0x80487c5 : add $0x10,%esp ff97 = fgetc(stdin); 0x80487c8 : sub $0xc,%esp 0x80487cb : pushl 0x8049c48 0x80487d1 : call 0x8048548 0x80487d6 : add $0x10,%esp 0x80487d9 : mov %eax,%eax 0x80487db : mov %al,0xffffff97(%ebp) *(ff90++) = ff97; 0x80487de : mov 0xffffff90(%ebp),%edx 0x80487e1 : mov 0xffffff97(%ebp),%al 0x80487e4 : mov %al,(%edx) 0x80487e6 : lea 0xffffff90(%ebp),%eax 0x80487e9 : incl (%eax) ff97 = fgetc(stdin); 0x80487eb : sub $0xc,%esp 0x80487ee : pushl 0x8049c48 0x80487f4 : call 0x8048548 0x80487f9 : add $0x10,%esp 0x80487fc : mov %eax,%eax 0x80487fe : mov %al,0xffffff97(%ebp) ff97 = fgetc(stdin); 0x8048801 : sub $0xc,%esp 0x8048804 : pushl 0x8049c48 0x804880a : call 0x8048548 0x804880f : add $0x10,%esp 0x8048812 : mov %eax,%eax 0x8048814 : mov %al,0xffffff97(%ebp) 0x8048817 : lea 0xffffff8c(%ebp),%eax 0x804881a : incl (%eax) <-- ff8c++; 0x804881c : jmp 0x80487ac 0x804881e : mov %esi,%esi } *ff90 = 0x00; 0x8048820 : mov 0xffffff90(%ebp),%eax 0x8048823 : movb $0x0,(%eax) snprintf(tmp_buf, sizeof(tmp_buf), "´ç½ÅÀÌ ÀÔ·ÂÇÑ ´Ü¾î´Â %sÀÔ´Ï´Ù.\n", ff98); 0x8048826 : lea 0xffffff98(%ebp),%eax 0x8048829 : push %eax 0x804882a : push $0x8048aa0 0x804882f : push $0x100 0x8048834 : push $0x8049c80 0x8048839 : call 0x80485f8 0x804883e : add $0x10,%esp Message(tmp_buf); 0x8048841 : sub $0xc,%esp 0x8048844 : push $0x8049c80 0x8048849 : call 0x8048730 0x804884e : add $0x10,%esp 0x8048851 : leave <-- ÇÔ¼ö¸¦ ³¡³»´Â ºÎºÐ ÀÔ´Ï´Ù. 0x8048852 : ret C ·Î ¹ø¿ªµÈ ºÎºÐÀ» Çϳª¾¿ ¸ð¾Æ¼­ ¼Ò½º·Î ¸¸µé¾î º¸°Ú½À´Ï´Ù. void print_total(char *par1, int par2) { char ff98[90]; char ff97; char *ff90; int ff8c; snprintf(tmp_buf, sizeof(tmp_buf), "´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â %d°³ ÀÔ´Ï´Ù.\n", par2); Message(tmp_buf); ff90 = ff98; for(ff8c=0; ff8c: push %ebp 0x8048855 : mov %esp,%ebp 0x8048857 : sub $0x48,%esp int fff4 = 0x14; char ffd8[10]; <-- buff[10] int ffd4; int ffd0; int ffcc; int ffc8; int ffc4 = 0x10; int ffc0; 0x804885a : movl $0x14,0xfffffff4(%ebp) <-- fff4 = 0x14 0x8048861 : movl $0x10,0xffffffc4(%ebp) <-- ffc4 = 0x10 for( ffc0 = 0x00; ffc0 < argc; ffc0++) { 0x8048868 : movl $0x0,0xffffffc0(%ebp) <-- ffc0 = 0x00 0x804886f : nop 0x8048870 : mov 0xffffffc0(%ebp),%eax 0x8048873 : cmp 0x8(%ebp),%eax <-- ffc0 ¿Í argc ÀÇ ºñ±³. 0x8048876 : jl 0x804887c 0x8048878 : jmp 0x80488b8 memset(argv[ffc0], 0, strlen(argv[ffc0])); 0x804887a : mov %esi,%esi 0x804887c : sub $0x4,%esp 0x804887f : sub $0x8,%esp 0x8048882 : mov 0xffffffc0(%ebp),%eax 0x8048885 : imul $0x4,%eax,%edx 0x8048888 : mov 0xc(%ebp),%eax 0x804888b : pushl (%eax,%edx,1) 0x804888e : call 0x80485c8 0x8048893 : add $0xc,%esp 0x8048896 : mov %eax,%eax 0x8048898 : push %eax 0x8048899 : push $0x0 0x804889b : mov 0xffffffc0(%ebp),%eax 0x804889e : imul $0x4,%eax,%edx 0x80488a1 : mov 0xc(%ebp),%eax 0x80488a4 : pushl (%eax,%edx,1) 0x80488a7 : call 0x8048608 0x80488ac : add $0x10,%esp 0x80488af : lea 0xffffffc0(%ebp),%eax 0x80488b2 : incl (%eax) 0x80488b4 : jmp 0x8048870 } 0x80488b6 : mov %esi,%esi <-- ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ 4ÀÇ ¹è¼ö·Î ¸¸µé±â 0x80488b8 : nop À§Çؼ­ »ðÀÔÇÑ dummy code for(ffc0=0; environ[ffc0]; ffc0++) 0x80488b9 : movl $0x0,0xffffffc0(%ebp) <-- ffc0 = 0x00 0x80488c0 : mov 0xffffffc0(%ebp),%eax 0x80488c3 : imul $0x4,%eax,%ecx 0x80488c6 : mov 0x8049c40,%edx 0x80488cc : mov 0xffffffc0(%ebp),%eax 0x80488cf : cmp (%edx,%ecx,1),%eax 0x80488d2 : jb 0x80488d8 0x80488d4 : jmp 0x8048918 memset(environ[ffc0], 0, strlen(environ[ffc0])); 0x80488d6 : mov %esi,%esi 0x80488d8 : sub $0x4,%esp 0x80488db : sub $0x8,%esp 0x80488de : mov 0xffffffc0(%ebp),%eax 0x80488e1 : imul $0x4,%eax,%edx 0x80488e4 : mov 0x8049c40,%eax 0x80488e9 : pushl (%eax,%edx,1) 0x80488ec : call 0x80485c8 0x80488f1 : add $0xc,%esp 0x80488f4 : mov %eax,%eax 0x80488f6 : push %eax 0x80488f7 : push $0x0 0x80488f9 : mov 0xffffffc0(%ebp),%eax 0x80488fc : imul $0x4,%eax,%edx 0x80488ff : mov 0x8049c40,%eax 0x8048904 : pushl (%eax,%edx,1) 0x8048907 : call 0x8048608 0x804890c : add $0x10,%esp 0x804890f : lea 0xffffffc0(%ebp),%eax 0x8048912 : incl (%eax) <-- ffc0++ 0x8048914 : jmp 0x80488c0 0x8048916 : mov %esi,%esi } // int getpeername(int s, struct sockaddr *name, socklen_t *namelen); if (getpeername(0, ffc8, ffc4)== -1) 0x8048918 : sub $0x4,%esp 0x804891b : lea 0xffffffc4(%ebp),%eax 0x804891e : push %eax 0x804891f : lea 0xffffffc8(%ebp),%eax 0x8048922 : push %eax 0x8048923 : push $0x0 0x8048925 : call 0x80485a8 0x804892a : add $0x10,%esp 0x804892d : mov %eax,%eax 0x804892f : cmp $0xffffffff,%eax 0x8048932 : jne 0x8048968 snprintf(tmp_buf, sizeof(tmp_buf), "%d ¾È³çÇϼ¼¿ä. (null)´Ô!\n", getlogin()); 0x8048934 : call 0x8048618 0x8048939 : mov %eax,%eax 0x804893b : push %eax 0x804893c : push $0x8048ac1 0x8048941 : push $0x100 0x8048946 : push $0x8049c80 0x804894b : call 0x80485f8 0x8048950 : add $0x10,%esp Message(tmp_buf); 0x8048953 : sub $0xc,%esp 0x8048956 : push $0x8049c80 0x804895b : call 0x8048730 0x8048960 : add $0x10,%esp 0x8048963 : jmp 0x80489a0 0x8048965 : lea 0x0(%esi),%esi } else { // char *inet_ntoa(struct in_addr in); snprintf(tmp_buf, sizeof(tmp_buf), "%d ¾È³çÇϼ¼¿ä. (null)´Ô!\n", inet_ntoa(ffcc)); 0x8048968 : sub $0xc,%esp 0x804896b : pushl 0xffffffcc(%ebp) 0x804896e : call 0x8048588 0x8048973 : add $0x10,%esp 0x8048976 : mov %eax,%eax 0x8048978 : push %eax 0x8048979 : push $0x8048ae0 0x804897e : push $0x100 0x8048983 : push $0x8049c80 0x8048988 : call 0x80485f8 0x804898d : add $0x10,%esp Message(tmp_buf); 0x8048990 : sub $0xc,%esp 0x8048993 : push $0x8049c80 0x8048998 : call 0x8048730 200 ¾È³çÇϼ¼¿ä. (null)´Ô! 0x804899d : add $0x10,%esp } Message("À̸§ : "); 0x80489a0 : sub $0xc,%esp 0x80489a3 : push $0x8048b0a 0x80489a8 : call 0x8048730 À̸§: 0x80489ad : add $0x10,%esp fgets(ffd8, sizeof(ffd8), stdin); // 30 byte 0x80489b0 : sub $0x4,%esp 0x80489b3 : pushl 0x8049c48 <-- stdin 0x80489b9 : push $0x1e <-- 30 byte 0x80489bb : lea 0xffffffd8(%ebp),%eax 0x80489be : push %eax 0x80489bf : call 0x80485b8 À̸§ ÀÔ·ÂÀ» ¹Þ´Â°÷. 0x80489c4 : add $0x10,%esp print_total(ffd8, fff4); 0x80489c7 : sub $0x8,%esp 0x80489ca : pushl 0xfffffff4(%ebp) 0x80489cd : lea 0xffffffd8(%ebp),%eax 0x80489d0 : push %eax 0x80489d1 : call 0x804876c 0x80489d6 : add $0x10,%esp 0x80489d9 : leave 0x80489da : ret } ÀÌ·¸°Ô C ·Î ¹ø¿ªµÈ main ºÎºÐÀ» Çϳª¾¿ ¸ð¾Æ¼­ ¼Ò½º·Î ¸¸µé¾î º¸°Ú½À´Ï´Ù. int main(int argc, char **argv) { int fff4 = 0x14; char ffd8[10]; int ffd4; int ffd0; int ffcc; int ffc8; int ffc4 = 0x10; int ffc0; for( ffc0 = 0x00; ffc0 < argc; ffc0++) memset(argv[ffc0], 0, strlen(argv[ffc0])); for(ffc0=0; environ[ffc0]; ffc0++) memset(environ[ffc0], 0, strlen(environ[ffc0])); /* // int getpeername(int s, struct sockaddr *name, socklen_t *namelen); if (getpeername(0, ffc8, ffc4)== -1) snprintf(tmp_buf, sizeof(tmp_buf), "%d ¾È³çÇϼ¼¿ä. (null)´Ô!\n", getlogin()); Message(tmp_buf); } else { // char *inet_ntoa(struct in_addr in); snprintf(tmp_buf, sizeof(tmp_buf), "%d ¾È³çÇϼ¼¿ä. (null)´Ô!\n", inet_ntoa(ffcc)); Message(tmp_buf); } */ Message("À̸§ : "); fgets(ffd8, 30, stdin); // fgets(ffd8, sizeof(ffd8)+2, stdin); // 30 byte print_total(ffd8, fff4); } ÀÌÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ¿© º»·¡ÀÇ ¿ª¾î¼Àºí ÆÄÀÏ°ú °°Àº »óÅ·Π¸¸µé¾î ÁÝ´Ï´Ù. ÀÌ°ÍÀ» ¸ðµÎ Á¶ÇÕÇÏ¸é ´ÙÀ½ÀÇ ¼Ò½º°¡ ¸¸µé¾î Áý´Ï´Ù. #include #include extern char **environ; char tmp_buf[256]; void Message(char *str) { write(1, str, strlen(str)); fflush(stdout); } void print_total(char *par1, int par2) { char ff98[90]; char ff97; char *ff90; int ff8c; snprintf(tmp_buf, sizeof(tmp_buf), "´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â %d°³ ÀÔ´Ï´Ù.\n", par2); Message(tmp_buf); ff90 = ff98; for(ff8c=0; ff8c #include #include "dumpcode.h" extern char **environ; char tmp_buf[256]; unsigned long get_ret(void) { __asm__("movl %ebx,%eax"); } void Message(char *str) { write(1, str, strlen(str)); fflush(stdout); } void print_total(char *par1, int par2) { char buff[90]; // ff98 char ch; // ff97 char *ptr; // ff90 int i; // ff8c __asm__("push %ebx"); // Save [ebx] register __asm__("movl %ebp,%ebx"); // [ebx] <- [ebp] printf("P Return Address = %x\n", get_ret()+0x04); // Return Address ªO±â __asm__("pop %ebx"); // Restore [ebx] snprintf(tmp_buf, sizeof(tmp_buf), "´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â %d°³ ÀÔ´Ï´Ù.\n", par2); Message(tmp_buf); ptr = buff; for(i=0; i #include #include #include #include #define MAX_NAME_LEN 12 #define DEF_COUNT 20 #define DEF_BUF_LEN 256 extern char **environ; char tmp_buf[DEF_BUF_LEN]; void Message(char *buf) { write(STDOUT_FILENO, buf, strlen(buf)); fflush(stdout); } void print_total(char *name, int count) { char padding[50]; char buf[DEF_COUNT+1], ch, *ptr; int i; snprintf(tmp_buf, DEF_BUF_LEN, "´ç½ÅÀÌ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ¼ö´Â %d°³ ÀÔ´Ï´Ù.\r\n", count); Message(tmp_buf); ptr = buf; for (i=0; i