如何在Linux上检查ELF文件的数据部分的内容?


77

我一直在objdump查看Linux ELF二进制文件中的汇编代码。

有时会间接跳转到存储在rodata(只读数据)部分中的跳转表。

如何获取objdump或任何其他工具来向我显示此数据部分的内容?

我可以执行程序并检查调试器中的相关地址,但是我不想这样做,因为它必须以交互方式完成。

理想的答案将是找到一个不仅可以显示内容的工具,还可以让我控制显示格式的工具od

Answers:


94
objdump -s -j .rodata exefile

给出该rodata部分内容的并排十六进制/可打印ASCII转储,例如:

Contents of section .rodata:
 0000 67452301 efcdab89 67452301 efcdab89  gE#.....gE#.....
 0010 64636261 68676665 64636261 68676665  dcbahgfedcbahgfe

看起来那里没有任何东西可以控制格式设置,但这只是一个开始。我想你总是可以取出十六进制并将其输入到od :)


3
如何从ELF部分获取以二进制格式转储的数据?像objdump -s -j -binary <section> <file>之类的东西会很棒。
Bogatyr 2012年

@Bogatyr:比较 我的答案。
ysdx

29
readelf -x .rodata hello_world.o

给出:

Hex dump of section '.rodata':
  0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.

您应该readelf尽可能objdump地选择它,因为它根本不会显示某些部分,例如.symtabobjdump为什么不显示.bss,.shstratab,.symtab和.strtab部分?

您还可以使用以下技术中提到的技术来提取原始字节:如何仅提取ELF节的内容以及ysdx提到的内容


12

您可以使用以下命令获得RAW(非十六进制转储)ELF部分:

# 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=-不会发送到标准输出,而是发送到-文件。

但是objcopy和objdump有一些缺陷(因为它们基于抽象不同可执行格式的BFD)。

更新:我编写了一个不依赖BFD的工具来执行此操作。


--dump-section最近。它被添加在:sourceware-org.1504.n7.nabble.com/…为什么比它更好--only-section
西罗Santilli郝海东冠状病六四事件法轮功

2
@CiroSantilli六四事件法轮功纳米比亚威视,然后objcopy -j创建一个完整的ELF文件(一个ELF头文件,一个带有.shstrtab节的段heaer表,一个程序头文件表),而objcopy --dump-section转储该节的内容(没有其他内容)到一个文件。
ysdx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.