ELF 文件格式 两个终止空双字朝向 0xc0000000?

逆向工程 数据库 小精灵
2021-06-12 00:58:34

在反转 elf 二进制文件时,我尝试手动计算环境变量的地址。因此我找到了这个文档,我们说在堆栈的末尾有一个 NULL DWORD。

在这种情况下,堆栈的二进制文件不是随机的,因此在 0xbffffffc (0xc0000000 - 4) 处有一个 NULL DWORD。然后通常将程序的名称指向低地址。所以一个人会读入堆栈:

./program_name\0 + NULL DWORD

但是当我使用 gdb 进行检查时,我发现了两个双字:

(gdb) x/4x 0xc0000000 - 0x10
0xbffffff0:     0x5f747365      0x00766e65      0x00000000      0x0000000

我可以看到我的程序名称有结尾(加上 \0),但它不应该以 0xbffffffc 而不是 0xbffffff8 结尾吗?有两个空双字而不是一个,我不明白为什么。

2个回答

我不知道您使用的是哪种架构,但原始文档链接到create_elf_tablesbinfmt_elf.c。

在这个函数中,你有p = arch_align_stack(p);. 中文文档显然是为 x86 编写的,但您的体系结构可能会使用 8 字节对齐堆栈,并使用额外的 DWORD 填充。

实际上,您所基于的架构很重要。在给定的示例中,我们假设二进制文件在 x86 系统上运行。就我而言,虽然它是用 编译的-m32,但它是在 x64 系统上运行的,因此将堆栈与QWORD对齐,而不是DWORD这解释了为什么有“两个 DWORD”而不是一个。