Fastbin Attack
图文源好好说话之Fastbin Attack(1):Fastbin Double Free_pwn 好好说话-CSDN博客根据自己理解做了摘抄
这一类漏洞利用的方法主要基于fastbin机制的缺陷,其实fastbin attack并不是指某一种利用方法,而是一些。这类利用的前提是:
存在堆溢出、use-after-free等能控制chunk内容的漏洞
漏洞发生于fastbin类型的chunk中
如果细分的话,可以做如下的分类:
Fastbin Double Free
House of Spirit
Alloc to Stack
Arbitrary Alloc
前两种主要漏洞侧重于利用free函数释放的真的 chunk或伪造的chunk,然后再次申请chunk进行攻击,后两种侧重于故意修改fd指针,直接利用malloc申请指定位置chunk进行攻击。主要讲解Fastbin Double Free。
原理
fastbin attack存在的原因在于fastbin时使用单向链表来维护释放的堆块的,并且由fastbin管理的chunk即使被释放,其next_chunk的prev_inuse位也不会被清空。
- 在fastbin中后一个被释放的chunk的fd指向前一个被释放的chunk的prev_size,main_arena指向最后一个被释放的chunk的prev_size。
- 看一下在释放阶段的chunk的prev_inuse标志位为1,回来在看释放后的内存情况,chunk的
prev_inuse
依然还是1不变。 - fastbin在执行free的时候仅验证了main_arena直接指向的块,即链表指针头部的块。
Fastbin Double Free
fastbin中的chunk被释放两次及以上。后果是多次分配可从fastbin链表中取出同一个堆块,结合堆块的数据内容可以实现类似于**类型混淆(type confused)**的效果。
Fastbin Double Free成功利用主要原因:
fastbin的堆块被释放后next_chunk的prev_inuse位不会被清空。
fastbin在执行free的时候仅验证了main_arena直接指向的块,即链表指针头部的块。对于链表后面的块并没有进行验证。
1 | 1 //gcc -g hollk4.c -o hollk4 |
首先经过double free之后fastbin中的单向链表为chunk1_double –> chunk2 –> chunk1在经过一次malloc申请后main_arena指向的chunk1_double被重新启用,即chunk1倍重新启用,main_arena指向chunk2,并且将chunk1的fd从原来的指向chunk2修改为指向结构体指针chunk1 –> bss_chunk,也就是说在fastbin单向链表中bss_chunk已经作为chunk1前一个被释放的块的存在了
接下来第二次malloc申请后main_arena指向的chunk2被启用,main_arena重新指向chunk1
第三次malloc申请后chunk1再一次被启用,main_arena指向chunk的fd指向的bss_chunk
那么在第四次malloc申请的时候此时main_arena指向的bss_chunk就会被启用
虽然bss_chunk并不是在内存中正常申请的chunk,但是由于我们可以修改chunk1的fd,使他指向bss_chunk,那么即使bss_chunk位于bss段,也会被当作一个chunk来被启用
那么在程序第31行代码中chunk_b其实被赋予的就是bss_chunk的结构体指针,所以在第32行输出的时候实际输出的是bss_chunk的chunk地址