[re]無需脫殼dump內存來靜態分析

[re]無需脫殼dump內存來靜態分析


ctf逆向中遇到加殼的程序,其實大部分情況下無需脫殼,因爲我們的目的是解題的到flag,只需分析出題目的算法,而不必要將殼完整的脫下來。所以我們可以採取動態調試等殼程序運行結束之後直接將解密後的源代碼從內存中dump下來靜態分析的方法來解題,下面以一道題目進行說明:

鏈接:https://pan.baidu.com/s/1lmNP32Bcnv9QfYLLESbQAg
提取碼:4r06

靜態分析

IDA打開之後發現只有一個start函數:
在這裏插入圖片描述
查看段,發現有vmp0和vmp1段,懷疑有可能是VMP殼,或者其他殼僞裝的,不確定,因爲PEinfo等查看PE文件的工具沒有分析出是什麼殼:

image-20200302210418666

vmp殼是一種將代碼加密之後啓動vmp虛擬機然後解密代碼在vmp虛擬機中運行的殼,具體可以查看52破解或者谷歌,這裏不詳細介紹(畢竟還不確定是否是vmp殼),而且這道題也沒必要將殼脫下來。

靜態看代碼start處,發現是一些沒有卵用的指令,然後接一個大跳轉:

image-20200302210557102

跟進大跳轉跳轉的地方:

image-20200302210647276

是很長的一段殼代碼,但看到了pushad,那麼根據esp定律法,找到對稱的popad基本就是殼程序的結束地方了,向下拉這段代碼就會發現popad,然後緊跟着有一個大跳轉:

image-20200302210758885

那麼有理由相信這裏就是殼程序的結束位置,這個跳轉應該就是跳到程序真實OEP的跳轉。

動態調試

將程序拖到OD裏,根據代碼末尾的地址和加上偏移找到運行時的地址下斷點,然後執行到斷點。或者單步執行法執行到這裏也可以(單步執行,遇到往回跳的跳轉直接執行到下一條指令):

image-20200302211309135

然後單步執行跟到跳轉之後的地方:

image-20200302211429231

有經驗已經看出這裏是vs編譯的c++代碼的入口點該有的樣子了,但即便沒看出來也沒關係,因爲之前我們分析的時候就懷疑這裏是真正的OEP所在,現在驗證一下,ctrl+D查看字符串:

image-20200302211528966

**可見我們已經看見了程序的關鍵字符串,說明這裏源代碼已經解碼完成,我們也進入了程序真正的源碼領域了。**接下來的彙編代碼就是程序的原本邏輯了,但看彙編畢竟頭大,我們將代碼從內存中dump下來然後使用IDA進行反彙編靜態分析。

dump內存

使用OllyDbg的OllyDump工具,首先要確定內存的起始地址,再OD的M窗口中:

這是我的地址,不同環境每次運行都不一樣,這裏可以看出test.exe是從內存地址0x870000的地方開始的,所以我們打開OD的插件OllyDump:

image-20200302212037026

只需改一下這兩項就可以了,其他的什麼OEP啊重建IAT表啊啥的都沒用,畢竟我們又不是脫殼,dump下來之後又不用它運行,點擊脫殼之後保存爲test2.exe:

繼續靜態分析

用IDA打開剛纔dump下來的test2.exe(不能運行的,不用試了)可以看到裏面已經有很多函數了:

image-20200302212238327

還是從字符串開始入手,查看字符串:

image-20200302212333718

和OD中看到的差不多,直接到關鍵字符串引用的位置看:

image-20200302212439226

找到這部分代碼了,但前面地址部分是紅色的,說明不在函數之中,那麼現在也沒法f5,憑經驗判斷應該有一些花指令、垃圾指令等等的擾亂靜態分析,所以往前看,沒多遠就找到了:

image-20200302212609229

看到函數到jmp eax的地方沒了,本不應該這麼突兀的結束,仔細分析這裏代碼發現端倪:

image-20200302212834837
xor     eax, eax    //eax異或自己,eax=0
mov     [eax], eax  //將eax的值傳給eax所指向的地址,地址0肯定是無法訪問的,一定會報錯
jmp     eax         //再跳轉到地址0更加無法理解

整個代碼就是個垃圾代碼,完全沒用,讓IDA不能明確分析出函數結構,乾脆nop掉:

image-20200302212948083

然後這時還是不可以f5的,還需要編輯一下函數結構,首先要找到函數真實的結束地址,一般retn地址就是函數結束的地方,總之往下來吧:

image-20200302213044494

可以看到這裏不止有retn還是下一個函數開始的地方,所以我們有理由相信這裏就是這個函數結束的地方,所以回到上面函數的區域郵件edit function編輯函數:

image-20200302213147135

這時可以嘗試f5了,發現可以:

image-20200302213215182

分析

進行到這裏已經完全可以靜態分析了,首先簡單判斷一下程序邏輯:

image-20200302213327813

輸入內容的結構體其實從初始化就能看出來(也不重要),v2[0]就是存放輸入字符串的指針,v2[4]是長度,其他沒用。能看出flag長度是38,進入校驗flag函數查看邏輯:

image-20200302213705142

邏輯非常簡單,將兩個字符串拼起來,然後江裏面的y換成7,z換成8就是flag了。

image-20200302213840394

補充

如果一定要調試的話, 需要使用OD在調試時修改代碼以繞過反調試,先把xor eax,eax那裏nop掉,因爲會訪問到不可訪問地址報異常退出:

image-20200302214030370 image-20200302214057843

然後後面還有個判斷debug的地方,可以直接把判斷跳轉改爲jmp直接跳轉:

image-20200302214136777 image-20200302214157925

然後就可以正常調試了,但由於是殼解密的代碼,每次調試都要修改一次,相對麻煩一些,建議能靜態分析就靜態分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章