刷题总得学到什么,不能刷完就忘了怎么做了(。),于是有了这个RE套路的子系列——从例题学技巧。
本文通过攻防世界Reverse答题进阶区的一道crackme,记录nsPack北斗壳的手工脱壳流程。
例题:crackme
环境及工具:win10(vmware) + ExEinfoPE + OllyDBG + PE Tools + ImportREC
日常第一步查壳
用ExEinfoPE打开,显而易见是nsPack壳,于是打开虚拟机使用OD脱壳(OD扔虚拟机上了)。
P.S. 如果直接用IDA打开会报错Truncated section '.nsp1' at file offsets 0x400..0x1A00; Will read 0x1445 bytes
和这个↓
The imports segment seems to be destroyed. This MAY mean that the file was packed or otherwise modified in order to make it more difficult to analyze. If you want to see the imports segment in the original form, please reload it with the 'make imports section' checkbox cleared.
这时候就要警惕有壳了。
OD打开寻找OEP
脱壳原理为ESP定律(即堆栈平衡定律),是应用频率最高的脱壳方法之一,详情指路 -> ESP定律原理详解 - FreeBuf网络安全行业门户。
将crackme.exe用OD打开
F8单步执行,可以看到只有ESP和EIP发生了变化。
在ESP地址处右键->HW break[ESP],下硬件断点,这样程序再次访问0x0019FF70内存地址时程序会抛出异常暂停运行(具体原理看上面的ESP定律)。简单来说就是程序加载时会用push将当前状态保存在栈中,这时已执行pushfd
,ESP指向栈顶元素,于是在下次访问该内存地址时,就是执行popfd
之后。
所以在按下F9时,程序会停在这里。
这里是一个跳转语句,根据北斗的特性可知这里跳转到了OEP,即程序真正的入口,按F7步入,并记住该地址(0x00401336),后面有用。
dump内存
OD不要关(整个脱壳步骤结束以后才可以关),打开PE Tools来dump内存(注意要以管理员身份运行,不然读不到正在调试中的crackme.exe)。找到该文件右键->Dump Full->保存,此时可以在文件同名目录下看到Dumped.exe。
修复IAT
这个就是脱壳后的程序,但是不能正常运行,所以我们需要修复IAT。
打开ImportREC(同样要以管理员身份运行),依次进行:
- 附加活动进程(找到正在调试中的crackme.exe)。
- 填入OEP(即上面记住的地址0x00401336-基地址0x00400000=0x00001336,基地址为底部记录中的“映像基地址”)。
- 点“自动搜索”。
- 点“获取输入表”。
- 点“修复转存文件”->选择Dumped.exe->打开。
此时文件夹中生成Dumped_.exe,此为最终脱壳后可运行的程序。
成功脱壳
(这时候OD可以关闭了)此后按正常逆向流程走就可。