1. 程式人生 > >看雪 FPC--reverse

看雪 FPC--reverse

很長時間沒有在這裡記錄Writeup了,這次這道題目實在太讓我興奮了。有感而記。

拖進IDA;

驚奇的發現,除了scanf之外,只需要兩個函式就執行到了"Bad.....";

依次檢視兩個驗證函式;

1.sub_401080

 會發現  a1與v2是恆等的,if 不會成立,也就是永遠不會“YouGetIt”

2.sub_4010D0

同樣的道理,這裡也永遠不會"Yougetit"

困惑:這就很不正常了,就是說程式的正常執行流程下,永遠不會pass;

暗示,可能需要特殊的輸入,改變程式的執行流程(棧溢位)

拖進OD,在scanf入flag後通過觀察棧,得知,12個字元恰好覆蓋返回地址以上部分。

那麼,要把程式帶到什麼地方呢(用哪個地址來覆蓋原來的返回地址); 由於輸入的全部是可列印字元,可以在IDA中手動檢視可疑的地址欄位。發現00413131,是一段很像花指令的東西。

嘗試一下,輸入‘aaaabbbbcccc11A’; 驚奇的發現,程式執行了驗證演算法,(證實了思路)

由於花指令的存在,我選擇了動態除錯 在OD中開啟RUN TRACE,單步跟入除錯(F8或者f7跟蹤,遇到跳轉,jz,jl   可以改變z標誌位改變流程,繼續跟蹤)

最後檢視執行過的指令。

拷貝下來,過濾得到有效的指令

分析彙編程式碼:

add esp,-0x10 xor eax,eax mov dword ptr ds:[0x41B034],eax pop eax mov ecx,eax pop eax repne jae short 00413266 mov ebx,eax pop eax mov edx,eax mov edx,eax mov eax,ecx sub eax,ebx shl eax,0x2 add eax,ecx add eax,edx sub eax,0xEAF917E2

對應的方程:

(x-y0<<2 + x + z == 0xEAF917E2

add eax,ecx sub eax,ebx mov ebx,eax shl eax,1 add eax,ebx add eax,ecx mov ecx,eax add eax,edx sub eax,0xE8F508C8

對應的方程:

(x-y) << 1 + (x-y) + x + z ==0XE8F508C8

mov eax,ecx mov eax,ecx sub eax,edx sub eax,0xC0A3C68

對應的方程:

(x-y) << 1 + (x-y) + x  - z == 0xC0A3C68

其實就是解三元方程組 用Z3求解器,或者線上求解 得到x,y,z,在加上'11A'就是flag

Just0For0Fun11A