识别程序集中的库调用

时间:2013-11-27 19:53:31

标签: linux assembly dll gdb x86-64

鉴于我从GDB获得的以下程序集,有没有办法确定导入哪个函数? GDB评论告诉我们,我们正在导入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

2 个答案:

答案 0 :(得分:2)

您可以使用objump

objdump -d foo

您可以将objdump输出到grep

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

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

答案 1 :(得分: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部分中指针的地址,jmpq部分的存根中的.plt指令正在使用该地址。

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

有关此机制的更详细解释,请参阅this post(和previous one)。