从ELF二进制fi中提取函数字节

2024-05-15 05:16:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个python脚本,从elf二进制文件中提取一个函数操作码,知道它的地址,例如0x437310和大小。如何将这个地址映射到二进制文件中相应的偏移量以开始从中读取?在

使用hex编辑器,我可以计算出0x437310处的函数从hexdump中的偏移量0x37310开始。在

既然二进制文件的imagebase并不总是相同的,我怎么才能用一种通用的方法来计算它呢。在

任何帮助都将不胜感激


Tags: 文件方法函数脚本地址二进制编辑器hexdump
1条回答
网友
1楼 · 发布于 2024-05-15 05:16:19

假设我想从bash提取{}的指令。在

首先要在符号表中找到此符号:

$ readelf -s /bin/bash
   Num:    Value          Size Type    Bind   Vis      Ndx Name
[...]
   216: 000000000043ed80    18 FUNC    GLOBAL DEFAULT   14 maybe_make_export_env
[...]

这给我们提供了内存中函数的地址(0x43ed80)及其长度(18)。在

我们在内存中有地址(在进程映像中)。我们现在想在文件中找到相关地址。为此,我们需要查看程序头表:

^{pr2}$

我们想找出这个地址属于哪个PT_LOAD条目(基于VirtAddrMemSize)。第一个PT_LOAD条目的范围从0x400000到{}(不包括),因此符号属于这个PT_LOAD条目。在

我们可以用symbol_value - VirtAddr + Offset = 0x3ed80在文件中找到函数的位置。在

这是文件的相关部分:

0003ed80: 8b05 3260 2b00 85c0 7406 e911 feff ff90  ..2`+...t.......
0003ed90: f3c3 0f1f 4000 662e 0f1f 8400 0000 0000  ....@.f.........

我们确实拥有与objdump -d /bin/bash给出的字节相同的字节:

000000000043ed80 <maybe_make_export_env@@Base>:
  43ed80:       8b 05 32 60 2b 00       mov    0x2b6032(%rip),%eax        # 6f4db8 <array_needs_making@@Base>
  43ed86:       85 c0                   test   %eax,%eax
  43ed88:       74 06                   je     43ed90 <maybe_make_export_env@@Base+0x10>
  43ed8a:       e9 11 fe ff ff          jmpq   43eba0 <bind_global_variable@@Base+0x60>
  43ed8f:       90                      nop
  43ed90:       f3 c3                   repz retq 
  43ed92:       0f 1f 40 00             nopl   0x0(%rax)
  43ed96:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  43ed9d:       00 00 00

相关问题 更多 >

    热门问题