我已经看到ESP寄存器中的地址在终端的第一个和第二个选项卡之间有所不同。此外,ESP有时会在重新启动VM后发生更改。 ASLR和其他保护措施都已关闭。这里发生了什么?
答案 0 :(得分:3)
在Linux中,环境变量和args位于进程条目堆栈的顶部(最高地址)。
进入esp
时{p> _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
之上的不同空间。