【发布时间】:2017-12-22 20:46:43
【问题描述】:
我已经看到 ESP 寄存器中的地址在终端的第一个和第二个选项卡之间有所不同。此外,ESP 有时会在重新启动 VM 后发生变化。 ASLR 和其他保护已关闭。这里发生了什么?
【问题讨论】:
-
堆栈内容可能因执行而异,例如因为环境变量。
我已经看到 ESP 寄存器中的地址在终端的第一个和第二个选项卡之间有所不同。此外,ESP 有时会在重新启动 VM 后发生变化。 ASLR 和其他保护已关闭。这里发生了什么?
【问题讨论】:
在 Linux 中,环境变量和参数位于进程入口时堆栈的顶部(最高地址)。
esp 在进入_start 时指向argc,而在其正上方是argv[]。 (按值,不是指向 argv 的指针。CRT 启动代码必须到 lea eax, [esp+4] 或其他东西才能获得 &argv[0],并将其传递给 main。)
上面是envp[]。 (我在http://asm.sourceforge.net/articles/startup.html 找到了一个图表。另见the i386 System V ABI documentation。)
禁用 ASLR 后,映射为堆栈内存的区域的最高地址是固定的,但不同大小的环境将在初始 esp 上方占用不同数量的空间。
【讨论】: