ESP定律
ESP(扩展栈指针)
principle:
*在程序执行过程中,栈的操作与函数调用、局部变量存储等密切相关。当程序执行到某个函数调用时,会将函数的参数、返回地址等信息压入栈中,而 ESP 则始终指向栈顶。*X86 exp寄存器存储的是当前栈顶的内存地址。
Function:
ESP 定律的核心原理基于栈的平衡机制。在一些情况下,特别是在加密程序或存在代码保护机制的软件中,程序可能会对自身代码进行加密或混淆处理,使得直接分析原始代码变得困难。然而,当程序执行到特定关键代码段(如解密后的代码部分)时,通常会涉及到栈的操作,导致 ESP 的值发生有规律的变化。通过监测 ESP 的值变化,我们可以找到这些关键代码的执行点。
CPP:
1 | |
个人理解(仅供参考):
ESP(扩展栈指针):对于调用函数等操作,在对关键代码进行定位查找的困难过程中,可以通过观察ESP的值进行对函数地址的定位,比如程序在调用encryptedFunction函数时,会涉及到栈的操作,导致 ESP 的值发生有规律的变化。通过监测 ESP 的值变化,我们可以找到这些关键代码的执行点。
Example:

我创建了一个简单的PE文件,并对其进行基础加壳upx -d project1.exe

接着对upx特征段进行篡改使其无法被基础脱壳掉。如下图:

然后针对此类加壳我们可以用esp定律进行动态调试来完成脱壳。

首先单步调试,发现ESP寄存器出大红(ESP 寄存器变红表示栈指针(Stack Pointer)的值发生了异常或不一致,可能触发了栈平衡错误。)

将内存窗口的显示定位到与该寄存器值相关的内存地址处,方便查看对应内存地址中的数据。

任意字符下硬件断点

run to line(jmp project.6c1023),找到[OEP]( 程序的入口点 )

设置EIP,收工。

最后dump下来,检验一下。

脱壳成功!🙌🙌🙌
- Title: ESP定律
- Author: HuAmI
- Created at : 2025-10-28 12:12:57
- Updated at : 2025-11-03 14:21:57
- Link: https://redefine.ohevan.com/2025/10/28/脱壳ESP(扩展栈指针)定律/
- License: This work is licensed under CC BY-NC-SA 4.0.