esp定律脱壳
esp定律脱壳
————————————纯属个人理解,如有不对求大佬指正。
看了好多关于esp定律脱壳的文章,都没看懂,o(≧口≦)o,可能是本人太笨了吧。所以就来浅谈一下自己对于esp脱壳的理解。
个人对于esp脱壳的理解是先把壳跑完,此时的oep就是真正的程序入口。然后再将源程序通过工具dump出来为一个exe文件,再进行一些修复操作,就脱壳完毕了。
接下来是实战操作 ┭┮﹏┭┮ ,我直接通过buuctf里的新年快乐题目来操作吧。
查壳
首先拖入ide中,我们会发现只有两个函数,是不是很可疑,
所以我们直接将它拖入Exeinfope中
可以看到该exe文件里有一个UPX壳,那么我们就开始脱壳吧。
esp脱壳
esp定律脱壳(个人理解):
在外壳代码中有一个pushad的指令,该指令会将所有的寄存器的值都压入栈中也就是说在pushad指令之后esp的值就是指向外壳的代码段了,等之后运行完外壳程序,我们只要找到OEP就可以了
关于esp定律如果有不懂的话推荐看一下这个文章,或者百度。反正都比我讲的好多了。 o( ̄ヘ ̄o#)
拖入od
将exe拖入X32dbg开始分析,首先找到pushad,
双击进入,将eip指向这里
然后f8单步运行,此时我们可以看到esp的变化,右键esp,转到内存窗口设置断点
运行,关于这两步操作我来做一下解释,因为pushad以后esp指向的是外壳的代码段,所以我们将断点设置在此处,然后运行到此处以后,就可以找到我们的程序入口oep了。
此时,程序停下来以后,往上看我们可以看到popad,该指令刚好与pushad对应,可以将内存器里的值进行还原。找到下面jmp指令要跳转的位置就是我们的程序的入口oep。
oep已找到,接下来开始dump
dump操作
(这里忘截图了,直接挂大佬的操作图了)
操作如下:
然后再fixdump一下,会弹下图,如果未弹出,可以先perebuild(具体操作与fixdump相同)然后再fixdump(具体原理还在挖掘中)
脱壳完成!
另外鸣谢大佬,挂上大佬文章。