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,我想:)
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.