談到方法,例如傳統 stack pwn 會有 buffer overflow、format string、ROP 之類的方法和技術。而 heap pwn 則和 stack pwn 有著一系列很不同的方法。這篇做個列表,方便檢索。各方法的詳細,在此不贅。可查找 reference 中的連結參考。
~ 基本功 ~
| 名稱 | 概念 | 目的 | 參考 |
|---|---|---|---|
| Double Free | 1. Free 了兩次同一個 pointer 2. 然後 alloc 時,這個 pointer 就會被 alloc 兩次。 3. free 其中一個,剩下的便可以有個 editable freed chunk。 | Editable Freed Chunk | |
| Heap Consolidation | 1. 修改 chunk metadata,使它以為是一個 freed chunk。 2. 調用 free(..),使 consolidation 發生 3. 再 alloc,便會多一個 pointer 指向同一個 chunk。 4. 同 double free:都是有個 editable freed chunk。 | Editable Freed Chunk | |
| Use After Free | 純粹將一個 free(..) 的 pointer 寫入資料 | Editable Freed Chunk | |
| Unlink | 將兩個 freed chunk 的 FD BK 改寫,達到 arbitrary write 的效果 | Arbitrary Alloc Arbitrary Write | |
| Off By One | 字串寫入時溢出 1 byte。導致在 heap 上可以偽造下一節的 prev_inuse,使到偽造出 freed 效果。然後導致prev_size 可用;但也可以偽造 prev_size。 | prev_inuse overwrite (faked free) prev_size overwrite | https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/off-by-one/ |
| Heap Grooming / also aka “Heap Feng Shui" | 原意是指出 alloc / free 都是可預測的 | 有效控制 alloc / free | 來自 BlackHat 2007 發佈 https://www.blackhat.com/presentations/bh-europe-07/Sotirov/Presentation/bh-eu-07-sotirov-apr19.pdf |
| Fake Chunk 偽造節 | 在 stack 或用其他變數偽造成 chunk 格式。 | Arbitrary Alloc Arbitrary Write Editable Freed Chunk |
~ 元素技 ~
| 名稱 | 概念 | 目的 |
|---|---|---|
| Fast bin Attack | 利用 fastbin 的 single linked-list 原理。改寫 FD 指向目的地址。然後 fastbin alloc 就會派出了目的地址。 | Arbitrary Alloc |
| Unsorted bin Attack | 利用 unsortedbin 的 doubly linked-list 原理。改寫 FD BK。然後 unsorted bin alloc 就會派出目的地址。 | Arbitrary Alloc |
| Large bin Attack | 類似 fastbin 和 unsortedbin attacks。有不同的是,largebin 會按大小排列擺放。所以當有個新的 freed chunk 排入時,就會有個 arbitrary write 動作。 | Arbitrary Alloc Arbitrary Write |
| Tcache Attack | 和 fastbin attack 類似。 | Arbitrary Alloc |
~ 組合技 ~
| 名稱 | 概念 | 目的 | 參考 |
|---|---|---|---|
| House of Spirit | 用 Fake Chunk 偽造節,再調用 free(..)。再 alloc 就會派出這個偽造節。 | Arbitrary Alloc | |
| House of Lore | 類似 House of Spirit。不過是連結到 small bin / large bin 的 FD BK pointer 上。同樣 alloc 就會派出去。 | Arbitrary Alloc | |
| House of Force | 改寫 heap wilderness value;再 alloc 一個很大的 block 作對位作用。然後下一個 alloc 就會派出 arbitrary alloc,例如 Stack Alloc 或 BSS Alloc。 | Arbitrary Alloc | |
| House of Einherjar | 類似 House of Spirit 和 House of Lore。不同的是利用向後合併。用一個 controlled chunk 控制節地址上接駁了目的地址。然後改寫了 metadata,致使 free(..) 的時候觸發向後合併 consolidation。然後 alloc.就會派出目的地址。 | Arbitrary Alloc | |
| House of Rabbit | 和 House of Lore 很像,不過是用 fastbin FD pointer。fastbin 是 single linked-list。 改寫 FD 為目的地址後,alloc 一個大於 0x10000 (64K) 的節,觸發 fastbin consolidation;fastbin 就會進入 unsorted bin。然後是 unsorted bin attack。 | Arbitrary Alloc | https://www.kn0sky.com/?p=d22edd6b-7d44-4bd9-baea-bdecc73a8da2 |
| House of Orange | 主要原理是在沒有 free(..) 的情況下,用 top chunk release 來模擬 free(..)。方法是當 top chunk 不足以 alloc,就會調用 brk,舊的 trunk 就會被 free 到 unsorted bin。然後是 unsorted bin attack。 | Arbitrary Alloc | https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-orange/ |
| House of Roman | 是個很複雜的組合技。 用 Fake Chunk 偽造節 free 了進入 unsorted bin。然後修改 FD 和 malloc,使 malloc_hook 寫為 main_arena+88. 再將 malloc_hook 最低三字節改寫 one_gadget。調用 free(..) 或 malloc(..) 兩次,就會依次取得 malloc_printerr 和 get_shell。 | Shell | https://www.kn0sky.com/?p=761e0f77-6a76-44a9-a0d6-52d647d9e249 https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-roman/ |
| House of Pig | 是個很複雜的組合技。用 largebin attack, tcache stashing unlink attack,可以得到 getshell。有不少限制,而且不易用;通常可以用較簡單的方式取代。 | Shell | https://www.anquanke.com/post/id/242640#h2-3 |
| House of Storm | 是很複雜的組合技。用 unsortedbin attack,將 BK 指向目的地址 addr。然後 largebin attack 將 BK 指向 addr+0x10;BK_nextsize 指向 addr-0x20+3. 然後 alloc 0x50 就會取得目的地址。 | Arbitrary Alloc | https://www.kn0sky.com/?p=195d505e-1310-4e6d-b9cd-20eadd7200b9 |
| 其實還有 House of Kiwi House of Emma House of Apple House of Banana House of Water House of Tangerine House of Botcake House of Mind House of gods House of Prime House of Chaos | 普遍技術研究較少提及。未能盡錄。 | 這 House of xx 傳統,改名最初來自這個帖 https://github.com/Malformation/Notes/blob/master/MallocMaleficarum.txt 概念啟發來自這本書 https://en.wikipedia.org/wiki/Malleus_Maleficarum |
~ Reference ~
https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_rabbit/
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-rabbit/
https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
《資安 pwn 不正常技術研究所》系列: