gpt4 book ai didi

c++ - 解析 PLT stub 地址和名称

转载 作者:行者123 更新时间:2023-12-03 07:03:46 26 4
gpt4 key购买 nike

我想从 C/C++ 解析 ELF 文件,其中包含 .plt 部分并获取 PLT 函数 stub 地址和名称,类似于“objdump -D -j .plt a.out”的输出

enter image description here

我可以从文件中获取.PLT 节地址,但如何解析它?有什么样的结构?如何查找名称?等等

最佳答案

.plt 的每个条目对应于.rela.plt 中的一个条目。当您在上面的屏幕截图中看到 pushq $0x0 时,它指的是 .rela.plt 条目 0。

这是我手边的一个二进制文件的例子:

$ objdump --section=.plt -C -d -r -M intel /tmp/upb_binary_stripped | head -20

/tmp/upb_binary_stripped: file format elf64-x86-64


Disassembly of section .plt:

0000000000001010 <.plt>:
1010: ff 35 f2 6f 00 00 push QWORD PTR [rip+0x6ff2] # 8008 <_GLOBAL_OFFSET_TABLE_+0x8>
1016: ff 25 f4 6f 00 00 jmp QWORD PTR [rip+0x6ff4] # 8010 <_GLOBAL_OFFSET_TABLE_+0x10>
101c: 0f 1f 40 00 nop DWORD PTR [rax+0x0]

0000000000001020 <longjmp@plt>:
1020: ff 25 f2 6f 00 00 jmp QWORD PTR [rip+0x6ff2] # 8018 <longjmp>
1026: 68 00 00 00 00 push 0x0
102b: e9 e0 ff ff ff jmp 1010 <.plt>

0000000000001030 <setjmp@plt>:
1030: ff 25 ea 6f 00 00 jmp QWORD PTR [rip+0x6fea] # 8020 <setjmp>
1036: 68 01 00 00 00 push 0x1
103b: e9 d0 ff ff ff jmp 1010 <.plt>

现在,如果我将重定位转储到 .rela.plt 中,您可以看到 longjmpsetjmp 的条目,对应于PLT:

$ readelf -r /tmp/upb_binary_stripped
[...]
Relocation section '.rela.plt' at offset 0x618 contains 10 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000008018 000100000007 R_X86_64_JUMP_SLO 0000000000000000 longjmp + 0
000000008020 000200000007 R_X86_64_JUMP_SLO 0000000000000000 setjmp + 0
[...]

Rela 条目以正常方式读取,使用 Elf64_RelaELF64_R_SYM(rela.r_info) 从链接部分获取符号名称(应该是 .dynsym).

关于c++ - 解析 PLT stub 地址和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62611218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com