尖括号中的文本指的是什么(来自 objdump)

逆向工程 拆卸 部件
2021-07-09 05:43:18

我经常看到文本 ( <perror@plt+0x2008e0>),如下面的片段所示,但我不确定它是否会调用perror反汇编程序是否有问题。因为如果主函数做的第一件事是调用退出代码,那会很奇怪。最后@plt指的是什么

0000000000400540 <__libc_start_main@plt>:
  400540:   ff 25 0a 09 20 00    jmpq  *0x20090a(%rip)    # 600e50 <perror@plt+0x2008e0>

如果需要更多信息,请告诉我,我会更新问题

2个回答

PLT 代表程序链接表。它实际上是一个函数地址表。更准确地说,如此处所示,PLT 是一个表,其中每个条目都包含一条跳转指令,该指令指向函数代码的实际位置。因此,PLT 由函数存根组成。

对动态链接函数的调用被编译为对 PLT 地址的调用,而不是函数实际所在的地址。由于这种间接性,模块中的外部调用可以通过相对跳转到 PLT 来实现。动态链接器使用实际代码的运行时地址更新 PLT,这取决于被调用模块在内存中相对于被调用者的位置。

这种额外的间接级别解决的问题是动态链接,其中在编译时无法预测库的地址,并且动态链接器不需要更新代码本身(这将阻止在加载的库的实例之间共享不同进程中的不同地址)。

这说明<__libc_start_main@plt>跳转被指示为 intoperror@plt是来自反汇编程序的混淆信息。<perror@plt+0x2008e0>意味着跳转目标是 PLT 条目开始后的 0x2008e0 字节perror——如果这是跳转到perror函数的代码,那将是一个巨大的函数!事实上,跳转是到main入口点的真实代码,它恰好位于perrorPLT 条目的这么多字节(如果您使用的是 GNU binutils,我认为objdump这里选择最后一个 PLT 条目)。二进制文件是在没有调试符号的情况下编译的,因此所有函数的代码在反汇编程序中都表现为一大块.text,并且调试器没有更好的方法来命名该特定地址。如果存在调试符号,则反汇编程序将从二进制文件中的调试信息中提取函数名称。

所以,首先,(%rip)指的是包含在 中的值所指向的内存单元的内容%rip

其次,是<perror@plt+0x2008e0>指符号perror@plt(加上偏移量 0x2008e0。

如果您想了解有关 PLT 和 GOT 如何工作的更多详细信息,请随时提出另一个问题(因为它会填满几页只是为了很好地解释它)。

注意:这个问题显然是给我的!!!:-)