Fastbin attack&&Double free和Unsortbin leak的綜合使用

CH13hh發表於2024-04-27

Fastbin attack&&Double free和Unsortbin leak的綜合使用✅

今天做一個綜合題目,包括利用Fastbin attack實現多指標指向一個地址,以及利用Unsortbin leak洩露libc基地址和修改__malloc_hook地址為one_gadget

題目是buuctf上面的一道題目,題目連結 https://buuoj.cn/challenges#babyheap_0ctf_2017

checksec看一下保護

Fastbin attack&&Double free和Unsortbin leak的綜合使用

太綠了.....保護全開,不過對於堆題目這也狠正常

那麼就64位ida載入

Fastbin attack&&Double free和Unsortbin leak的綜合使用

也是有一個選單和一些功能函式

一個一個看

Fastbin attack&&Double free和Unsortbin leak的綜合使用

那麼第一個就是申請多大的chunk沒有對其賦值

Fastbin attack&&Double free和Unsortbin leak的綜合使用

第二個問題來了,沒有對size檢查,那麼可以進行溢位修改到別的chunk

Fastbin attack&&Double free和Unsortbin leak的綜合使用

第三個函式把指標什麼的都置為0了,那麼就沒有UAF了

Fastbin attack&&Double free和Unsortbin leak的綜合使用

第四個函式可以列印出chunk的內容

仔細檢查程式,發現並沒有後門函式,那麼現在思路是看看能不能能洩露libc,把一個函式替換成one_gadget得到shell

這裡Unsortbin leak 可以洩露出libc地址,為什麼呢?

Unsortbin leak原理:✅

當只有一個unsortbin被free的時候,它的fd、bk指向一個指標,這個指標指向top chunk地址,這個指標儲存在main_arena+0x58偏移處,而main_arena是libc的data段中,是全域性靜態變數,所以偏移也是固定的,根據這些就可以計算出libc的基地址了

那麼要想把它列印出來還不行,因為我們不能列印已經free的chunk(指標置為0了),但是因為是64位的chunk,如果要利用列印上一個chunk來列印這個chunk的內容,那也會有很多的\x00來進行截斷,所以也是行不通的,那麼我們可以找一個指標指向這個已經free的unsortbin,然後列印這個指標對應的chunk,問題似乎就解決了,那麼該怎麼做到呢?

如果我們可以利用Fastbin attack先將其加入fastbin 鏈中然後就有了一個指向它的指標,然後再malloc回來再將他改回原來的大小,再次free得到unsortbin,再列印剛剛指向它的chunk就得到main_arena+0x58處的地址了!

Fastbin attack&&Double free和Unsortbin leak的綜合使用

效果如下

Fastbin attack&&Double free和Unsortbin leak的綜合使用

可以看見chunk2成功指向chunk4

Fastbin attack&&Double free和Unsortbin leak的綜合使用

Fastbin attack&&Double free和Unsortbin leak的綜合使用

這個時候我們改變它的size為0x21因為malloc fastbin 有檢查, chunksize 必須與相應的 fastbin_index 匹配,所以我們覆蓋 chunk 4 的 size 為 fastbin 大小來透過檢查

效果如下

Fastbin attack&&Double free和Unsortbin leak的綜合使用

chunk4變成了fastbin

再次malloc兩個大小為0x10的chunk將這兩個chunk2和chunk4拿出來,然後再進行修改chunk size大小為0x91再次申請0x80大小chunk(申請到chunk4)然後再次進行free得到unsortbin

那麼就可以得到libc基地址,和one_gadget地址

Fastbin attack&&Double free和Unsortbin leak的綜合使用

效果如下

Fastbin attack&&Double free和Unsortbin leak的綜合使用

之後我們申請0x60大小chunk將unsortbin進行分割,使其進入fastbin,然後偽造距離__malloc_hook較近的假的chunk來修改__malloc_hook,這個地方一般取__malloc_hook-35這個地方的size比較大而且再fastbin範圍內(我本地是0x74)

Fastbin attack&&Double free和Unsortbin leak的綜合使用

Fastbin attack&&Double free和Unsortbin leak的綜合使用

我們再次修改fd指標

Fastbin attack&&Double free和Unsortbin leak的綜合使用

效果如下

Fastbin attack&&Double free和Unsortbin leak的綜合使用

再次申請兩個大小為0x60的chunk即可申請到我們設定的fakechunk然後修改__malloc_hook為one_gadget就好了,值得注意的是,找的的one_gadget可以有一點點差別,因為libc分為不同的小版本,不同的版本有區別,我們可以把找到的one_gadget加0x10或者減去0x10再試試

最後看看我們做的所有工作

Fastbin attack&&Double free和Unsortbin leak的綜合使用

總的來說這題的難度還是不小的,很需要綜合能力

最後完整wp

Fastbin attack&&Double free和Unsortbin leak的綜合使用

Fastbin attack&&Double free和Unsortbin leak的綜合使用

相關文章