堆利用
# 一般步骤
- 泄露 unsorted bin 地址。
- 计算地址,如 libc 基址、malloc hook 的地址等。
- hijack,如劫持 free@got、malloc hook、free hook 等。
# 泄露 unsorted bin 地址
条件
- 存在堆溢出或 UAF 漏洞。
- 能够输出 chunk 上的数据。
# fast bin attack
关于 fast bin
- 取出前检查
从 fast bin 中取出 chunk 前会对该 chunk 的 size 进行检查。
- fd 指针的指向
fast bin 单链表的第一个 chunk 成员的 fd 值为 Null。链表中其他 chunk 的 fd 指针指向另一个 chunk 的头部,而非 user data。
- 与 top chunk 的合并
大小不在 fast bin 范围内的 chunk 被释放时,如果它与 top chunk 相邻,则其会与 top chunk 发生合并。
- 最大 chunk size
fast bin 中最大的 chunk 大小为 0x80。
- FILO 原则
fast bin 中的 chunk 遵循 FILO 原则。
- 大小在 fast bin 范围内的 chunk 被释放时,其 next_chunk 的 prev_inuse 位不会被置零。
利用手法
修改已被释放并被存放在 fast bin 中的 chunk 的 fd 指针,使其指向目标内存附近(合适偏移处),之后便可在目标内存处申请一块 chunk 进行操作。
注意事项
- 确定偏移
进行 fast bin attack 时需要计算好合适的偏移,以确保要申请的 chunk 的 size 是合法的。