【发布时间】:2021-11-23 19:25:23
【问题描述】:
在 Visual Studio masm 下:
mov ecx,270
l1: pop eax
loop l1
push eax
这段代码的重点是找出ESP是否存在以及初始值是多少。我在程序启动后立即尝试pop,并实验在多少pop 和push 之后会产生一些与内存读取相关的错误。实验结果在某种程度上是不稳定的,即使ecx 的数字完全相同。通常,大于 512 总是(在我有限的实验时间内)会产生错误,小于 128 总是“安全”的,而 250 到 400 左右的值有时会产生错误。 ESP似乎没有初始值。如果有,我的实验应该会产生一些稳定的结果。
好的,我再运行 127 次 10 次,现在它开始崩溃。我正在尝试对此进行更多的实验。
我们只说使用 Windows-x86,平均启动像我的实验程序这样的程序的时刻。 Windows 如何确定esp 的初始值是多少?这很难确定吗(因为我可以想象简单地将堆栈段的最后一个地址放在esp 中)?是否有如何做到这一点的常见做法?
【问题讨论】:
-
什么意思?
esp总是有一个值。您可以使用mov eax, esp或类似名称阅读。 -
@NateEldredge 我在问
esp是否有初始值。也就是说,esp会指向程序第一次启动的时间? -
@NateEldredge 如果我启动一个程序并立即开始弹出,我会弹出一些东西或程序崩溃吗?如果弹出某些东西,这些东西会是什么?
-
@Zackham 这取决于处理器的状态,操作系统,各种东西。它有一个值,除非你推动,否则你不应该弹出。就是这样。
-
@Zackham ...不,它准确地解释了事情的真相。你还没有说哪个操作系统,哪个时刻,哪个情况。这就像问“冰淇淋的价格是多少?”要么你必须实际提供信息,要么这是任何人都可以给你的唯一答案。
标签: windows assembly x86 masm stack-pointer