堆栈布局在许多方面都有很好的记录。特别是对于x86系统,因为多年前有许多关于如何在旧的 32 位系统上利用堆栈溢出的教程。
至此我们可以知道,在32位系统上,用户栈从0xc0000000地址开始(这是usermode和kernelmode之间的界限)。
如果我们拿一个运行在x86-64 linux 系统上的Elf32,这个地址就不一样了。
我找不到这个地址,但我可以通过 gdb找出它是0xffffe000:
(gdb) x $esp
0xffffd4bc: 0xf7e16a83
(gdb) x/w 0xffffdffc
0xffffdffc: 0x00000000
(gdb) x/w 0xffffe000
0xffffe000: Cannot access memory at address 0xffffe000
我们实际上可以看到0xffffe000地址指向一个无效的位置(或者至少该进程没有访问该内存页的适当权限)。
然而,我找不到一个相关的来源,告诉我们x64 linux 上的 x86 程序的 gnu 堆栈从 0xffffe000 开始。我做错了吗?
我可以找到告诉我们有关linux-gate.so.1 的消息来源,但我认为这不是重点。
任何想法,逆行者?