how2heap 的 fastbin_dup_into_stack.c 源码
pwndbg 调试观察
先malloc了3块内存
堆块结构:
这里堆信息显示的堆块地址都比栈上存储的堆块地址小0x10,这是因为heap显示的地址是堆块的真正的头部地址,指向的是堆块的第一个数据prev_size,而栈上存储的地址是返回给用户使用的指针fd的位置,pre_size和size字段在64位操作系统上都是8字节大小,所以前面占了0x10,导致看到的两个地址相差0x10大小
至于申请的堆块大小为0x20,实际size位显示的却比申请大小大1字节,这是因为size字段低三比特位为特殊的flag值
分别为
NON_MAIN_ARENA, 记录当前堆是否不属于主线程,1表示不属于,0表示属于
IS_MAPPED, 记录当前堆是否是由mmap分配的
PREV_INUSE, 记录前一个堆块是否被分配(就是是否在使用状态)
但是fastbin为了快速分配使用&#