Off-by-null 的利用方法
· 20 min read
不知道为什么以前都不把这些记录下来,然后每次做到的时候都会忘了从零开始学。
本文将主要介绍 2.23 和 2.31 版本下的利用,2.27 和 2.23 差不多,多填一个 tcache 即可。2.29 和 2.31 也差不多,多了一个 key。
因此,阅读本文你需要对 Heap 的分配有一定的基础,本文将更多涉及方法而非原理。
本文涉及的挑战主要有以下几个特征
- 存在 off-by-null
- 分配次数几乎不受限
- 分配大小几乎不受限或是能分配 largebin 范围
- 不存在 edit 函数或只能 edit 一次
- 只能 show 一次(按理来说不能 show 也可以,但是堆块分配太麻烦了,做这种题不如睡觉)
off-by-null
一般来说 off by null 有以下几种可能
strcpy
之类会往末尾额外添加\x00
的函数- 一个循环中
read(0, buf, 1)
然后判断*buf = 0xA ? break
,在循环外*buf = 0
的情况
而它仅仅能造成 1 字节的越界写,且只能填写 \x00,因此这种攻击原语能力小于 off-by-one。
一般而言,我们都会用这个攻击原语修改 chunk 的 prev_inuse
位,或是修改 fd
、bk
指针等使其指向一个最低字节为 \x00
的堆块,进而利用 malloc_consolidate
造成堆块重叠 (chunk overlapping) 或是利用 fd
指针使得空闲链表指向一个已分配的堆块,从而达到 UAF 的效果。