Como posso examinar o conteúdo de uma seção de dados de um arquivo ELF no Linux?
-
18-09-2019 - |
Pergunta
Eu tenho usado objdump
de olhar para o código de montagem em binários Linux ELF.
Às vezes, há um salto indireta através de uma tabela salto que é armazenado no rodata
(somente leitura de dados) seção.
Como chegar objdump
ou qualquer outra ferramenta para me mostrar o conteúdo desta seção de dados?
Eu poderia executar o programa e examinar os endereços relevantes no depurador, mas eu não quero fazer isso porque tem que ser feito de forma interativa.
A resposta ideal irá identificar uma ferramenta que não só irá me mostrar o conteúdo, mas me deixa controlar o formato de exibição, tanto quanto od
faz.
Solução
objdump -s -j .rodata exefile
dá uma hex despejo ASCII side-by-side / impressão do conteúdo da seção rodata
como:
Contents of section .rodata:
0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#.....
0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe
Não parece que há qualquer coisa lá para controlar a formatação, mas é um começo. Você pode sempre undump o hex e alimentá-lo para od, suponho:)
Outras dicas
readelf -x .rodata hello_world.o
dá:
Hex dump of section '.rodata':
0x00000000 48656c6c 6f20776f 726c6421 0a Hello world!.
Você deve preferir readelf
quando possível desde objdump
simplesmente não mostra algumas seções como .symtab
: Por que não objdump mostrar .bss, .shstratab, .symtab e .strtab seções?
Você também pode extrair os bytes brutos com as técnicas mencionadas em: como você extrair apenas o conteúdo de uma seção ELF e como mencionado por ysdx .
Você pode obter o RAW (não hexdump-ed) seção ELF com:
# To a file:
objcopy file /dev/null --dump-section .text=text.data
# To stdout:
objcopy file /dev/null --dump-section .text=/dev/stdout | cat
Aqui eu estou usando | cat
a fim de forçar stdout para ser um tubo. /dev/stdout
pode funcionar inesperadamente se stdout é um arquivo. .text=-
não envia a saída padrão, mas para o arquivo -
.
No entanto objcopy e objdump ter algumas deficiências (porque eles são baseados em BFD que abstrai diferentes formatos executáveis).
Update: eu escrevi um ferramenta para fazer isso que não depende em BFD.