Fastbin Attck—Double Free

概念

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)
file

chunk1 的 fd 指向0x00
file
第二次释放free(chunk2)
file
chunk2 的 fd 指向 chunk1 的 prev_size
file
第三次释放free(chunk1)
file
形成一个闭环
file
第二次 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

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据