fastbins
为了高速化而实现的机制
www.valinux.co.jp/technologylibrary/document/linux/malloc0001/
bins和fastbins
之前提到过libc中存在一个为了快速搜索free区域而存在的链表
这是arena(malloc_state构造体)中存在的列表头
free状态的chunk根据相似大小来管理,因此会有多个列表
size比较小的chunk,free的时候会暂时和fastbins连接
- 这个链表是单向的
- 每个chunk在x86环境下是小于64字节,x86_64环境下是小于128字节
- 也存在bk成员变量,但因为高速化,不会使用到
进入fastbins的小的chunk如果是像下面这样的状态,就存在堆溢出
- 覆盖fd
- 这就可能进行fastbins attack
正常的malloc()
假设有一个像这样的fastbins列表
各个chunk根据size连接到fastbins列表
- 图中也显示size,因为它很重要
取出fastbins的第一个元素,进行简单的检查
- 检查P->size,判断它是否在正确的fastbins列表里
连接到fastbins的小的chunk是根据size大小决定要连接到哪个fastbins列表上
之后,将其从列表中删除
exploit的流程
通过P2上的堆溢出覆盖fastbins上的P的fd
- 使其指向X
进行malloc()的时候P被unlink
- fastbins列表现在和X相连接
下次进行malloc()时,就可能返回X
- 但是X下面没有合适的size也不行
- 因为存在判断它是否在正确的列表中
原本malloc()的返回值是堆的地址,通过这种方式就能够让返回X
假设X是一个保存函数地址的区域(例如GOT)
也就可以通过对malloc()的返回值,也就是X进行特定值写入,来覆盖GOT
有什么困难
- 这不仅是对用户进程的hack,还要跟踪libc中的内容
- fastbins感觉不太出名
- 仅通过分析给出的二进制程序来解决它是不可能的
- 需要了解libc.so中malloc和free的行为相关知识