Fastbin attack&&Double free和Unsortbin leak的綜合使用✅
今天做一個綜合題目,包括利用Fastbin attack實現多指標指向一個地址,以及利用Unsortbin leak洩露libc基地址和修改__malloc_hook地址為one_gadget
題目是buuctf上面的一道題目,題目連結 https://buuoj.cn/challenges#babyheap_0ctf_2017
checksec看一下保護
太綠了.....保護全開,不過對於堆題目這也狠正常
那麼就64位ida載入
也是有一個選單和一些功能函式
一個一個看
那麼第一個就是申請多大的chunk沒有對其賦值
第二個問題來了,沒有對size檢查,那麼可以進行溢位修改到別的chunk
第三個函式把指標什麼的都置為0了,那麼就沒有UAF了
第四個函式可以列印出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處的地址了!
效果如下
可以看見chunk2成功指向chunk4
這個時候我們改變它的size為0x21因為malloc fastbin 有檢查, chunksize 必須與相應的 fastbin_index 匹配,所以我們覆蓋 chunk 4 的 size 為 fastbin 大小來透過檢查
效果如下
chunk4變成了fastbin
再次malloc兩個大小為0x10的chunk將這兩個chunk2和chunk4拿出來,然後再進行修改chunk size大小為0x91再次申請0x80大小chunk(申請到chunk4)然後再次進行free得到unsortbin
那麼就可以得到libc基地址,和one_gadget地址
效果如下
之後我們申請0x60大小chunk將unsortbin進行分割,使其進入fastbin,然後偽造距離__malloc_hook較近的假的chunk來修改__malloc_hook,這個地方一般取__malloc_hook-35這個地方的size比較大而且再fastbin範圍內(我本地是0x74)
我們再次修改fd指標
效果如下
再次申請兩個大小為0x60的chunk即可申請到我們設定的fakechunk然後修改__malloc_hook為one_gadget就好了,值得注意的是,找的的one_gadget可以有一點點差別,因為libc分為不同的小版本,不同的版本有區別,我們可以把找到的one_gadget加0x10或者減去0x10再試試
最後看看我們做的所有工作
總的來說這題的難度還是不小的,很需要綜合能力
最後完整wp