Under Visual Studio masm:
mov ecx,270
l1: pop eax
loop l1
push eax
此代码的重点是找出是否存在以及ESP
的初始值是多少。我尝试在程序启动后立即pop
,并尝试在push
pop
多少次后会产生一些与内存读取相关的错误。实验的结果在某种程度上是不稳定的,即使ecx
的数字完全相同.一般来说,大于 512 总是(在我有限的实验时间内)会产生错误,小于 128 总是"安全的",而 250 到 400 左右的值有时会产生错误。ESP 似乎没有初始值。如果有,我的实验应该会产生一些稳定的结果。
好的,我再运行 127 次其他 10 次,现在它开始崩溃。我正在尝试对此进行更多实验。
让我们说使用Windows-x86,在启动像我的实验程序这样的程序的平均时刻。Windows 如何确定esp
的初始值是多少?这很难确定吗(因为我可以想象简单地将堆栈隔离的最后一个地址放在esp
中)?是否有如何执行此操作的常见做法?
初始值是操作系统将堆栈放入进程虚拟地址空间的任何位置。在现代操作系统中,它是随机的。
_start
堆栈顶部的内容取决于体系结构。在 Windows 上,您将获得一个实际的返回地址,该地址将退出当前线程。在 Linux 上,您可以获得命令行和环境变量。无论如何,从堆栈中弹出您没有推送的内容将不符合 ABI 标准,并且会给您带来麻烦。此时唯一保留的规则是安全规则。