一道逆向題

極安御信發表於2022-03-24

查殼後程式是一個32位無殼的程式

拉到od和ida中分析一下

經過分析,

首先分析第一個字串比較的call

取字串的第一個字元,迴圈字串n次(n為字串的長度),將第一個字元相加n次,然後這個值=550也就是0x226

所以這裡只要滿足 字元*n=550 就可以,經過後面的分析這裡n需要填10(見下文)

也就是 7開頭長度為10 的字串

接下來除錯程式

在段首004010770地址下個斷點(ida中main函式開頭的地址)

我們一路單步(F8)來到這裡,這裡必須跳轉(可以修改標誌暫存器的S位改變是否跳轉),不然程式是不會進行字串比較的

下面那個call就是進行字串比較的call了

我們單步(F7)進入,發現這裡面有兩個跳轉

第一個jnz就是==550的判斷

第二個jnz是字串是否相等的判斷

對應ida中

這裡我們看到一串類似base64的字串

搜尋字串看一下

猜測這裡他自定義了base64編碼表

解密得到

因為這裡解密到的長度是10,所以上面的n才為10,不然加密後的字串長度是不夠的

此時我們測試一下,

當演算法call執行完成後我們修改字串為 上面解密到的,我們看能不能成功

在記憶體視窗中修改後

然後來到字串比較的地方

我們可以看到要進行比較的兩個字串是一樣的

所以現在

只需要讓我們輸入的字串經過演算法call後等於   =>=:<2>?=2

然後分析一下演算法的call

演算法call裡主要就是這個call,然後這個call執行了4次,我們點進去

分析

第一次執行的是4

第二次1

第三次2

第四次3

此時只需要將  =>=:<2>?=2 反推回來

也就是

先每一位+1,再除啦第一位後面每一位-3,再每一位xor9  就可以了

然後寫指令碼


相關文章