如何检查Linux上的ELF文件的数据部分的内容?
我一直在使用objdump
来查看Linux ELF二进制文件中的汇编代码。
有时会通过存储在rodata
(只读数据)部分中的跳转表进行间接跳转。
如何让objdump
或其他工具向我显示这个数据部分的内容?
我可以执行程序并在debugging器中检查相关的地址,但是我不想这样做,因为它必须以交互方式完成。
理想的答案将会确定一个工具,它不仅能显示内容,还能让我控制显示格式,就像od
一样。
objdump -s -j .rodata exefile
给出了rodata
节内容的并排hex/可打印ASCII转储,如下所示:
Contents of section .rodata: 0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#..... 0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe
看起来好像没有什么东西可以控制格式,但这是一个开始。 你可以随时取消这个hex,并把它提供给od,我想:)
readelf -x .rodata hello_world.o
得到:
Hex dump of section '.rodata': 0x00000000 48656c6c 6f20776f 726c6421 0a Hello world!.
你应该更喜欢readelf
,因为objdump
根本不显示一些像.symtab
这样的.symtab
: 为什么objdump不显示.bss,.shstratab,.symtab和.strtab部分?
您还可以使用以下提到的技术提取原始字节: 如何仅提取ELF部分的内容,如ysdx所述 。
你可以得到RAW(不是hexdump-ed)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
| cat
为了强制stdout成为一个pipe道。 如果stdout是一个文件, /dev/stdout
可能会意外地工作。 .text=-
不发送到标准输出,而是发送到文件。
然而objcopy和objdump有一些不足之处 (因为它们基于抽象不同可执行格式的BFD)。
更新:我写了一个工具来做到这一点,不依赖于BFD。