web-dev-qa-db-ja.com

LinuxでELFファイルのデータセクションの内容を調べるにはどうすればよいですか?

Linux ELFバイナリのアセンブリコードを見るためにobjdumpを使用しています。

rodata(読み取り専用データ)セクションに保存されているジャンプテーブルを介した間接ジャンプが発生する場合があります。

このデータセクションの内容を表示するobjdumpまたはその他のツールを取得する方法

プログラムを実行し、デバッガーで関連するアドレスを調べることはできますが、対話的に実行する必要があるため、そうしたくありません。

理想的な答えは、コンテンツを表示するだけでなく、odと同じように表示形式を制御できるツールを特定することです。

64
Norman Ramsey
objdump -s -j .rodata exefile

次のようなrodataセクションの内容の並列16進/印刷可能ASCIIダンプ)を提供します。

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

書式設定を制御するものがそこにあるようには見えませんが、それは始まりです。いつでもヘックスをアンダンプしてodに送ることができると思います:)

82
hobbs
readelf -x .rodata hello_world.o

与える:

Hex dump of section '.rodata':
  0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.

readelf.symtabのような一部のセクションを表示しないため、可能な場合はobjdumpを優先する必要があります。 、.symtabおよび.strtabセクション?

で説明されている手法で生バイトを抽出することもできます。ELFセクション の内容のみをどのように抽出しますか by ysdx .

以下を使用して、RAW(hexdumpedではない)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

ここでは、stdoutを強制的にパイプにするために| catを使用しています。 stdoutがファイルの場合、/dev/stdoutは予期せず動作する場合があります。 .text=-は標準出力ではなく、-ファイルに送信します。

ただし、 objcopyとobjdumpにはいくつかの欠陥があります (異なる実行可能形式を抽象化するBFDに基づいているため)。

更新: これを行うために、BFDに依存しない tool を作成しました。

11
ysdx