堆栈布局在很多方面都有详细记录。尤其是对于x86系统,因为很多年前有很多关于如何在旧的32位系统上利用堆栈溢出的教程。

到目前为止,我们可以知道在32位系统上,用户堆栈开始了。从0xc0000000地址开始(这是用户模式和内核模式之间的限制)。

如果我们在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地址指向无效的位置(或至少该进程没有访问此内存页面的适当权限。 。我做错了吗?

我可以找到有关linux-gate.so.1的信息,但我认为这不是重点。反向器?

评论

这是一个巧合,关于x64上32位二进制堆栈的有效地址,我也遇到了同样的问题。

那你能得到什么价值?

我在这里找到了可能相关的东西:stackoverflow.com/questions/29426476/…

我在这里靠近:lxr.free-electrons.com/source/arch/x86/include/asm / ...

在本文中,从TASK_SIZE(对于32位进程)计算进程堆栈的有效范围。

#1 楼

通过查看其内存映射,可以查看(32或64位)进程的有效堆栈访问范围。我们可以通过pid观察到ID为cat /proc/pid/maps的进程的内存映射,这是我的64位盒上的32-bit process的示例:如果是stack,则对一个大于或等于[0xfff9b000, 0xfffbc000)的地址的内存访问将触发0xfffbc000异常。根据本文的内容,此范围是在内核将二进制文件映射到内存中时计算的,并且通过几个函数,有趣的输入是memory access violation,由STACK_TOP为32位进程定义。

评论


好吧,我认为这值得进一步调查。感谢您的回答。

– Geoffrey R.
16年4月12日在14:28

感谢@GeoffreyR。,不客气。实际上,我也有同样的问题。

– Ta Thanh Dinh
16年4月12日在14:32

#2 楼

我有一个部分答案。

由于个性系统调用,可以确定内存布局最终以0xc0000000还是0xffffe000结束。通过读取ADDR_LIMIT_3GB标志,可以找出32位进程最多映射到0xc0000000或0xffffe000。那末有4GB的存储空间。也许与内核堆栈大小有关。