我一直在objdump
查看Linux ELF二进制文件中的汇编代码。
有时会间接跳转到存储在rodata
(只读数据)部分中的跳转表。
如何获取objdump
或任何其他工具来向我显示此数据部分的内容?
我可以执行程序并检查调试器中的相关地址,但是我不想这样做,因为它必须以交互方式完成。
理想的答案将是找到一个不仅可以显示内容的工具,还可以让我控制显示格式的工具od
。
我一直在objdump
查看Linux ELF二进制文件中的汇编代码。
有时会间接跳转到存储在rodata
(只读数据)部分中的跳转表。
如何获取objdump
或任何其他工具来向我显示此数据部分的内容?
我可以执行程序并检查调试器中的相关地址,但是我不想这样做,因为它必须以交互方式完成。
理想的答案将是找到一个不仅可以显示内容的工具,还可以让我控制显示格式的工具od
。
Answers:
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 :)
readelf -x .rodata hello_world.o
给出:
Hex dump of section '.rodata':
0x00000000 48656c6c 6f20776f 726c6421 0a Hello world!.
您应该readelf
尽可能objdump
地选择它,因为它根本不会显示某些部分,例如.symtab
:objdump为什么不显示.bss,.shstratab,.symtab和.strtab部分?
您还可以使用以下技术中提到的技术来提取原始字节:如何仅提取ELF节的内容以及ysdx提到的内容。
您可以使用以下命令获得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的工具来执行此操作。
objcopy -j
创建一个完整的ELF文件(一个ELF头文件,一个带有.shstrtab节的段heaer表,一个程序头文件表),而objcopy --dump-section
转储该节的内容(没有其他内容)到一个文件。