堆入门5.1—Fastbin Attack

一、原理:

通过 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 构成链表。

file
这里由于 tcache 机制,又嫌用patchif 麻烦所以用了这种笨办法
可以看到后 free chunk 的 fd 指向前一个 free chunk 的地址,第一个 free chunk 的 fd 指向 0x00 ,从而形成单链。

  • 当 chunk 被用户重新申请走时,此 chunk 后面的 free chunk
    fd位置就指向了此 chunk 的前一个 free chunk。

file

三、fastbin attack思路

通常漏洞点都是有方法可以改变某 chunk 的 fd 位置,使其指向你的目标地址,构造一个 fake chunk,实现任意地址读写。

fastbin attack步骤:

  1. 申请连续的 chunk ,其 size 要在 fastbin 的管理范围内。
  2. free 掉一个能修改 fd 的 chunk,修改其 fd 位置指向目标地址。
  3. 连续申请两次与刚才的 free chunk 相同 size 的 chunk,第一次申请的是这个 free chunk 本身,第二次申请的才是目标地址的空间。
  4. 到这里已经拿到目标地址了,根据题目具体情况来实现操作就行了。

构造 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

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据