Home avatar

Wings

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 (高亮处) 附近
__malloc_hook (高亮处) 附近

可以看到, 在 __malloc_hook 前 0x8, 0x10, 0x20 处, 都有 libc 的地址, 且前 0x18 处为 0.

Pwn Ptmalloc2 Tcache Double Free

如未特殊说明, 均假定 libc 2.27, 64 位.

Tcache 是 glibc 2.26 加入的东西, 从 cache 这个名字也可以看出来, Tcache 机制是为了更加高效地分配堆.

高效性和安全性是两个负相关的指标. 因为其安全检查机制的不完善, 所以我们的攻击会变得更加简单.

首先还是来分析 Tcache 的源码.

malloc.c 中, 与 Tcache 有关的两个结构体如下:

Pwn Ptmalloc2 Fastbin Double Free

如未特殊说明, 均假定 libc 2.23, 64 位.

Fastbin 是 Ptmalloc2 的一种堆管理机制. 设计的目的在于分配内存时, 快速利用已有的合适 chunk. 大小小于 0x80 的 chunk free 后会被放在对应的 fastbin 中.

Fastbin 定义在 malloc_state 结构体中: