0

我也想知道 pie 和 aslr 在内存中的作用是什么,据我所知,aslr 随机化了 libc 基址、堆栈和堆的地址。并且 pie 随机化精灵基础并使用 .text、.data、.bss、.rodata ......

这是正确的还是我弄错了?

4

1 回答 1

2

PIE 需要与位置无关的代码,这会消耗少量性能。(或者在 32 位 x86 等不容易支持 PC 相对寻址的 ISA 上占 15% 的比例)。看到x86-64 Linux 中不再允许使用 32 位绝对地址了吗?.

在禁用 ASLR 的情况下,例如在 GDB 下运行或在系统范围内禁用它时,Linux 选择一个基地址0x0000555555555000来映射可执行文件,因此objdump -d与文件相关的地址开始时就像0x4000在那个高虚拟地址处结束一样。

PIE 可执行文件是 ELF 共享对象(如 a .so),而不是 ELF“可执行文件”。ELF 可执行文件在 ELF 标头中具有由链接器设置的基地址,因此可以将绝对地址硬编码到机器代码和数据中,而无需重新定位以进行修复。(这就是为什么没有办法 ASLR 一个适当的 ELF 可执行文件,只有一个 PIE)。

支持 PIE 的机制最初只是将入口点放入库中的一种有趣的技巧。后来人们意识到,对于可执行文件中的静态代码/数据,ASLR 很有用,因此这种现有的支持成为官方的。(或类似的东西;我还没有读过历史。)

但是无论如何,ASLR 是由 PIE启用的,但是如果您想要最一般的非技术描述,那么即使禁用了 ASLR,PIE 也是如此。

于 2020-04-06T14:27:12.870 回答