当涉及到 GOT/GOT.PLT 引用时,如何重用一些汇编代码?

逆向工程 拆卸 部件 重新组装 动态链接
2021-06-26 22:21:06

基本上我正在尝试重新使用一些从 x86 32 位 Linux 上的二进制文件反汇编的汇编代码。

当 GOT/GOT.PLT 的引用涉及到这些时,我遇到了一些麻烦。

  ....
  804c460:       53                      push   %ebx
  804c461:       e8 ec ff ff ff          call   804c452 <__i686.get_pc_thunk.bx>
  804c466:       81 c3 8e 2b 00 00       add    $0x2b8e,%ebx   // %ebx has the beginning address of GOT table
  804c46c:       83 ec 18                sub    $0x18,%esp
  ....

如果我想重用这些asm代码,我必须将具体地址提升为符号,并且在上面的代码中,我必须找到一种方法来ebx存储GOT的开始地址

嗯...那么我是否必须修改链接器...?因为GOT直到链接时间才能确定表的开始地址..

所以我的问题是:

  1. 修改链接器是正确的方法吗?有没有其他办法?

  2. 如何修改此问题中的链接器..?我之前基本没有经验..

1个回答

如果您使用 GAS 或兼容的汇编程序,您可以使用特殊的修饰符让它为基于 GOT 的寻址发出重定位信息。

这是使用以下命令gcc -S编译的函数的典型序言输出-fPIC

call    __i686.get_pc_thunk.bx
addl    $_GLOBAL_OFFSET_TABLE_, %ebx
leal    .LC0@GOTOFF(%ebx), %eax
movl    %eax, (%esp)
call    puts@PLT

如您所见,您可以将%ebx附录替换为$_GLOBAL_OFFSET_TABLE_,并将其他 GOT 相关的偏移替换为symbol@GOTOFF在某些情况下,您可能还需要@GOTPLT@GOTPCREL修饰符。有关更多信息,请参见此处(主要是特定于 x64 的,但仍然有用)。

如果您的文件是可重定位的或共享对象,将其反汇编-dr(以便您看到重定位信息)对于查看可能需要重新添加符号修饰符的位置很有用。