Simple PWN 0x39(Lab - Double Free)
Background
Source code
:::spoiler Source Code
1 |
|
:::
Recon
:::warning
Run On Ubuntu 20.04
:::
這一題有很多種方式可以拿到shell,不過原理都是一樣的,前置作業都是一樣的,也就是要利用UAF去leak出libc address,接著算出__free_hook
以及system
的位址,接著想辦法把system
寫到__free_hook
的位址,此時就有兩種方式可以寫,一種是利用此次學到的double free,把值寫到最後一個在tcache的free chunk,蓋掉他的fd,接著就可以用add_note把tcache的值要回來,並寫system的address進到__free_hook;另一種方式就比較簡單,也就是把free chunk的fd利用UAF的特性改掉,並且直接add_note把東西從tcache要回來,之後就一樣寫system_addr,後free掉一個帶有/bin/sh的chunk,此時就會開一個shell給我們了
前置作業: Leak Libc Address
關於這一點可以參考如何用UAF leak libc address?,方法都一樣,首先要想辦法讓free chunk進到unsorted bin中(最簡單的方法就是設定超過0x410的空間),接著因為malloc的時候沒有實作清空原本的資料,導致我們可以leak其中有關libc section的資訊。底下的設定意思是我們先設定三個notes,#14的意思是不要讓#13被free掉的時候被consolidate用的,接著我們把前兩個free掉,結果如下
會發現#12和#13被consolidate在一起了,接著我們看其中的一些資訊
裡面確實存著libc相關的資訊,接著只要把這一塊chunk malloc出去給隨便一個note,接著讀其中的資料就可以讀出libc address了
1 |
|
方法一: Double Fee
有了libc address後,我們要想辦法把system address寫到__free_hook
的位置,如果是要用double free的方法的話可以參考上課的講義:
最簡單的方法是,我把tcache填滿(一定要),然後用free(a)→free(b)→free(a)的順序產生double free
1 |
|
此時的heapinfo會變成:
接著我們把tcache清空後再繼續add_note就會把fastbin的free chunk搬到tcache中
1 |
|
接著我們寫free_hook address到note #8,這樣的話,tcache的順序就會變成下圖:
1 |
|
此時我們就把free chunk變成free_hook的地址,我們只不斷的add_note,就可以把tcache的free chunk要回來進行寫入,也就是寫system address:
1 |
|
最後的結果如上圖,會發現note #11已經變成==0x7f900aa8ae48==,這個就是__free_hook
的位址,進去看發現已經被我們寫入system address,這個時候我們只要把含有/bin/sh\x00
的note #9 free掉,就可以開shell了
方法二: 一般的寫入
這一個方法比較方便,也和double free沒關係,反正我們只要利用UAF的特性,也可以把free chunk的fd改掉,再用像前面的方法就可以開shell
下面的建構就是先開兩個note,然後free掉,此時我們就可以利用UAF的漏洞把free chunk的fd改掉,結果如下圖
1 |
|
接著就把/bin/sh\x00
寫到note #2,接著就不斷add_note,把__free_hook
的address拿到手,然後再把system address寫到__free_hook
,最後把含有/bin/sh\x00
的note #2 free掉,結果如下圖:
從上圖得知,note #4的address已經被我們換成
__free_hook
address,並且實際跟進去就是system address,最後只要free掉note #2就可以開shell了
Exploit - Leak Libc(UAF) + Double Free(?)
:::spoiler Method 1
1 |
|
:::
:::spoiler Method 2
1 |
|
:::