web-dev-qa-db-ja.com

objdumpを使用したフラットバイナリファイルの分解

Objdumpを使用してフラットバイナリファイルを逆アセンブルできますか?

私は、ELFファイルなどの構造化されたバイナリ実行可能ファイルを逆アセンブルすることに慣れています。

objdump -d file.elf

しかし、たとえばアドレス0xabcd1000にロードされるはずのフラットバイナリファイルがある場合、objdumpに逆アセンブルすることはできますか? 「--start-address = 0xabcd1000」などのオプションを指定しようとしましたが、objdumpは形式を認識しないとだけ述べています。

ファイルを逆アセンブルする方法について他のアイデアがありますが、objdumpが簡単な解決策を提供できるかどうかを知りたいと思いました。

29
Multimedia Mike

別のフォーラムで自分の質問に対する解決策を見つけました。次のようになります。

objdump -b binary --adjust-vma=0xabcd1000 -D file.bin

私はこれをテストしましたが、動作します。

36
Multimedia Mike

starblue および hlovdal の両方に正解の一部があります。生のi8086コードを逆アセンブルする場合、通常はAT&T構文ではなくIntel構文も必要になるため、次を使用します。

objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin    # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin  # for 64-bit code

コードがELF(またはa.out(または(E)COFF))の場合、短い形式を使用できます。

objdump -D -Mintel,i8086 a.out  # disassembles the entire file
objdump -d -Mintel,i8086 a.out  # disassembles only code sections

32ビットまたは64ビットコードの場合、,8086を省略します。 ELFヘッダーにはすでにこの情報が含まれています。

ndisasmjameslin で示唆されているように、良い選択ですが、objdumpは通常OSに付属しており、GNU binutils(GCCでサポートされるもののスーパーセット)、およびその出力は通常GNU as(ndisasmの通常はnasmしかし、もちろん)。

Peter Cordes は、「 Agner Fogのobjconv は非常に素晴らしい」と示唆しています。ブランチターゲットにラベルを付けて、コードが何をするのかを簡単に把握できるようにします。 NASM、YASM、MASM、またはAT&T(GNU)構文に分解できます。」

マルチメディアマイク すでに--adjust-vmaについてわかっています;同等のndisasm-oオプションです。

たとえば、sh4コードを逆アセンブルするには(テストにDebianの1つのバイナリを使用しました)、これをGNU binutilsとともに使用します(他のすべての逆アセンブラは、x86などの1つのプラットフォームndisasmおよびobjconvを使用):

objdump -D -b binary -m sh -EL x

-mはマシンであり、-ELはリトルエンディアンを意味します(sh4ebの代わりに-EBを使用)。これはどちらのエンディアンにも存在するアーキテクチャに関連します。

17
mirabilos