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

Nor*_*sey 66 linux elf object-code objdump

我一直在使用objdumpLinux ELF二进制文件中的汇编代码.

有时会通过存储在rodata(只读数据)部分中的跳转表进行间接跳转.

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

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

理想的答案将确定一个工具,不仅可以向我显示内容,还可以让我控制显示格式od.

hob*_*bbs 82

objdump -s -j .rodata exefile
Run Code Online (Sandbox Code Playgroud)

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

Contents of section .rodata:
 0000 67452301 efcdab89 67452301 efcdab89  gE#.....gE#.....
 0010 64636261 68676665 64636261 68676665  dcbahgfedcbahgfe
Run Code Online (Sandbox Code Playgroud)

看起来没有什么可以控制格式化,但它是一个开始.您可以随时取消六角形并将其输入od,我想:)

  • 如何从ELF部分以二进制格式转储数据?像objdump -s -j -binary <section> <file>之类的东西会很棒. (3认同)

Cir*_*四事件 19

readelf -x .rodata hello_world.o
Run Code Online (Sandbox Code Playgroud)

得到:

Hex dump of section '.rodata':
  0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.
Run Code Online (Sandbox Code Playgroud)

您应该readelf尽可能objdump地选择,因为根本不会显示以下部分.symtab:为什么objdump不显示.bss,.shstratab,.symtab和.strtab部分?

您还可以使用以下技术提取原始字节:如何仅提取ELF部分的内容,ysdx所述.


ysd*_*sdx 11

您可以使用以下内容获取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
Run Code Online (Sandbox Code Playgroud)

我在这里使用| cat以强制stdout成为管道./dev/stdout如果stdout是一个文件,可能会意外地工作..text=-不发送到stdout而是发送到-文件.

然而,objcopy和objdump有一些缺陷(因为它们基于BFD,它抽象出不同的可执行格式).

更新:我写了一个工具来做到这一点不依赖于BFD.

  • @CiroSantilli六四事件法轮功纳米比亚威视,那么`objcopy -j`会创建一个完整的ELF文件(一个ELF头文件,一个带有.shstrtab节的段heaer表,一个程序头表),而`objcopy --dump- section`将节的内容(没有其他内容)转储到文件中。 (2认同)