
さまざまなヒープ悪用技術を学ぶためのリポジトリ。
このリポジトリは、さまざまなヒープエクスプロイト手法を学ぶためのものです。
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チャンクの両方にポインタを置くことで、すでに割り当て済みのヒープポインタをmallocに返させる。 | < 2.43 | patch | Hitcon 2016 SleepyHolder |
| unsafe_unlink.c | ▶️ | 破損したチャンクに対するfreeを悪用して任意の書き込みを実現する。 | latest | HITCON CTF 2014-stkof, Insomni'hack 2017-Wheel of Robots | |
| house_of_spirit.c | ▶️ | 偽のfastbinチャンクをfreeして、ほぼ任意のポインタをmallocに返させる。 | latest | hack.lu CTF 2014-OREO | |
| poison_null_byte.c | ▶️ | 単一のnullバイトオーバーフローを悪用する。 | latest | PlaidCTF 2015-plaiddb, BalsnCTF 2019-PlainNote | |
| house_of_lore.c | ▶️ | smallbinフリーリストを悪用して、ほぼ任意のポインタをmallocに返させる。 | latest | ||
| overlapping_chunks.c | ▶️ | 解放済みチャンクのサイズを unsorted bin 内で上書きし、新しい割り当てを既存のチャンクと重複させる | < 2.29 | patch | hack.lu CTF 2015-bookstore, Nuit du Hack 2016-night-deamonic-heap |
| overlapping_chunks_2.c | ▶️ | 使用中のチャンクのサイズを上書きし、新しい割り当てを既存のチャンクと重複させる | < 2.29 | patch | |
| mmap_overlapping_chunks.c | 使用中の mmap チャンクを悪用し、新しい割り当てを現在の mmap チャンクと重複させる | latest | |||
| 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 のフリーリスト上にある解放済みチャンクを上書きし、ほぼ任意のポインタを返させる。 | < 2.29 | patch | |
| unsorted_bin_attack.c | ▶️ | unsorted bin のフリーリスト上にある解放済みチャンクを上書きし、任意のアドレスに大きな値を書き込む | < 2.29 | patch | 0ctf 2016-zerostorage |
| large_bin_attack.c | ▶️ | large bin のフリーリスト上にある解放済みチャンクを上書きし、任意のアドレスに大きな値を書き込む | < 2.42 | patch | 0ctf 2018-heapstorm2 |