ESP定律

ESP定律

HuAmI Lv3

ESP(扩展栈指针)

principle:

*在程序执行过程中,栈的操作与函数调用、局部变量存储等密切相关。当程序执行到某个函数调用时,会将函数的参数、返回地址等信息压入栈中,而 ESP 则始终指向栈顶。*X86 exp寄存器存储的是当前栈顶的内存地址。

Function:

ESP 定律的核心原理基于栈的平衡机制。在一些情况下,特别是在加密程序或存在代码保护机制的软件中,程序可能会对自身代码进行加密或混淆处理,使得直接分析原始代码变得困难。然而,当程序执行到特定关键代码段(如解密后的代码部分)时,通常会涉及到栈的操作,导致 ESP 的值发生有规律的变化。通过监测 ESP 的值变化,我们可以找到这些关键代码的执行点

CPP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
`#include <iostream>`

`void encryptedFunction() {`
`// 这里假设是一些加密后的代码逻辑`
`std::cout << "This is the encrypted part of the code." << std::endl;`
`}`

`int main() {`
`// 调用加密函数前的栈状态`
`int localVar1 = 10;`
`int localVar2 = 20;`


encryptedFunction();

// 调用加密函数后的栈状态
std::cout << "After the function call, localVar1: " << localVar1 << ", localVar2: " << localVar2 << std::endl;

return 0;

}

个人理解(仅供参考):

ESP(扩展栈指针):对于调用函数等操作,在对关键代码进行定位查找的困难过程中,可以通过观察ESP的值进行对函数地址的定位,比如程序在调用encryptedFunction函数时,会涉及到栈的操作,导致 ESP 的值发生有规律的变化。通过监测 ESP 的值变化,我们可以找到这些关键代码的执行点。

Example:

img

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

img

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

img

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

img

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

img

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

img

任意字符下硬件断点

img

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

img

设置EIP,收工。

img

最后dump下来,检验一下。

img

脱壳成功!🙌🙌🙌

  • 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.
Comments
On this page
ESP定律