Pwn Ptmalloc2 Unsortbin Attack
原理
如未特殊说明, 均假定 libc 2.23, 64 位.
当 malloc 从 unsortbin 中取 chunk 时, 会有一个双向链表解链的过程 (为方便, 代码只截取数据结构部分):
Pwn Ptmalloc2 Chunk at __malloc_hook Nearby
原理
堆题的最后一步攻击手段, 有一个就是覆盖各种 hook, 其中就包括 __malloc_hook
. 如果我们无法控制程序恰好写入到此处, 但是可以修改 chunk 的 fd 或者 bk, 达到 尝试任意地址分配 的效果, 那么就可以尝试分配到 __malloc_hook
附近. 为什么这里说尝试呢? 因为在 malloc 在从 bins 中取 chunk 的时候, 都会对这个 chunk 的 size 进行检测. 所以, 我们需要分配到 __malloc_hook
之前, 恰好 size 位满足条件的地方. (Tcache 的话就不用了, 因为没有任何检测)
一般来说, 程序在初始化了堆以后, __malloc_hook
前面不远处会有 libc 的地址. 这取决于 libc bss 节上变量的分布. 举个例子, 在某版本的 glibc 初始化了堆后, __malloc_hook
附近如下图所示:

可以看到, 在 __malloc_hook
前 0x8, 0x10, 0x20 处, 都有 libc 的地址, 且前 0x18 处为 0.
Pwn Ptmalloc2 Unsortbin Leak Libc
原理
如未特殊说明, 均假定 libc 2.23, 64 位.
Unsortbin
Unsortbin 就是 malloc state 中的 bins[1], 相关定义如下:
Pwn Ptmalloc2 House of Spirit
精灵的家!
Pwn Ptmalloc2 Tcache Double Free
原理
如未特殊说明, 均假定 libc 2.27, 64 位.
Tcache
Tcache 是 glibc 2.26 加入的东西, 从 cache 这个名字也可以看出来, Tcache 机制是为了更加高效地分配堆.
高效性和安全性是两个负相关的指标. 因为其安全检查机制的不完善, 所以我们的攻击会变得更加简单.
首先还是来分析 Tcache 的源码.
数据结构
在 malloc.c
中, 与 Tcache 有关的两个结构体如下: