堆栈帧边界

逆向工程 记忆 堆栈变量
2021-06-26 13:22:19

我已经反汇编了一些 C/C++ 代码,并意识到在程序开始时指定了堆栈边界,就像这样:

1. push ebp
2. mov ebp , esp
3. sub esp , <power> ; <power> is specified by mpreferred-stack-boundary=2^power

上面的代码用于创建堆栈帧,但我需要知道的是为什么使用这个减法,导致堆栈向下增长(通过对局部变量使用推送),这样的减法导致:

---------------------------- ^
by sub esp,<power> <---- esp |
.                            |
.                            |
.                            |
---------------------------- |
esp <---- esp                |
---------------------------- |
ret address                  |
---------------------------- |

上图显示了。所以当在其余代码中时,如果您有以下代码:

push var1

它应该在它的顶部,所以它看起来像这样:

-----------------------------
var1 (4 byte)                
-----------------------------^
by sub esp,<power> <---- esp |
.                            |
.                            |
.                            |
---------------------------- |
esp <---- esp                |
---------------------------- |
ret address                  |
---------------------------- |

那么 esp 和 var1 之间的空间将是免费的,没有任何用处?这就是我想知道的。

1个回答

那么 esp 和 var1 之间的空间将是免费的,没有任何用处?这就是我想知道的。

该堆栈空间用于函数的局部变量(也称为“堆栈变量”)。

这是一个很好的动画 GIF,它显示了正在创建并用于存储局部变量的函数的堆栈帧:

动图