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"