一、原理:
通过 fastbin 的管理机制来创建 fake chunk 从而实现任意地址写或读。
二、fastbin 管理机制
- 管理大小为32字节\~128字节(0x20~0x80)的 chunk。
- 不修改free chunk 的 PREV_INUSE 标志位,即相邻 chunk 不进行合并,也就是说在 fastbin 自己的视角这些 free chunk 都是使用中的。
- 当需要给用户分配的 chunk 小于或等于128字节时,ptmalloc 首先会在 Fast Bins 中查找相应的空闲块,然后才会去查找bins中的空闲chunk。
- 在单链表中一个节点的 bk 成员是没有使用的。当新增/取走一个 free chunk 时,都是通过 fastbin 的 bin 头的 fd 指针所操作的。
- 有 chunk 加入 fastbin 时修改 fd 指向前面的 chunk 构成链表。
这里由于 tcache 机制,又嫌用patchif 麻烦所以用了这种笨办法
可以看到后 free chunk 的 fd 指向前一个 free chunk 的地址,第一个 free chunk 的 fd 指向 0x00 ,从而形成单链。
- 当 chunk 被用户重新申请走时,此 chunk 后面的 free chunk
fd位置就指向了此 chunk 的前一个 free chunk。
三、fastbin attack思路
通常漏洞点都是有方法可以改变某 chunk 的 fd 位置,使其指向你的目标地址,构造一个 fake chunk,实现任意地址读写。
fastbin attack步骤:
- 申请连续的 chunk ,其 size 要在 fastbin 的管理范围内。
- free 掉一个能修改 fd 的 chunk,修改其 fd 位置指向目标地址。
- 连续申请两次与刚才的 free chunk 相同 size 的 chunk,第一次申请的是这个 free chunk 本身,第二次申请的才是目标地址的空间。
- 到这里已经拿到目标地址了,根据题目具体情况来实现操作就行了。
构造 fake chunk 对size的要求:
从 fastbins 中申请一个 free chunk 时:
- 申请 fake chunk 的 size 需要满足 fastbin 链的管理范围,否则就是从其它 bin 里面来的了
- fake chunk 的 size 的 PREV_INUSE 为要为1,上面讲到的 fastbin 链的 free chunk 的 PREV_INUSE 都是1.
bins的检测详情参见:https://blog.csdn.net/qq_41453285/article/details/97753705
常用方法:
- 对于 fake chunk 的 size 适合通过偏移目标地址,创造对目标地址原有数据的错位利用,通常地址以 0x7f 开头的居多,就适合用来作为 fake chunk 的 size。
- 构造的 fake chunk 尽量 size 在0x70\~0x80之间的堆块,这样目标地址就会被放入0x70\~0x80大小范围的 fastbin 链中,系统中0x7f这样的数值比较好找,所以能够构造0x7f这样的数值来跳过glibc的检测一。
- 如果此时没有数值为0x7f这样的地址,那么就需要使用借助unsortedbin attack了,利用unsortedbin attack向目标地址处写入一个0x7f的数值(见文章:https://blog.csdn.net/qq_41453285/article/details/99329694)