RE套路/从crackme学nsPack手动脱壳

刷题总得学到什么,不能刷完就忘了怎么做了(。),于是有了这个RE套路的子系列——从例题学技巧。

本文通过攻防世界Reverse答题进阶区的一道crackme,记录nsPack北斗壳的手工脱壳流程。

例题:crackme

环境及工具:win10(vmware) + ExEinfoPE + OllyDBG + PE Tools + ImportREC

参考链接:nSPack 手工脱壳过程_A_dmin的博客-CSDN博客

日常第一步查壳

用ExEinfoPE打开,显而易见是nsPack壳,于是打开虚拟机使用OD脱壳(OD扔虚拟机上了)。

image-20201216192612131

P.S. 如果直接用IDA打开会报错Truncated section '.nsp1' at file offsets 0x400..0x1A00; Will read 0x1445 bytes和这个↓

image-20201216193158740

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打开

image-20201216194654748

F8单步执行,可以看到只有ESP和EIP发生了变化。

image-20201216194754284

在ESP地址处右键->HW break[ESP],下硬件断点,这样程序再次访问0x0019FF70内存地址时程序会抛出异常暂停运行(具体原理看上面的ESP定律)。简单来说就是程序加载时会用push将当前状态保存在栈中,这时已执行pushfd,ESP指向栈顶元素,于是在下次访问该内存地址时,就是执行popfd之后。

image-20201216200103948

所以在按下F9时,程序会停在这里。

image-20201216200851737

这里是一个跳转语句,根据北斗的特性可知这里跳转到了OEP,即程序真正的入口,按F7步入,并记住该地址(0x00401336),后面有用。

image-20201216201053418

dump内存

OD不要关(整个脱壳步骤结束以后才可以关),打开PE Tools来dump内存(注意要以管理员身份运行,不然读不到正在调试中的crackme.exe)。找到该文件右键->Dump Full->保存,此时可以在文件同名目录下看到Dumped.exe。

image-20201216201531388

image-20201216201713462

修复IAT

这个就是脱壳后的程序,但是不能正常运行,所以我们需要修复IAT。

打开ImportREC(同样要以管理员身份运行),依次进行:

  1. 附加活动进程(找到正在调试中的crackme.exe)。
  2. 填入OEP(即上面记住的地址0x00401336-基地址0x00400000=0x00001336,基地址为底部记录中的“映像基地址”)。
  3. 点“自动搜索”。
  4. 点“获取输入表”。
  5. 点“修复转存文件”->选择Dumped.exe->打开。

image-20201216202501062

此时文件夹中生成Dumped_.exe,此为最终脱壳后可运行的程序

image-20201216202815682

成功脱壳

(这时候OD可以关闭了)此后按正常逆向流程走就可。

posted @ 2020-12-31 23:35  c10udlnk  阅读(1138)  评论(0编辑  收藏  举报