Fastbin Attack
fastbin attack 存在的原因在于 fastbin 是使用单链表来维护释放的堆块的,并且由 fastbin 管理的 chunk 即使被释放,其 next_chunk 的 prev_inuse 位也不会被清空。
先介绍下fastbins:
fastbins是管理在malloc_state结构体重的一串单向链表
每次释放对应大小的堆块都会被连入对应大小的链表中(链表长度<4)。
每次分配会优先从fastbins中分配对应大小的区块。

由chunk的bk指针域指向下一个空闲fastbin堆块,最后一个空闲堆块的bk指针为0。申请堆块的时候会将表中第一个堆块分配,然后表头指向第一个堆块指向的下一个堆块

-
fastbin double free
Fastbin Double Free 是指 fastbin 的 chunk 可以被多次释放,因此可以在 fastbin 链表中存在多次。这样导致的后果是多次分配可以从 fastbin 链表中取出同一个堆块,相当于多个指针指向同一个堆块,结合堆块的数据内容可以实现类似于类型混淆的效果。
Fastbin Double Free 能够成功利用主要有两部分的原因
fastbin 的堆块被释放后 next_chunk 的 pre_inuse 位不会被清空
fastbin 在执行 free 的时候仅验证了 main_arena 直接指向的块,即链表指针头部的块。对于链表后面的块,并没有进行验证。
做个小实验:
代码:
int main(void)
{
void chunk1,chunk2,*chunk3;
chunk1=malloc(0x10);
chunk2=malloc(0x10);free(chunk1);
free(chunk2);
free(chunk1);
return 0;
}
得到的结果:

注意因为 chunk1 被再次释放因此其 fd 值不再为 0 而是指向 chunk2,这时如果我们可以控制 chunk1 的内容,便可以写入其 fd 指针从而实现在我们想要的任意地址分配 fastbin 块(再次申请新的堆块时会取fastbin链表首部的堆块,{后进先出})
画图吧。。
申请一个new chunk 1

将new chunk 1的指针域修改为要修改的地址-0x10以上

申请一个new chunk 2

再申请一个new chunk 3(new chunk 3是和new chunk 1重合的)

这里解释下,由于我们之前改了chunk1的fd指针,所以对于fastbin链表来说,他将我们改的fd指针指向的地址也视作一块空闲的堆块,再次申请就会把这一块地址用作一个新的堆块使用!
这时可以发现,fastbin链表已经指向了我们想要修改的地址了,只要再申请一个堆块就会申请到想要修改的地址,然后只要编辑这个堆块便可完成任意地址写。(这里需要注意的一点是,我们把fd指针修改到的伪造堆块处,其chunksize必须符合此fastbin的大小)
当程序有double free漏洞时,我们通过申请两个fastbin大小的堆块1和2,还是以0x30举例,然后分别释放chunk 1和chunk 2,fastbin的链表结构就会如下图:

浙公网安备 33010602011771号