堆,我的堆(

堆结构

free chunk: 对于tcache,其next(fd)指向的是用户内存空间开头,keys(bk)指向一个与本线程堆绑定的tcache_perthread_struct结构,该结构也储存在堆中 对于其他bins,fd、bk指向的是chunk开头(用户内存空间开头-0x10)

unlink

fastbin attack

发生条件: 能够double free fastbin中的chunk或以其他方式控制fastbin chunk中的fd 验证: p->size == fastbin_index_size 利用: 构造fake chunk,控制size 效果: 任意地址(通过验证)malloc,从而实现任意地址读写

也可以通过修改fd的低位实现heap overlap

fastbin attack (fastbinY)

fastbin链表头在<main_arena+16>,可以通过修改已经free掉的chunk的fd为0x31,将一个0x31写进libc中的main_arena上(fastbinY),此时就可以fastbin attack申请到main_arena中,篡改fastbinY下方的top_chunk地址,若为高版本libc,此处需要注意top_chunk的头部也是有要求的,无对齐检查,但大小要求大于0x20,小于main_arena→sys_mem

unsorted bin

伪造unsorted bin堆块: 下一物理相邻chunk pre_inuse 设为1,过freecheck 再下一物理相邻chunk pre_inuse 设为1,防止进行unlink,导致check failed