为什么 Linux x86_64 上 PIE ELF 可执行文件的 .text 段位于 0x00005xxxxxxxxxxx 附近?
2024-03-22 17:52:57
ELF可执行文件 .text 段的基址在 Linux x86_64 上 PIE ELF 可执行文件的虚拟地址
背景
可执行与链接格式(ELF)是一种用于 Linux 和其他类 Unix 操作系统上可执行文件、目标代码、共享库和核心转储的可移植文件格式。ELF 文件由多个段组成,每个段都包含特定类型的数据,例如代码、数据或符号表。
问题:PIE ELF 可执行文件的 .text 段为什么位于 0x00005xxxxxxxxxxx 附近?
在 Linux x86_64 系统上,使用 -pie 选项链接的 ELF 文件的 .text 段似乎总是位于虚拟内存地址 0x00005xxxxxxxxxxx 附近。与没有使用 -pie 选项链接的二进制文件相比,.text 段的地址为何不从 4MB+ 的地址开始?
原因
当使用 -pie 选项链接 ELF 文件时,动态链接器(通常是 ld-linux-x86-64)会在运行时将可执行文件的基址随机化。这有助于防止某些类型的攻击,例如返回到 C 库(GOT)攻击。
在 Linux x86_64 系统上,动态链接器通常将 PIE ELF 可执行文件的基址选择为 0x00005xxxxxxxxxxx 范围内的地址。这主要是出于以下原因:
- 地址空间布局随机化 (ASLR) :ASLR 是一种安全机制,可通过随机化可执行文件的基址来提高系统的安全性。这使得攻击者更难利用已知漏洞,因为他们无法预测可执行文件将加载到内存中的确切地址。
- 虚拟内存地址空间 :在 Linux x86_64 系统上,用户空间虚拟内存地址空间从 0x000000000000 到 0x00007fffffffffff 延伸。较低的 4GB 通常保留用于内核代码和数据,而较高的 4GB 用于用户空间程序。
- 避免与内核空间重叠 :内核代码和数据通常加载到虚拟内存地址空间较低的 4GB 中。通过将 PIE ELF 可执行文件的基址选择为 0x00005xxxxxxxxxxx 范围内的地址,可以避免与内核空间重叠。
结论
在 Linux x86_64 系统上,动态链接器将 PIE ELF 可执行文件的 .text 段加载到 0x00005xxxxxxxxxxx 范围内的虚拟内存地址中。这是为了实施 ASLR、利用虚拟内存地址空间布局并避免与内核空间重叠而做出的选择。
常见问题解答
1. 为什么使用 -pie 选项链接 ELF 文件?
使用 -pie 选项可以提高系统的安全性,因为它防止了某些类型的攻击,例如 GOT 攻击。
2. 我可以自己选择 PIE ELF 可执行文件的基址吗?
不可以,动态链接器会在运行时随机化基址。
3. 0x00005xxxxxxxxxxx 范围内的地址是否总是用于 PIE ELF 可执行文件?
虽然这是最常见的范围,但动态链接器可以选择其他范围。
4. 如果 PIE ELF 可执行文件的基址位于 0x00005xxxxxxxxxxx 附近,那么它是否仍然受 ASLR 保护?
是的,虽然地址的基址是固定的,但可执行文件中的其他内容(例如函数的地址)仍然是随机化的。
5. 我可以在哪些系统上使用 ASLR?
ASLR 在现代 Linux 和其他类 Unix 系统上广泛可用。