如何在 Linux 上检查 ELF 文件数据部分的内容?
-
18-09-2019 - |
题
我一直在使用 objdump
查看 Linux ELF 二进制文件中的汇编代码。
有时会通过存储在中的跳转表进行间接跳转 rodata
(只读数据)部分。
如何获得 objdump
或任何其他工具可以向我显示此数据部分的内容?
我可以执行程序并检查调试器中的相关地址,但我不想这样做,因为它必须以交互方式完成。
理想的答案是确定一个工具,它不仅可以向我显示内容,还可以让我控制显示格式,就像 od
做。
解决方案
objdump -s -j .rodata exefile
给出了一个并排的十六进制/可打印的ASCII的rodata
部等的内容转储:
Contents of section .rodata:
0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#.....
0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe
这看起来不像有什么事,在那里控制的格式,但它是一个开始。你总是可以undump的十六进制和喂它OD,我想:)
其他提示
readelf -x .rodata hello_world.o
给出:
Hex dump of section '.rodata':
0x00000000 48656c6c 6f20776f 726c6421 0a Hello world!.
你应该更喜欢 readelf
如果可能的话,因为 objdump
根本不显示某些部分,例如 .symtab
: 为什么 objdump 不显示 .bss、.shstratab、.symtab 和 .strtab 部分?
您还可以使用以下提到的技术提取原始字节: 如何只提取 ELF 部分的内容 正如所提到的 通过 ysdx.
你可以把原(未转储-ed)精灵部分:
# To a file:
objcopy file /dev/null --dump-section .text=text.data
# To stdout:
objcopy file /dev/null --dump-section .text=/dev/stdout | cat
我在这里使用 | cat
为了力stdout是一个管道。 /dev/stdout
可能会工作意外如果stdout是一个文件。 .text=-
没有发送到stdout但是对的 -
文件。
然而 objcopy和objdump有一些不足之处 (因为它们是根据报其中摘要不同的可执行格式)。
更新: 我写了一个 工具 要做到这一其不依赖于报.
不隶属于 StackOverflow