【问题标题】:Identify library calls in assembly识别汇编中的库调用
【发布时间】:2013-12-13 15:33:02
【问题描述】:

鉴于我从 GDB 获得的以下程序集,有没有办法确定正在导入的函数? GDB cmets 告诉我们,我们正在导入 puts,但我如何静态地解决这个问题?

Dump of assembler code for function puts@plt:
   0x00000000004003b8 <+0>: jmpq   *0x2004a2(%rip)        # 0x600860 <puts@got.plt>
   0x00000000004003be <+6>: pushq  $0x0
   0x00000000004003c3 <+11>:    jmpq   0x4003a8

【问题讨论】:

  • 您的问题是关于哪个 library 或哪个 function ?前者不可能静态回答,因为答案可以在运行时改变。
  • 我指的是哪个函数,而不是哪个库 - 感谢您理解。

标签: linux assembly dll gdb x86-64


【解决方案1】:

答案在某种程度上是特定于处理器和操作系统的,不同的 ELF 实现可能会以不同的方式做到这一点。

对于 x64 Linux(以及大多数使用 PLT 的其他实现),您可以检查 ELF 的动态重定位

> readelf -dr file.elf
...
Relocation section '.rela.plt' at offset 0x700 contains 17 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000602018  000100000007 R_X86_64_JUMP_SLO 0000000000000000 __strcat_chk + 0
000000602020  000200000007 R_X86_64_JUMP_SLO 0000000000000000 free + 0
000000602028  000400000007 R_X86_64_JUMP_SLO 0000000000000000 clock + 0
000000602030  000500000007 R_X86_64_JUMP_SLO 0000000000000000 fclose + 0

“偏移”是.got.plt 部分中指针的地址,.plt 部分的存根中的jmpq 指令正在使用该地址。

最初,该指针指向动态加载程序存根,它将在第一次调用时解析地址(使用重定位条目中的信息)并将 GOT 中的指针修补到解析的地址,以便它直接跳转到目标下次通话时。

请参阅this post(和previous one)以获取有关此机制的更详细说明。

【讨论】:

    【解决方案2】:

    你可以使用objump:

    objdump -d foo
    

    您可以通过管道将objdump 输出到grep

    objdump -d foo | grep -A 3 'puts@plt>:'
    

    -A 后面的数字控制匹配后打印多少行(指令)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 2015-04-26
      • 2011-09-07
      • 2021-04-14
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      相关资源
      最近更新 更多