Fastbin_Attach小记

前言:fastbin_attack广泛应用于glibc2.27以前,这时没有tcache存在,而有了tcache之后,tcache的检查更为松散,且题目一般会限制分配堆块数量,因此一般利用tcache_attack,当然这并不是说高版本用不到fastbin_attack,只是这时一般不单独利用,而是配合其他方法组合使用

利用条件:

  • 存在堆溢出、use-after-free 等能控制 chunk 内容的漏洞
  • 漏洞发生于 fastbin 类型的 chunk 中

分类:

  • Fastbin Double Free
  • House of Spirit
  • Alloc to Stack
  • Arbitrary Alloc
Fastbin Double Free

利用的原因

  1. fastbin 的堆块被释放后 next_chunk 的 pre_inuse 位不会被清空
  2. fastbin 在执行 free 的时候仅验证了 main_arena 直接指向的块,即链表指针头部的块。对于链表后面的块,并没有进行验证。

所谓double_free,并不能连续free一个堆块两次,而要借助malloc另一个堆块绕过检查再次free目标堆块,这里参考ctf-wiki的图片

此时我们malloc一个和chunk1大小相同的堆块,chunk1就会分配给我们,但是此时fastbins中依旧存在chunk1,因此我们如果修改其fd指向地址,且该地址能满足fastbins的检查,那么我们在malloc出chunk2和chunk1后,再次malloc就会得到我们修改的fd指向的地址,相当于任意地址写任意值的效果。

House Of Spirit

核心在于在目标位置伪造 fastbin chunk,并将其释放,从而达到分配指定地址的 chunk 的目的。

要想构造 fastbin fake chunk,并且将其释放时,可以将其放入到对应的 fastbin 链表中,需要绕过一些必要的检测,即

  • fake chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理。
  • fake chunk 地址需要对齐, MALLOC_ALIGN_MASK
  • fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐。
  • fake chunk 的 next chunk 的大小不能小于 2 * SIZE_SZ,同时也不能大于av->system_mem 。
  • fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况。

这主要向我们介绍了一个思想,修改指定地址的前后的内容使其可以绕过对应的检测

具体构造参考how2heap

Alloc to Stack

该技术的核心点在于劫持 fastbin 链表中 chunk 的 fd 指针,把 fd 指针指向我们想要分配的栈上,从而实现控制栈中的一些关键数据,比如返回地址等

这个利用条件算是比较苛刻了,需要泄露栈地址,当然直接给出栈地址除外(没见过捏)

 Arbitrary Alloc

Arbitrary Alloc 其实与 Alloc to stack 是完全相同的,唯一的区别是分配的目标不再是栈中。 事实上只要满足目标地址存在合法的 size 域(这个 size 域是构造的,还是自然存在的都无妨),我们可以把 chunk 分配到任意的可写内存中,比如 bss、heap、data、stack 等等。

这个利用主要就是用来劫持__molloc_hook,在__molloc_hook-0x23的位置刚好能错位构造出0x7f满足fastbin的检查从而改__molloc_hook为one_gadget来getshell

参考链接:Fastbin Attack - CTF Wiki (ctf-wiki.org)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值