Ghost
文章2
标签2
分类0
使用x64dbg进行手动脱壳

使用x64dbg进行手动脱壳

​ 平常拿到和壳相关的题目时,一般都是直接upx -d xxx.exe脱掉,更精细点的就是篡改特征位,也就是把UPX0 … UPX1 … 改成别的,但是用010之类的编辑器再加上upx也能很轻松的脱掉。但是还有一些更加困难的题目,就需要考虑手动脱壳了。

这里我拿一个加壳之后的exe来举例

​ 进入工作文件,在命令行中输入upx.exe -d 111.exe,尝试对目标文件进行脱壳。

这里发现脱壳失败,于是使用x64dbg进行脱壳,原理借用这位大佬博客中的原文来解释:

upx的工作原理其实是这样的:首先将程序压缩。所谓的压缩包括两方面,一方面在程序的开头或者其他合适的地方插入一段代码,另一方面是将程序的其他地方做压缩。压缩也可以叫做加密,因为压缩后的程序比较难看懂,主要是和原来的代码有很大的不同。最大的表现也就是他的主要作用就是程序本身变小了。变小之后的程序在传输方面有很大的优势。其次就是在程序执行时,实时的对程序解压缩。解压缩功能是在第一步时插入的代码完成的功能。联起来就是:upx可以完成代码的压缩和实时解压执行。且不会影响程序的执行效率。

upx和普通的压缩,解压不同点就算在于upx是实时解压缩的。实时解压的原理可以使用一下图形表示:

1
graph LR;`` ``1``-``-``>``2``-``-``>``3``-``-``>``4``-``-``>``5``-``-``>``6``;

假设1是upx插入的代码,2,3,4是压缩后的代码。5,6是随便的什么东西。程序从1开始执行。而1的功能是将2,3,4解压缩为7,8,9。7,8,9就是2,3,4在压缩之前的形式。

1
graph LR;`` ``1``-``-``>``7``-``-``>``8``-``-``>``9``-``-``>``5``-``-``>``6``;

连起来就是:

1
graph LR;`` ``1``=``=``>``2``-``.``-``>``3``-``.``-``>``4``-``.``-``>``5``;`` ``7``=``=``>``8``=``=``>``9``=``=``>``5``=``=``>``6``;`` ``2``-``-``>解密``-``-``>``7``;`` ``3``-``-``>解密``-``-``>``8``;`` ``4``-``-``>解密``-``-``>``9``;

参考文献:UPX原理与应用-CSDN博客

于是我们只要跟踪到这部分栈被弹出,也就是待upx这部分跑完之后,剩下的就是我们的源文件了。

打开x64dbg

先找到入口断点

在自带断点处看到push rbx,于是F9直接运行到断点处;再f7步进,把push段结束

利用RSP指向栈顶的特性,查看右侧窗口RSP,右键转到内存窗口

在RSP所指内存上右键,选择断点访问,几字节随意,F9直接运行到断点处

现在在断点内存附近寻找函数结束标志。在断点下方发现pop,代表着壳程序的结束

那么下面jmp所指向的地址应该就是主要程序运行了,选择f7步进,发现到jne会被回弹到上方push防止进行脱壳

于是选择在jne下方设置断点直接运行到下方

成功跳过,并将进程RIP停在jmp上方

现在进行数据提取与脱壳,在此处使用插件scylla跟着图片上的步骤进行操作,先生成dump文件

现在跟着步骤选择刚刚生成的dump文件,修复之后就得到了最终脱壳后的XX.exe文件。

使用IDA打开XX.exe,这时候就可以正常反编译文件。