
本仓库用于学习各种堆利用技术。
我们以 Ubuntu 的 Libc 发行版作为黄金标准。每种技术都已在对应的 Ubuntu 发行版上验证有效。
你可以在基于 Debian 的操作系统上运行 apt source libc6 下载你正在使用的 Libc 源码。你也可以点击 ▶️ 使用 gdb 在浏览器中调试该技术。
我们是在一次黑客聚会上想到这个主意的,并已实现了以下技术:
| 文件 | ▶️ | 技术 | Glibc 版本 | 补丁 | 适用的 CTF 挑战题 |
|---|---|---|---|---|---|
| first_fit.c | 演示 glibc malloc 的 first-fit 行为。 | ||||
| calc_tcache_idx.c | 演示 glibc 的 tcache 索引计算。 | ||||
| fastbin_dup.c | ▶️ | 通过滥用 fastbin 空闲链表,欺骗 malloc 返回一个已分配的堆指针。 | < 2.43 | patch | |
| fastbin_dup_into_stack.c | ▶️ | 通过滥用 fastbin 空闲链表,欺骗 malloc 返回一个几乎任意的指针。 | < 2.43 | patch | 9447-search-engine, 0ctf 2017-babyheap |
| fastbin_dup_consolidate.c | ▶️ | 通过将一个指针同时放入 fastbin 空闲链表和 top chunk,欺骗 malloc 返回一个已分配的堆指针。 | < 2.43 | patch | Hitcon 2016 SleepyHolder |
| unsafe_unlink.c | ▶️ | 利用对被破坏 chunk 的 free 操作实现任意写。 | 最新 | HITCON CTF 2014-stkof, Insomni'hack 2017-Wheel of Robots | |
| house_of_spirit.c | ▶️ | 释放一个伪造的 fastbin chunk,使 malloc 返回一个几乎任意的指针。 | 最新 | hack.lu CTF 2014-OREO | |
| poison_null_byte.c | ▶️ | 利用单个 null 字节溢出。 | 最新 | PlaidCTF 2015-plaiddb, BalsnCTF 2019-PlainNote | |
| house_of_lore.c | ▶️ | 通过滥用 smallbin 空闲链表,欺骗 malloc 返回一个几乎任意的指针。 | 最新 | ||
| overlapping_chunks.c | ▶️ | 利用对 unsorted bin 中已释放 chunk 大小的覆盖,使新分配与现有 chunk 重叠。 | < 2.29 | patch | hack.lu CTF 2015-bookstore, Nuit du Hack 2016-night-deamonic-heap |
| overlapping_chunks_2.c | ▶️ | 利用对使用中 chunk 大小的覆盖,使新分配与现有 chunk 重叠。 | < 2.29 | patch | |
| mmap_overlapping_chunks.c | 利用使用中的 mmap chunk,使新分配与当前的 mmap chunk 重叠。 | 最新 | |||
| house_of_force.c | ▶️ | 利用 Top Chunk(Wilderness)的头部信息,使 malloc 返回一个几乎任意的指针。 | < 2.29 | patch | Boston Key Party 2016-cookbook, BCTF 2016-bcloud |
| unsorted_bin_into_stack.c | ▶️ | 利用对 unsorted bin 空闲链表上已释放 chunk 的覆盖,返回一个几乎任意的指针。 | < 2.29 | patch | |
| unsorted_bin_attack.c | ▶️ | 利用对 unsorted bin 空闲链表上已释放 chunk 的覆盖,向任意地址写入一个大数值。 | < 2.29 | patch | 0ctf 2016-zerostorage |
| large_bin_attack.c | ▶️ | 利用对 large bin 空闲链表上已释放 chunk 的覆盖,向任意地址写入一个大数值。 | < 2.42 | patch | 0ctf 2018-heapstorm2 |