fastbin_dup_consolidate
-
consolidate 过程
- 若 get_max_fast() 返回 0,则进行堆的初始化工作,然后进入第 7 步
- 从 fastbin 中获取一个空闲 chunk
- 尝试向后合并
- 若向前相邻 top_chunk,则直接合并到 top_chunk,然后进入第 6 步
- 否则尝试向前合并后,插入到 unsorted_bin 中
- 获取下一个空闲 chunk,回到第 2 步,直到所有 fastbin 清空后进入第 7 步
- 退出函数
-
poc
a=malloc(x); b=malloc(x); free(a)//a进入fastbin中 c = malloc(0x400) //申请large bin的时候已经执行了malloc_consolidate,使得fastbin中的a放入smallbin中 free(a) //并不会报错,因为这个时候a已经被放到了smallbin之中,fastbin中没有a,之后a再次进入fastbin中 //此时的a中信息如下: a.bk->smallbin a.fd->0//由于处在fastbin的第一个,所以fd被清空 malloc(x) = a//这时候a中存在smallbin的信息,可以进行泄露 malloc(x) = a//可以再次申请,再次得到a
-
申请两个fast bin大小的chunka、chunkb,释放chunk a
-
申请lage bin大小的chunk c,此时会进行malloc_consolidate,将fast bin中的chunk放入small bin,可以泄漏small bin中的信息
-
此时fast bin中没有bin,可以再次释放chunk a,触发double free
-
后面的操作,就跟double free 一样利用即可.