ESP定律
参考资料:
https://www.52pojie.cn/thread-54635-1-1.html
1.介绍:
ESP定理通常用来脱壳,基于堆栈平衡原理,通过监视ESP寄存器的变化,来找到程序的原始入口点(OEP)。
2.原理:
1.堆栈平衡:
在函数调用或程序执行过程中,堆栈指针(ESP)的增减需保持平衡。加壳程序在运行时,壳代码会先接管控制权,通过pushad等指令保存原始寄存器状态,并在解密/解压完成后通过popad恢复寄存器。此时,ESP会因堆栈操作异常变化,触发硬件断点
2.壳的流程:

3.实操

将文件拖入XDBG中。

这就是UPX解压程序的开头,根据ESP定理,函数在这里入栈,函数结束后必然会出栈,而出栈则代表者解压函数结束,将正常的程序显示出来

先步进几次,让参数入栈,对着变化的RSP右键,然后然在内存窗口中转到,再选中前4个字符,右键,点标亮的选项

然后运行程序

看到这里,基本已经成了,绿和断点之间的是清理缓存,jmp处就是原来程序的入口,运行到那里,然后步进

此时就是正常的函数了,使用Scylla即可完成脱。
然而;
这样得到的程序虽然可以通过IDA看,但仍然会被查出来有UPX壳,我看了好多资料,但都没有关于这一步内容,也没有解决方式,而且这样脱壳出来的程序比源程序大概大了50%
本文来自博客园,作者:漫宿骄盛,转载请注明原文链接:https://www.cnblogs.com/msjs/p/18784656
都是顺手发的,写的时候可能有错误,如果发现了,望各位指出。

浙公网安备 33010602011771号