2024-05-15 05:16:19 发布
网友
我想写一个python脚本,从elf二进制文件中提取一个函数操作码,知道它的地址,例如0x437310和大小。如何将这个地址映射到二进制文件中相应的偏移量以开始从中读取?在
使用hex编辑器,我可以计算出0x437310处的函数从hexdump中的偏移量0x37310开始。在
既然二进制文件的imagebase并不总是相同的,我怎么才能用一种通用的方法来计算它呢。在
任何帮助都将不胜感激
假设我想从bash提取{}的指令。在
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)。在
我们在内存中有地址(在进程映像中)。我们现在想在文件中找到相关地址。为此,我们需要查看程序头表:
我们想找出这个地址属于哪个PT_LOAD条目(基于VirtAddr和MemSize)。第一个PT_LOAD条目的范围从0x400000到{}(不包括),因此符号属于这个PT_LOAD条目。在
PT_LOAD
VirtAddr
MemSize
0x400000
我们可以用symbol_value - VirtAddr + Offset = 0x3ed80在文件中找到函数的位置。在
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给出的字节相同的字节:
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
假设我想从}的指令。在
bash
提取{首先要在符号表中找到此符号:
这给我们提供了内存中函数的地址(0x43ed80)及其长度(18)。在
我们在内存中有地址(在进程映像中)。我们现在想在文件中找到相关地址。为此,我们需要查看程序头表:
^{pr2}$我们想找出这个地址属于哪个}(不包括),因此符号属于这个
PT_LOAD
条目(基于VirtAddr
和MemSize
)。第一个PT_LOAD
条目的范围从0x400000
到{PT_LOAD
条目。在我们可以用
symbol_value - VirtAddr + Offset = 0x3ed80
在文件中找到函数的位置。在这是文件的相关部分:
我们确实拥有与
objdump -d /bin/bash
给出的字节相同的字节:相关问题 更多 >
编程相关推荐