2018/11/19-湖湘杯Re-Replace
Replace
題目連結:https://pan.baidu.com/s/1kASjMHQYrQsHCYPEAIyk9w
提取碼:f5j9
我們首先用IDA開啟,發現沒有多少東西,可以猜到是加了殼的。
使用Peid進行查殼,發現是UPX殼。
Upx殼比較簡單,我們之間使用esp定律殼輕鬆找到OEP。
我們使用x32dbg來分析這個程式,x32dbg反編譯功能,這樣我們不必脫殼,在進行分析核心演算法的時候夠使用反編譯功能即可得到虛擬碼。
等殼載入完後到了繼續單步跟蹤,即可找到程式的核心部分,可以看到成功與失敗的字串“Well Done
我們對這片彙編程式碼進行反編譯。
可以看出程式的功能是獲取輸入35個字元,然後再核心函式裡對輸入進行驗證,若輸入正確,則輸出成功,若輸入錯誤,則輸出錯誤。
下面我們跟進核心函式進行分析,彙編程式碼比較複雜,我們仍使用x32dbg的反編譯功能。
反彙編後
經分析我們可以看到有一個do-while迴圈來處理輸入的35個字元,進行迴圈35次,每次處理一個字元。
迴圈中首先根據輸入的一個字元進行運算得到兩個值esi6和ed7
接著根據程式中的一個地址儲存的陣列(我們稱為data陣列)中的值生成eax8和ecx9
我們動態除錯一下可得到data陣列中的值。
然後就是進行比較,我們來看最後進行的比較
分析知道是比較的是,由edi7和esi6進行運算得到一個數當下標,然後在一個數組中(我們稱為arr陣列)進行查詢,然後和ecx9與eax8進行運算的值比較。
也就是說,比較的兩個值,一個是根據輸入的字元生成下標,然後在arr陣列中進行尋值,另一個值呢,是根據程式中的data陣列生成的。
並且可以知道,
得到
cmp2[35]={0x33,0x50,0xef,0x85,0x21,0x20,0x45,0xc7,0x8f,0xcf,0xc7,0x8f,0xcf,0xed,0xf9,0x3c,0x51,0x50,0x4d,0xcf,0x0,0x4d,0x51,0xc7,0xef,0xfb,0xc3,0xcf,0x6e,0x9f,0xfb,0x4,0x43,0xc3,0xff}
即cmp2陣列的值都能在arr陣列找到,只要滿足輸入的字元生成的下標正確即可。然後我們知道迴圈每次都處理一個字元,產生一個下標,有一個對應的arr陣列的值,然後和cmp2陣列進行比較。
所以我們選擇輸入常見的字元然後進行除錯,在比較的地方設下斷點,然後執行檢視暫存器eax,(將下面比較不相等的跳轉指令nop掉),就是這個字元在arr陣列中對應的值,然後我們能夠得到常見字元對應的arr陣列中的值。
常見字元對應的arr陣列中的值如下(為了節省時間不全部列出,列出比較值主要對應的):
0-0x4 1-0xc7 2-0x23 3-0xc3 4-0x18 5-0x96 6-0x5 7-0x9a 8-0x7 9-0x12
a-0xef b-0xaa c-0xfb d-0x43 e-0x4d f-0x33 g-0x85 h-0x45 i-0xf9 j-0x2
... l-0x50 m-0x3c n-0x9f ... p-0x51 ... s-0x8f ....
... R-0x0 T-0x20 S-0xed ... E-0x6E ... {-0x21 ... }-0xff ... _-0xcf ...
然後我們只要將cmp2陣列的中的值進行匹配相應的字元即可。