CTF-REVERSE练习之脱壳分析

预备知识

相关实验

本实验要求您已经认真学习和完成了《CTF REVERSE练习之逆向初探》。

在自然界中,植物用壳来保护种子,动物用壳来保护身体等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。他们附加在原程序上通过Windows加载器载入内存后,先于原始程序的执行,得到控制权,执行过程中对原始程序进行解密和还原操作,还原后再把控制权交给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可防止程序被静态反编译。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。
按照壳的功能特性,壳可以划分为压缩壳和加密壳,压缩壳侧重于压缩体积,加密壳侧重于加密,二者的出发点是不一样的。常见的压缩壳有upx、ASPack等,常见的加密壳有ASProtect、Armadillo等。

UPX

UPX(the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器。压缩过的可执行文件体积缩小50%-70%,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。通过UPX压缩过的程序和程序库完全没有功能损失,和压缩之前一样可正常地运行。对于支持的大多数格式没有运行时间或内存的不利后果。
UPX支持许多不同的可执行文件格式,包含Windows 95/98/ME/NT/2000/XP/CE程序和动态链接库、DOS程序、Linux可执行文件和核心等。
UPX的官方网站为http://upx.sf.net/,upx程序除了加壳之外,同时支持脱壳操作。

实验目的

1)理解加壳与脱壳的概念。
2)掌握UPX加壳工具的用法。
3)学会手工脱壳的基本流程以及注意事项。

实验环境

在这里插入图片描述
服务器:Windows XP,IP地址:随机分配
辅助工具:PEiD,OD,ImportREC

实验步骤一

题目描述:
主机C:\Reverse\6目录下有一个CrackMe6.exe程序,这个程序是使用upx程序加过壳的,请尝试对其进行手工脱壳,并编写详细的分析报告。要求脱壳后的程序可以正常运行。
考察意图:
这个CrackMe程序是经过UPX加过壳的,主要考察参赛选手的手工脱壳能力。大部分压缩壳的手工脱壳方法都比较类似,通过对简单的UPX壳的手工脱壳分析,掌握手工脱壳的基本流程以及注意事项。
观察程序的外部特征:
运行C:\Reverse\6\CrackMe6.exe程序,提示需要对该程序进行脱壳处理,程序的运行界面如下图所示:
在这里插入图片描述
使用PEiD载入程序,查看CrackMe6.exe被加了什么壳,PEiD的主界面显示如下图所示:
在这里插入图片描述
提示信息为“UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo”,可以初步断定程序被加过UPX壳了。下面尝试使用IDA对这个加了壳的程序进行分析,IDA弹出这样一个警告提示,如图所示:
在这里插入图片描述
通常弹出这样的提示都意味着程序经过了加壳处理,这时候最好不要直接使用IDA去进行分析,因为加壳后的程序很难通过IDA的静态分析来理解程序的内部执行逻辑。

实验步骤二

使用Ollydbg进行脱壳:
使用OD载入CrackMe6.exe程序,OD的反汇编窗口停留在一条pushad指令上面,我们按下F8单步跟踪到下一条指令,然后在右侧的寄存器窗口中选中ESP寄存器(可以看到ESP寄存器的值为0012FFA4),并单击鼠标右键,在弹出的右键菜单中选择“数据窗口中跟随”,如图所示:
在这里插入图片描述
在反汇编指令窗口下面的数据窗口中,选择0012FFA4开始的四个字节,并单击鼠标右键,在弹出的右键菜单中依次选择“断点”——“硬件访问”——“Dword”菜单项,如图所示:
在这里插入图片描述
接下来按下F9运行程序,程序运行一段时间后OD将自动断下,这时候我们先删除之前设置的硬件断点,依次选择菜单项中的“调试”——“硬件断点”,删除我们设置的硬件断点,如图所示:
在这里插入图片描述
现在按F7进行单步跟踪,直到运行到0043FD24这一条指令,当然这里有一个循环比较麻烦,我们可以直接在0043FD24按下F4即可(F4代表运行到光标所在行),然后再次F7单步跟踪,来到004094F8。

0043FD17    8D4424 80      lea     eax, dword ptr [esp-80]
0043FD1B    6A 00          push    0
0043FD1D    39C4           cmp     esp, eax
0043FD1F  ^ 75 FA          jnz     short 0043FD1B
0043FD21    83EC 80        sub     esp, -80
0043FD24  - E9 CF97FCFF    jmp     004094F8

现在在反汇编指令窗口中单击鼠标右键,选择“Dump debugged process”菜单项,在弹出的OllyDump窗口选择“Dump”按钮保存文件,注意记住这里的94F8,这是程序的入口点信息。我们将程序保存为dumped.exe,如图所示:
在这里插入图片描述
现在请不要关闭OD,后面还需要进行修复操作。对UPX脱壳而言,进行到这一步就可以了,但是如果是另外一些壳,可能还需要对程序的输入表进行修复操作。

实验步骤三

修复脱壳后的程序:
注意在继续进行实验之前,请确保你停留在实验步骤二中最后的一步。现在打开桌面上的ImportREC程序,首先在进程列表中选择C:\Reverse\6\crackme6.exe,然后在OEP中填入94F8(也就是在OD中找到的一个信息),然后点击“IAT AutoSearch”按钮,接着点击“GetImports”按钮,就可以看到程序的输入表信息了。
点击右侧的“Show Invalid”按钮,看看是否存在无效的输入表项目。无效的输入表项目前面带有问号(?),如果有可以使用右键菜单删除。这里没有无效的输入表项目,所以选择“Fix Dump”按钮,对我们的dumped.exe进行修复,得到dumped_.exe程序。
在这里插入图片描述
现在对程序的脱壳以及修复操作已经全部完成,使用PEiD对dumped_.exe程序查壳,可以看到提示“Microsoft Visual C++ 6.0”信息,dumped_.exe程序也可以正常运行,至此脱壳完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

ChuMeng1999

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值