|
|
|
|
|
|
|
|
|
|
|
|
|
1574, 6/79 |
|
vngkv123 | |||||||
heap¿¡¼ unsafe unlink°¡ Á¶±Ý ÀÌÇØ°¡ ¾ÈµÇ³×¿ë ¤Ð | |||||||
http://www.hackerschool.org/HS_Boards/zboard.php?id=QNA_system&no=1874 [º¹»ç]
Hit : 3955 Date : 2017/05/10 01:27
|
|||||||
ÇØÄð·¯ | Àúµµ Áö±Ý À̰ɺ¸¸é¼ °øºÎÇߴµ¥ glibc-2.25/malloc/malloc.c ÀÇ L4008~L4013¿¡ ÀÖ´Â backward consolidation·çƾÀ» ÀÌ¿ëÇÏ´Â Æ®¸¯À¸·Î º¸À̳׿ä backward consolidation·çƾÀº ¾î¶² ûũ°¡ ÇÁ¸®µÉ¶§, ÀÎÁ¢ÇÑ ¹Ù·Î ÀÌÀü ûũ°¡ ÇÁ¸®µÅÀÖ´Â »óŶó¸é µÎ°³ ûũ¸¦ º´ÇÕÇØ ´õ Å« ûũ·Î °ü¸®ÇÏ´Â ·çƾÀÔ´Ï´Ù ±×Àü¿¡ L1984ÀÇ do_check_inuse_chunk¿¡¼ ¸î°¡Áö assertionÀ» ÇÏ°í, ±× ÇÔ¼ö ¾È¿¡¼ do_check_chunk, do_check_free_chunk ÀÌ·± üũÇÔ¼öµéÀ» Ãß°¡·Î ½ÇÇàÇÕ´Ï´Ù ÀÌ Äڵ忡¼ ¸ÂÃß´Â (P->fd->bk != P || P->bk->fd != P) ÀÌ Á¶°ÇÀº unlink¸ÅÅ©·Î¿¡¼ üũµË´Ï´Ù chunk1ÀÇ prev_size¸¦ º¯°æÇØ chunk0ÀÇ »çÀÌÁ ¼ÓÀδ٠¶ó´Â°Ô Àç¹Õ´ÂÁ¡Àε¥ backward consolidation Äڵ带 º¸¸é /* consolidate backward */ if (!prev_inuse(p)) { prevsize = prev_size (p); size += prevsize; p = chunk_at_offset(p, -((long) prevsize)); unlink(av, p, bck, fwd); } ÀÌ·¸°Ô µÅÀÖ½À´Ï´Ù ±×¸®°í chunk_at_offsetÀº ´Ü¼øÈ÷ µÎ°³ ÀÎÀÚ¸¦ ´õÇÑ°ªÀ» ¸®ÅÏÇÏ´Â ¸ÅÅ©·ÎÇÔ¼öÀÔ´Ï´Ù ±×·¯´Ï±î Èü »ó¿¡¼ÀÇ ÀÌÀü ûũÀÇ À§Ä¡¸¦ ¸µÅ©µå¸®½ºÆ®·Î¼ ã´Â°ÍÀÌ ¾Æ´Ñ, ÇöÀçûũ - ÇöÀçûũ°¡ °®°í ÀÖ´Â prev_size == ÀÌÀüûũÀÇ À§Ä¡ ÀÌ·¸°Ô ã´Â°Ì´Ï´Ù ±× ÀÌÀ¯ ¶§¹®¿¡ prev_size¸¦ 0x80À¸·Î ÁÙÀ̴°̴ϴ٠¿©±â±îÁö°¡ ù¹ø°Áú¹®¿¡ ´ëÇÑ ´äº¯ÀÌ°í µÎ¹ø¤ŠÁú¹®Àº ¾îµð¼ Çò°¥¸®¼Ì´ÂÁö ¾Ë°Í °°Àºµ¥ p->fd->bk == p¿¡¼ p->fd°¡ ¹ÙÀ̳ʸ®ÁÖ¼Ò°í p->fd->bkµµ °á±¹ ¹ÙÀ̳ʸ®¾È¿¡¼ ¿òÁ÷À̴°ǵ¥ ±× °ªÀÌ ¾î¶»°Ô p°¡ µÇ´ÂÁö ¹°¾îº¸½Å°Í°°½À´Ï´Ù ±Ùµ¥ ¿©±â¼ ºñ±³ÇÏ´Â °ªÀ» Á» ºÐ¸®Çؼ »ý°¢ÇؾßÇϴµ¥ p->fd->bk Çϸé chunk0_ptr Àü¿ªº¯¼ö°ÚÁÒ, ±×¸®°í ±× Æ÷ÀÎÅÍ º¯¼ö¿¡ ´ã±ä °ªÀº chunk0_ptrÀÌ °¡¸£Å°´Â Èü ûũÀÔ´Ï´Ù ±×¸®°í == ÀÇ ¿À¸¥ÂÊÀÇ p°¡ °®´Â °ªµµ chunk0_ptrÀÌ °¡¸£Å°´Â ÈüûũÀÔ´Ï´Ù Àúµµ óÀ½¿¡ Çò°¥¸° ºÎºÐÀÌ p->fd->bk¸é °á±¹ ¹ÙÀ̳ʸ®ÁּҾƴѰ¡? Çߴµ¥ ±¸Á¶Ã¼°üÁ¡¿¡¼ ²Ä²ÄÈ÷ »ý°¢Çغ¸½Ã¸é µË´Ï´Ù |
2017/05/14 | |
ÇØÄð·¯ | µÎ¹ø°Áú¹®À» Á»´õ ÀÚ¼¼ÇÏ°Ô ¸»¾¸µå¸®¸é ¿ø·¡ chunk1ÀÇ prev_size´Â 0x90À̴ϱî(malloc'd size 0x80 + malloc header 0x10), ÀÌ°É 0x80À¸·Î Çϸé chunk1ÀÇ previous chunkÀÇ ½ÃÀÛÁ¡ÀÌ chunk1ÀÇ ¹æÇâÀ¸·Î 0x10 ´ç°ÜÁý´Ï´Ù ±×¸®°í, chunk1ÀÇ prev_inuse¸¦ 0À¸·Î Çϸé prev chunk°¡ freeµÈ°Íó·³ ¼ÓÀϼö ÀÖÀ¸´Ï 0x10¹ÙÀÌÆ® ´ç°ÜÁø ½ÃÁ¡¿¡¼ óÀ½ÀÇ chunk0_ptr[2]¿Í chunk0_ptr[3]Àº °¢°¢ p->fd¿Í p->bkÀÔ´Ï´Ù p->fd°¡ &chunk0_ptr - sizeof(uint64_t)*3 ÀÌ°í p->bk°¡ &chunk0_ptr - sizeof(uint64_t)*2 ´Ï±î p->fd->bk ´Â &chunk0_ptr - sizeof(uint64_t)*3 + sizeof(uint64_t)*3ÀÌ µÇ¾î chunk0_ptrÀ» °¡¸£Å°°Ô µÅ p->fd->bk == p¸¦ ¸¸Á·½ÃÅ°°Ô µÇ°í p->bk->fdµµ ¸¶Âù°¡ÁöÀÔ´Ï´Ù ±×¸®°í ½ÇÁ¦ unlink·çƾÀÎ FD->bk = BK; BK->fd = FD; ¸¦ ºÐ¼®Çغ¸¸é p->fd->bk = bk; p->bk->fd = fd; °¡ µÇ´Ï±î p´Â ÃÖÁ¾ÀûÀ¸·Î fd, Áï p = &chunk0_ptr - sizeof(uint64_t)*3 ÀÌ µË´Ï´Ù ±×·¯¸é chunk0_ptrÀÌ ¿ø·¡ ÈüÀ» °¡¸£Ä×¾ú´Âµ¥ &chunk_ptr-sizeof(uint64_t)*3À» °¡¸£Å°°Ô µÇ°í chunk0_ptr[3] = victim_string Àº chunk0_ptr = victim_string°ú °°¾ÆÁý´Ï´Ù Áï Àü¿ªº¯¼ö¸¦ ¸¶À½´ë·Î Á¶ÀÛÇÑ°ÅÁÒ ±×·¡¼ chunk0_ptr¿¡´Â ÀÌÁ¦ victim_stringÀÇ ÁÖ¼Ò°¡ ÀÖÀ¸´Ï chunk0_ptr[0] = 0x4141414142424242¸¦ ÇÏ°Ô µÇ¸é victim_str¿¡ BBBBAAAA°¡ ½áÁö°Ô µË´Ï´Ù |
2017/05/14 | |
ÇØÄð·¯ | Áú¹®±ÛµéÀ» º¸¸é °øºÎ¸¦ ÇϽÅÁö ¾ó¸¶ ¾ÈµÇ½Å°Å°°¾Æ Á¦ ¼³¸íÀÌ ¸¹ÀÌ ¾î·Á¿ì½Ç ¼ö Àִµ¥ ÀÌÇØ°¡ µÉ‹š±îÁö 50¹øÀÌ°í 100¹øÀÌ°í Àо¼¼¿ä | 2017/05/14 | |
ÇØÄð·¯ | FD->bk = BK; BK->fd = FD; ¿¡¼ ¿Ö °á±¹ p¿¡ fd°¡ ½áÁö³Ä¸é FD->bk ¿Í BK->fd µÑ´Ù p¸¦ °¡¸£Å°°í Àֱ⿡ µÑ´Ù p¿¡ ¾²´Â ±¸¹®µéÀÌÁö¸¸ FD->bk = BK --> ¿©±â¼ p¿¡ BK°¡ µé¾î°¡°í BK->fd = FD --> ¿©±â¼ p¿¡ FD°¡ µé¾î°¡±â ‹š¹®¿¡ ¸¶Áö¸·À¸·Î µ¤¾î½áÁø FDÀÇ °ªÀÌ ÃÖÁ¾ÀûÀ¸·Î p°¡ µÇ°í, fdÀÇ °ªÀº &chunk0_ptr - sizeof(uint64_t)*3 ¿´±â ¶§¹®¿¡ ÀÌ °ªÀÌ chunk0_ptrÀÇ °ª¿¡ µé¾î°©´Ï´Ù |
2017/05/14 | |
vngkv123 | Á¤¸» °¨»çÇÕ´Ï´Ù ¤Ð | 2017/05/14 | |
vngkv123 | ±¸Á¶Ã¼ Á¢±Ù¿¡¼ °³³äÀÌ ¸¹ÀÌ ºó¾àÇß³×¿ä ¤Ð | 2017/05/14 | |
|
|