我想在Linux上ptrace一个PIE,例如在给定的指令地址处中断。从反汇编中,我得到了指令的相对地址 - 如何找到可执行文件的加载位置,以便获得绝对地址?
GDB能够跟踪PIE - 它是如何处理这个问题的?
答案 0 :(得分:2)
它如何解决这个问题?
在Linux上,动态加载程序ld-linux...
有一个特殊的函数:_dl_debug_state()
,加载程序在加载共享库之前和之后调用,并且在设置全局变量之后:{{1} } _r_debug.r_state
或RT_ADD
。
调试器可以在该函数上设置断点,检查RT_CONSISTENT
和.r_state
,并在此过程中发现在哪个地址加载了哪些ELF二进制文件。
该机制用于发现例如在_r_debug.r_map
二进制文件受支持之前很久就加载了libc.so.6
。 PIE
二进制文件只是共享库的一个特例,因此完全相同的机制也适用于它。
这引出了一个问题:GDB如何发现PIE
本身已加载的位置(因此可以设置ld-linux
上的断点)。内核通过辅助向量_dl_debug_state()
条目告诉它。有关辅助矢量here的更多信息。