利用条件:能控制topchunk_size,能够自由控制申请的堆块大小。需要知道top_chunk地址与目的地址的偏移量,如果还不对齐,即结果不是0x0结尾,需要多减8,然后减去SIZE_SZ(8)
结果:能将topcunk的地址控制到我们想要的地址,再申请内存就可以控制这个地址的值。
check1 对topchunk_size的检查,(unsigned long) (size) >= (unsigned long) (nb + MINSIZE)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 victim = av->top; size = chunksize (victim); if ((unsigned long ) (size) >= (unsigned long ) (nb + MINSIZE)) { remainder_size = size - nb; remainder = chunk_at_offset (victim, nb); av->top = remainder; #设置top_chunk的头,附近值会有所变化 set_head (victim, nb | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0 )); set_head (remainder, remainder_size | PREV_INUSE); check_malloced_chunk (av, victim, nb); void *p = chunk2mem (victim); alloc_perturb (p, bytes); return p; }
所以把size改为-1,在补码中为很大的数,能够满足条件
新的remainder即top_chunk的地址 **remainder = chunk_at_offset(victim, nb);**,需要算出topchunk的地址和目标地址的偏移 check2 对申请的size的检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #这里的req即是nb.对req的大小的检查,((unsigned long ) (req)要小于 (unsigned long ) (INTERNAL_SIZE_T)(-2 * MINSIZE)) #define REQUEST_OUT_OF_RANGE(req) \ ((unsigned long) (req) >= (unsigned long) (INTERNAL_SIZE_T)(-2 * MINSIZE)) # 对nb加 SIZE_SZ加 MALLOC_ALIGN_MASK,最后和MALLOC_ALIGN_MASK按位与对齐,这里的SIZE_SZ是8 #define request2size(req) \ (((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) \ ? MINSIZE \ : ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK) # req不能大于 -2 * MINSIZE,否则会报错 #define checked_request2size(req, sz) \ if (REQUEST_OUT_OF_RANGE(req)) { \ __set_errno(ENOMEM); \ return 0; \ } \ (sz) = request2size(req);
首先 ((unsigned long) (req) <= (unsigned long) (INTERNAL_SIZE_T)(-2 MINSIZE)),即无符号的nb要小于无符号的 **-2 MINSIZE,即req不能大于 -2MINSIZE* ,一般都能满足条件。 其次是对req的对齐的检查,req需要是0x0结尾来对齐,否则得多减8 ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK),这里的结果是最后申请的大小。由于(req) + SIZE_SZ,SIZE_SZ是8,所以算出偏移后还需要减去8,虽然req会加上MALLOC_ALIGN_MASK,但是最后会被对齐掉,就不用多减掉MALLOC_ALIGN_MASK了 MALLOC_ALIGN 通常指的是内存块对齐的要求。如果req不对齐,不是0x0结尾的,需要多减掉8
bcloud_bctf_2016 只开了栈上的保护
这里会把堆的地址给到v2的指针,后续会打印出来
🐕Ⅷ题目,调试的时候完全不是题目逻辑,算了。
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~