概念
double free 指的是通过 free 同一个 chunk 两次来干扰 bins 链,再将其 malloc 回来,实现一个 chunk 即在使用中,同时又属于 bins 链中。也就是形成了一个可写的 free chunk,再去写入 chunk 的内容,就实现了改变一个 free chunk 的 fd 位置,fd再指向目标地址,再申请 chunk ,就拿到了目标位置。
前提是目标地址的构造 fake chunk 的 size 能过检测
调试
如果直接 free 同一个 chunk 两次的话,会报错。
main_arena 会纪录上一个 free 的 chunk,free 一个 chunk 时会先检验是否是上一个 free chunk ,当中间隔一个 chunk2 就行了。
示例(来自CTFwiki):
int main(void)
{
void *chunk1,*chunk2,*chunk3;
chunk1=malloc(0x10);
chunk2=malloc(0x10);
free(chunk1);
free(chunk2);
free(chunk1);
return 0;
}
第一次释放free(chunk1)
chunk1 的 fd 指向0x00
第二次释放free(chunk2)
chunk2 的 fd 指向 chunk1 的 prev_size
第三次释放free(chunk1)
形成一个闭环
第二次 free 掉 chunk1 将原来的 fd=0x00 覆盖为 fd=chunk2的prev_size ,而 chunk2 本就在 chunk1 后面 free ,所以 chunk2 的 fd 也指向 chunk1 的 prev_size,形成闭环。此时 再次 malloc chunk1,写入目标地址在 fd 位置,这时就 chunk1 就成了可写的 free chunk,再多次申请相同大小的 chunk 就到了目标地址。实现任意地址分配堆块的效果( 首先要通过验证 )
四次申请(具体情况而定):
malloc chunk1 =(写入fd)=> malloc chunk2 => malloc chunk1 =(fd指向地址)=> malloc fake chunk