ESP定律

参考资料:

https://mp.weixin.qq.com/s?__biz=Mzg4NzcxOTI0OQ==&mid=2247484677&idx=1&sn=33b57614d01cbbb4d67900e31cef8fe7&chksm=ce884f8e2c52125e82ba33ecbec3c5100d2e95af2d1e49688f96555878c72f1548ef15efc530#rd

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%

posted @ 2025-03-21 10:21  漫宿骄盛  阅读(187)  评论(0)    收藏  举报