完結撒花。
今天還是以做題為主。
fmtstr+uaf
格式化字符串+USER AFTER FREE
首先補充一個背景知識,指針也是有數據類型的,不同數據類型的指針+xx,所加的字節數也不一樣,其實是指針指的項目的下一項。如int a[20],a是指針,a+1就是往后4字節。
根據這個地址的思想,可以把func(args)等效為==(0xaaaa)(args)
------------------------------------------
首先checksec,看到了有可讀可寫可執行的地方,先留個心眼。
開始做題。做題可以自己擺弄擺弄程序,或者輸入一些自己覺得可能會出漏洞的地方,說不準就會出現問題,這里就是發生了double free。雖然還不太理解,但感覺不太正常。
漏洞出現在這里,還沒有確認退出就已經free了chunk o。如果我們輸入n,程序會重新來一次,但是o對應的指針已經指向了free chunk,在UAF這個選項,有一個malloc,恰好滿足UAF漏洞,這個o是寫入函數地址的chunk,我們可以實現任意函數執行了,或者其他操作(因為這里沒看到明顯的后門函數)
這里要注意這個o指向的位置,其實還是那個chunk,不要弄混淆。
大概思路就清晰了。首先這個題沒有棧溢出,我們考慮用堆。先通過UAF,搞一個shellcode到棧上。然后想辦法執行它。
難題出現,UAF能寫入的最多是24字節,但是pwntool生成的肯定不止。所以我們可以在之前的shellcode database里面搞一個shellcode出來。難題解決。
接下來是泄露棧的地址,如下,我們只需要知道了prev rbp的內容即可知道v7-v9地址。這樣就可以把shellcode注入到指定位置。
小技巧:可以在特定位置搞一個標記字符,如下所示,在recv和send會更加方便。
?這個標記字符還有一種情況,就是格式化字符不足一個字長,他就可以起到補滿一個字長。不然全亂了,因為它找參數是step為一個字長來找。
下面就是UAF示意圖。
變為
最后不要忘記程序執行是在1,2,3選項分別執行不同對應的o里面的代碼,還要發送一個讓shellcode被執行才可以!
hacknote(經典UAF)
堆題經典模板:可以創建堆,可以釋放,可以查看堆列表。
而且,好消息是,因為題目模板化,exp同樣也是模板化,一會便知。
···········································································
先來看看add函數。首先映入眼簾的就是它設置了一個限制。最多只能存在5個note,然后搞了個指針數組,來存儲note的地址。
看一下添加的邏輯:很簡單其實。
就是add的時候,遍歷這個象征著note的ptr數組,如果是空的,就malloc一個。但是這個malloc的是8,如下所示:會出來兩個實際上。
所以最終的結構實際上如下所示,每個數組指向了第一個chunk,而后第二個chunk還有一個大小看自己的chunk。
上面的chunk可是同樣有函數地址的,需要注意。
還是一樣的漏洞,看free,沒有free指針:
?
其實可以覺得是UAF了
然后開始做題。這里要用函數的思想,每一次進入子函數,都是那些代碼,輸入什么,輸出什么,而我們要不斷調用子函數,因此可以用函數在腳本里面封裝下:
我們可以先new兩次。上面的chunk類似于控制信息,下面的就是(垃圾)數據。
我們再free。這樣的話上面的chunk進入一個bin(估計是fast bin),下面的進入一個bin。
這里就已經初具雛形了,UAF。弄完后是下面這樣
我們再執行add。會重新malloc。看這個,我們malloc一個8size。fast bin是類似于棧,后進先出。首先2申請一個控制chunk,就是1原來所對應的。再申請一個8size的chunk,就是0所對應的控制chunk。
這里不要忘記UAF的關鍵,就是沒有free原來的指針,導致那個指針和新malloc的指針指向同一個地方,可以篡改老指針指的地方,借用老指針做一些壞事。
在這里面,0認為的控制信息,就是2認為的數據區域
這里題目還給一個so文件,肯定是需要泄露地址。
所以先用2,給0的控制塊第二個(相當于參數)寫入puts的got表地址。這是泄露這一步要干的事情。
我們用程序顯示chunk內容的那個子函數,來搞泄露。
泄露完之后,再填充為:
?
即可。
注意,這里參數是||sh,為啥有個杠杠?因為程序設計問題。程序設計的system參數實際上是*0,也就是這一段。實際的執行語句見下面:
第一個是system的真實地址,肯定會執行失敗。||這個特殊的符號(意思是或),會在第一個執行失敗,執行第二個sh。那為什么泄漏的時候,不用考慮這個。因為泄露的時候的puts,是出題人寫的my_puts,不是plt表的puts。已經考慮這里的情況了。
這還只是初級堆利用,以一張完整的本題利用圖作為收尾吧!愿頂峰相見!