Re1
是一個簡單的字串加密。程式使用了多個執行緒,然後進行同步。等加密執行緒加密好了之後才會啟動驗證執行緒。這個題比較坑的是IDA F5出來的結果不對,不知道是不是混淆機制。
剛開始看的是F5後的虛擬碼,一臉懵逼。後來看了下彙編才明白是怎麼回事。
解密直接打表就可以,也可以寫逆演算法。
pwn1
用checksec看了一下保護機制,有canary+nx保護。漏洞是一個簡單的棧溢位,但是沒有辦法劫持程式的流程。
因為flag已經被讀到了記憶體中了,所以就想到去leak出來。後來知道有一種ssp leak的玩法,就是故意觸發canary保護,
而這個保護機制會輸出argv[]中的程式名,由於棧中argv[]是系統呼叫主函式的引數,棧幀肯定在當前的高地址處,所以在棧中一定可以覆蓋的到。
於是就可以去覆蓋了。exp的構造是exp=junk+flag的指標。
pwn2
這道題開始時懵逼了一下,因為格式化字串漏洞之前接觸的都是格式化串儲存在棧裡的。而這道題的格式化串是儲存在bss段裡的。格式化字串漏洞是要想向任意地址寫,而格式化串不在棧裡地址就沒法指定了,這樣就很尷尬了。
後來想到可以先向棧裡寫入一個要寫入的地址,相當於構造一個跳板。但是這樣做的前提是棧裡得有一個指向棧中的指標,除錯起來一看,還真的有這樣的指標。
於是就可以構造了。
因為讀完之後馬上就會呼叫fflush(),所以這裡我就直接寫入got表了。而system函式題中已經提供了,連引數都已經push好了。直接把地址蓋過去就可以了。
兩個格式字串是
"%134525283x%4$n"
"%134520973x%12$n"