PIE中的数据部分是如何处理的?

逆向工程 馅饼
2021-06-27 01:55:20

根据我的理解,对于 .rodata,编译器可以简单地把它放在 .text 部分的“旁边”,因为它共享相同的页面权限,所以无论加载二进制文件,指令都可以在 .text 部分找到全局变量。通过RIP 相对寻址的 Rodata 但是数据和 bss 怎么样,因为它们位于到 .text 部分的随机距离处?

1个回答

在当前的 ELF PIE 实现中,AFAIK假定所有部分/段都处于与负载基础的固定偏移量处,因此 RIP 相对寻址继续工作。

理论上,可以将 r/w 数据区放置在不同的偏移量处,但这需要对编译器和动态链接器行为进行重大更改。此外,文件格式并没有真正预见到这种可能性。

对于主要的操作系统,我认为目前只有 macOS 可以做到这一点(对于 Mach-O 格式)。