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

106
我一直在使用objdump来查看Linux ELF二进制文件中的汇编代码。
有时会通过存储在rodata(只读数据)部分中的跳转表进行间接跳转。
如何让objdump或其他工具显示我这个数据段的内容?
我可以执行程序并在调试器中检查相关地址,但我不想这样做,因为必须以交互方式完成。
最理想的答案将确定一个工具,它不仅会显示内容,而且还将让我控制显示格式,就像od一样。
3个回答

133
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
@Bogatyr:请参考我的回答。 - ysdx

50

20

您可以使用以下命令获取未进行十六进制转储的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来强制将标准输出作为管道。如果标准输出是文件,则/dev/stdout可能会发生意外情况。.text=-并不会发送到标准输出,而是发送到文件-

然而,objcopy和objdump存在一些缺陷(因为它们基于抽象不同的可执行文件格式的BFD)。

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


“--dump-section” 是一个比较新的选项。它是在以下网址添加的:http://sourceware-org.1504.n7.nabble.com/Commit-objcopy-Add-dump-section-option-td256052.html。为什么它比“--only-section”更好呢? - Ciro Santilli OurBigBook.com
非常好的解决方案。此外,特别是对于.modinfo部分,为了逐行打印每个参数及其值,我们可以使用... | xargs --null -n1 -I{} echo {};,因为每个键值对都以0x00字节值结尾,这是从原始输出中检查出来的。PS:我习惯使用-n1,但在这种命令中它是多余的。 - haxpor
@hapor,这可能取决于您使用的sed版本(?),但是使用GNU sed,您可以使用sed 's/\x0/\n/g' - ysdx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接