Heap Exploitation
- 基於NTU Computer Security Fall 2019所寫的筆記
Heap workflow
- 通過
nmmap或brk跟kernel要memory

- 跟kernel要了memory會放在glibc再透過
malloc來跟glibc要memory

chunks
- 注意heap是以16 bytes唯一排
Allocated chunkmalloc拿到的Free chunkfree掉的Top Chunk未分配的

Allocated chunk
chunk header也可叫metadata- !
pointer會指向user data的頭而不是header size跟NMP中間有個byte不做使用

prev_size/data連續記憶體上⼀塊如是 free chunk,則紀錄該size,
若是 allocated chunk 則同時為它的 data。size該memory的大小(佔4bytes)(P) PREV_INUSE上⼀個 chunk 是否使⽤中(M) IS_MMAPEDchunk 是否透過 mmap 出來的(N) NON_MAIN_ARENA該 chunk 是否不屬於 main arena

Free Chunk
- 連續記憶體下⼀塊的
P flag為0
(fd) forward pointer指向同⼀ bin 中的前⼀塊 chunk (linked list)(bk) backward pointer指向同⼀ bin 中的後⼀塊 chunk (linked list)

Top Chunk
第⼀次
malloc後,剩下的空間為top chunk,分配空間時視情況從top chunk切割分配free
Top chunk 連續記憶體上⼀塊chunk時,若不是fastbin則會與Top chunkmerge,top chunkP恆為1。

bins
回收 Free chunk 的資料結構
主要依據
size⼤⼩,分為:fast binsize < 0x90 bytessmall binlarge binunsorted bin
Fast bin
Size < 0x90 bytes
bin 中依據
size又會劃分為,0x20, 0x30, 0x40 …global_max_fast= 0x80(在判定中是<=0x80)Singly linked list,
fd指向前⼀個,bk沒⽤到LIFO (Last in, First out)
! free 時
不會將下⼀塊chunk P flag設成0
Slow bin
• Circular doubly linked list
• 依據 size 劃分為 62 個bin
• 0x20, 0x30 ~ 0x3f0
• 0x20 ~ 0x80 的⼤⼩與 fast bin 重疊,會根據機制放到fast bin或small bin
• FIFO (First in, First out)
• free 掉時會將下⼀塊chunk P 設為0
Large bin
• Circular doubly linked list (依據⼤⼩遞減排序)
• size >= 1024 bytes (0x400)
• 63 bins
• 細節可以參考 source code
• header
• fd_nextsize
• bk_nextsize

Unsorted bin
Circular doubly linked list
free 的 chunk
size⼤於fast bin時,不會直接放到對應的bin裡,會先丟到unsorted bin中。mallocfast binsize⼤⼩時會先去fast binlist裡找,若沒有則會⾄unsorted bin找,如找到⼀樣⼤⼩則回傳,若無但找到⼤⼩⼤於所需⼤⼩的chunk則切割回傳,剩下的部分會丟回unsorted bin,若都沒有則從top chunk切出來回傳。在
malloc時會因為unsorted bin的切割而造成small bin也有fast bin的size。
Tcache
glibc>=2.26smallbin⼤⼩範圍的chunk都會使⽤tcacheTcache中,當滿7個時,再free才會再放⾄fastbin中。tcache fd是指向user data。malloc時沒有檢查size是否合法沒有檢查
double free
malloc
mallocfast binsize⼤⼩時會先去fast binlist裡找,若沒有則會⾄unsorted bin找,如找到⼀樣⼤⼩則回傳,若無但找到⼤⼩⼤於所需⼤⼩的chunk則切割回傳,剩下的部分會丟回unsorted bin,若都沒有則從top chunk切出來回傳。
Hooks
glibc中存在許多function hooks,會是個很好的寫入目標
__malloc_hook
__free_hook
__realloc_hook- 執⾏該
function時,發現該function hook有值,則當作function pointer跳上去執⾏。
Use After Free (UAF)
free( ptr )free完pointer後未將ptr清空( ptr = NULL ),稱之dangling pointer。information leakfast binleakheap addressunsorted binleaklibc address
Fastbin attack
fastbin 在檢查 double free 時,cmp
linked list第⼀個chunk即將要free掉的chunkbypass
free(A) free(B) free(A)

- malloc(0x70)


- write
sto fakefd

malloc到fake chunk

- write everywhere!

constraints
malloccheckchunk size是否正確bypass by using aslr address like 0x7f which is
size 0x70 N=true M=true P=true if u ignore the 0xc6