【HITCON-Training】Lab 12 - SecretGarden

muyiGin發表於2024-10-02

學習於2024-10-01 22:00:17 星期二

心得感想:這次真的把我整笑了,現在是10/2的晚上23點,我都不敢想象自己弄了多久(整整兩天國慶的下午🤯)。

分析

10/1:很明顯的UAF,但是我的電腦上有tcache,根本不懂機制,太奇怪了,明明釋放了又還在堆中use狀態???明天再看看吧,我不想把libc版本調低(因為很簡單了已經)。
10/2:太可惜了不能用UAF,為什麼呢,因為他沒有給我們提供修改的功能,否則就可以透過del()函式釋放content,然後用釋放的兩個content申請回來組裝成一個chunk,此時我們還保留著有指標:
image
並且我們還不能獲得libc地址(至少我不行),因為它visit的時候只會visit那些標誌位沒有被置0的,但是隻要你del了以後它就把標誌位置0了,這意味著即使你擁有/你知道他的指標沒有釋放,你也不能把它print出來。
然後還有tcache,我只知道用7個chunk來填滿它,無奈,最後退回2.23版本......

思路

現在思路只有double free了,如果你一開始就想到沒走彎路的話,這道題是不難。但是如果你一開始就感覺UAF能做出來的話,就要走彎路了...
為什麼會想到用double free?因為沒有釋放的指標必定能做的一件事就是改寫一個fd指標。但是改寫別的chunk你得保證能透過最簡單的size檢查呀,我也不知道標準答案怎麼搞出來的,有個0x60正好在free函式的上面,我只能說牛b。

過程

這程式碼沒什麼好說的,很簡單,你只要進入gdb列印一下地址你就明白為什麼申請0x50了(因為有個現成的0x60):
image
image
可以看到,確實符合申請0x50的時候需要的size(0x60)。
然後填充就行了,分別是free函式和puts函式,在這個frame裡面add會馬上執行到puts,所以我選擇就覆蓋個puts:
image
0x400c7b就是magic的地址,不要問為什麼不開PIE,問就是不會。
不要問為什麼不放system地址,問就是不會(開頭講了)。
然後在本地/home/xxxx(自己看ida或者原始碼)下面建一個flag檔案就行了!成功!(我的flag裡面寫著123)
image