2009-11-06 24 views
48

我一直在使用objdump来查看Linux ELF二进制文件中的汇编代码。如何检查Linux上ELF文件的数据部分的内容?

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

如何获得objdump或任何其他工具给我看这个数据段的内容是什么?

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

理想的答案将确定一个工具,它不仅会告诉我的内容,但让我控制的显示格式,多为od一样。

回答

67
objdump -s -j .rodata exefile 

给出了类似的rodata部分内容的并排的十六进制/打印的ASCII转储:

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

它看起来并不像有什么事,在那里控制的格式,但这是一个开始。你总是可以undump的十六进制和喂它OD,我想:)

+2

太棒了!我试过这个,但是我没有想到包含这个血腥的点...... – 2009-11-06 05:49:03

+3

如何从ELF部分获取以二进制格式转储的数据?像objdump -s -j -binary

会很棒。 – Bogatyr 2012-10-26 09:42:33

+0

@Bogatyr:参见我的答案。 – ysdx 2015-08-21 11:18:30

7

你可以得到RAW(未进制打印-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。如果stdout是文件,/dev/stdout可能会意外地工作。 .text=-不会发送到标准输出,而是发送到-文件。

然而objcopy and objdump have some deficiencies(因为它们是基于BFD哪个抽象不同可执行文件格式)。

更新:我写了一个tool这样做,它不依赖于BFD。

+0

'--dump-section'有点新近了。它添加在:http://sourceware-org.1504.n7.nabble.com/Commit-objcopy-Add-dump-section-option-td256052.html为什么它比'--only-section'好? – 2015-09-04 13:20:07

+0

你从我的投票中找到(并写作!)比我的答案中更有意义的工具。 – hobbs 2016-01-21 06:45:17