esp定律脱壳

————————————纯属个人理解,如有不对求大佬指正。

看了好多关于esp定律脱壳的文章,都没看懂,o(≧口≦)o,可能是本人太笨了吧。所以就来浅谈一下自己对于esp脱壳的理解。

个人对于esp脱壳的理解是先把壳跑完,此时的oep就是真正的程序入口。然后再将源程序通过工具dump出来为一个exe文件,再进行一些修复操作,就脱壳完毕了。

接下来是实战操作 ┭┮﹏┭┮ ,我直接通过buuctf里的新年快乐题目来操作吧。

查壳

首先拖入ide中,我们会发现只有两个函数,是不是很可疑,

没脱壳拖入ida

所以我们直接将它拖入Exeinfope中

image-20210614185118093

可以看到该exe文件里有一个UPX壳,那么我们就开始脱壳吧。

esp脱壳

esp定律脱壳(个人理解):
在外壳代码中有一个pushad的指令,该指令会将所有的寄存器的值都压入栈中也就是说在pushad指令之后esp的值就是指向外壳的代码段了,等之后运行完外壳程序,我们只要找到OEP就可以了

关于esp定律如果有不懂的话推荐看一下这个文章,或者百度。反正都比我讲的好多了。 o( ̄ヘ ̄o#)

拖入od

将exe拖入X32dbg开始分析,首先找到pushad,

在这里插入图片描述

双击进入,将eip指向这里

在这里插入图片描述

然后f8单步运行,此时我们可以看到esp的变化,右键esp,转到内存窗口设置断点

设置内存断点

设断点

运行,关于这两步操作我来做一下解释,因为pushad以后esp指向的是外壳的代码段,所以我们将断点设置在此处,然后运行到此处以后,就可以找到我们的程序入口oep了。

image-20210614185448616

此时,程序停下来以后,往上看我们可以看到popad,该指令刚好与pushad对应,可以将内存器里的值进行还原。找到下面jmp指令要跳转的位置就是我们的程序的入口oep。

在这里插入图片描述

oep已找到,接下来开始dump

dump操作

(这里忘截图了,直接挂大佬的操作图了)在这里插入图片描述

操作如下:在这里插入图片描述

在这里插入图片描述

然后再fixdump一下,会弹下图,如果未弹出,可以先perebuild(具体操作与fixdump相同)然后再fixdump(具体原理还在挖掘中)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

脱壳完成!

另外鸣谢大佬,挂上大佬文章