透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

CH13hh發表於2024-05-05

透過劫持執行緒arena,當堆開了一個執行緒之後,如果沒有做好保護隨之的危險也悄然而至 ❗

BUU上的n1ctf2018_null很好的說明了這個問題

題目連結:BUUCTF線上評測 (buuoj.cn)

看一下保護:

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

除了pie保護剩下的保護全開了,64位ida載入看一下

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

上來是一個輸入密碼,密碼是i'm ready for challenge ,隨後登入成功,建立了一個新的執行緒

我們進去看看

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

是一個死迴圈,可以看見對輸入的chunk大小以及數量都是非常大的,而且程式還有一個溢位我們看一下sub_400bca

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

那麼可以看見當我們輸入的內容比size小的時候,我們可以二次輸入這次最大可以輸入size的大小,原因是a2沒有進行更新,那麼這裡有溢位點

我們再看一下它下面的函式

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

如果我們能修改此處的地址為system,而引數是/bin/sh那麼我們就可以得到shell

如果我們溢位的位元組足夠大可以覆蓋執行緒arena,那麼我們可將fake_chunk連結到fastbin,進而分配我們想要的地址,但是arena是先mmap出來的,heap是過後才分配出來,所以我們覆蓋不了執行緒arena,但是如果,我們把這塊記憶體耗完會發生什麼,那麼系統會重新分配mmap一段記憶體,但是由於它後面是libc的地址,所以它會往前面找一塊地址,那麼我們輸入的內容就可能線上程arena的前面,我們先申請這麼大看看

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

看一下vmmap

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

我們看一下此處內容,從連結串列特徵上來看,這是一個執行緒arena結構,它位於地址較低的地方

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

看看我們輸入的內容的位置

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

計算一下

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

那麼我們加剛剛申請的這個是262個,我們再申請262個看看

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

我們輸入的資料在它前面,那麼可以看見我們再利用二次輸入資料是可以覆蓋執行緒arena的

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

現在計算偏移進行覆蓋

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

填充0x50個垃圾資料覆蓋到執行緒arena,這裡注意這裡有個大小我們不要隨意去改變,可以適當改最前面的一個位元組,不然會出現一系列的問題

後面我們在把我們的fake_chunk接上去

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

那麼此時我們再次申請chunk就會申請到假chunk

選擇0x60201d的原因是這裡可以偽造假chunk的size位

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

然後我們把0x602038的地方改成system的plt地址

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

然後申請0x60大小的chunk就可以申請到fake_chunk

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

程式會把rbp-8處的位置給rdi,而且這個位置就是我們申請chunk輸入的資料,隨後call rax(0x602038)進而得到shell,記得補齊到0x60哦✅

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

wp:

透過劫持執行緒arena實現任意地址分配 n1ctf2018_null

相關文章