【发布时间】:2019-12-08 05:45:14
【问题描述】:
链接到 libc.so 的程序通过 plt 调用 libc 函数,比如说 setenv()。在 setenv() 内部,它调用 malloc(),至少根据 musl libc。
setenv()->malloc() 调用是否总是必须通过 plt 并得到? RIP 相对寻址不是更好吗,因为即使启用了 ASLR,您也只是移动整个 VMA?
【问题讨论】:
链接到 libc.so 的程序通过 plt 调用 libc 函数,比如说 setenv()。在 setenv() 内部,它调用 malloc(),至少根据 musl libc。
setenv()->malloc() 调用是否总是必须通过 plt 并得到? RIP 相对寻址不是更好吗,因为即使启用了 ASLR,您也只是移动整个 VMA?
【问题讨论】:
setenv()->malloc() 调用是否总是要经过 plt 才能得到?
它没有必须,但是许多 libc 实现允许最终用户替换他/她自己的 malloc 实现(例如 TCMalloc 或 jemalloc),并调用 malloc来自setenv 直接会严重限制这一点。
RIP 相对寻址不是更好
您需要注意“工作得更好”的实际含义,以及您评估它的轴。
IP 相对调用(即直接调用)会更快、更高效,但对于符号插入根本不起作用。
附:至少 GLIBC 对用户提供的mmap 没有类似的规定,因此直接调用mmap。对于想要通过插入 mmap 和 munmap 来准确计算进程中使用的所有内存的人来说,这实际上会导致问题。
【讨论】:
-Bsymbolic 或 -Bsymbolic-functions 和 --dynamic-list 的组合来启用这些函数的 .plt 条目,从而允许插值。奇怪的是,当我设置 -Bsymbolic-functions 时,libc.so 中的许多函数仍然存在 .plt 条目,而设置 -Bsymbolic 则删除了它们。除了无法插入这些功能之外,您是否预见到任何陷阱?