任意の機械語コードをアセンブリ言語に逆アセンブルする方法
こんにちは、Marsです。
機械語とアセンブリ言語との対応関係で悩んだことがないでしょうか?
普段機械語を逆アセンブルする際に、実行可能ファイルにobjdumpコマンドを使ったり、GDBのdisassembleコマンドを使ったりして逆アセンブルしている方が通常のやり方なのですが、
もし、非常に短く、実行型ファイルだが確実に実行できない機械語を逆アセンブルしたい場合はどうすれば良いでしょうか。
例えば、「c3」という1バイトの機械語のみ逆アセンブルしたい場合、そもそも実行できないため、objdumpもできないしデバッグもできません。hexdumpとかodとかはアセンブリコードを表示しません。
筆者は非常に悩みましたが、ある方法を見つけました!
もしほかに良い方法があれば、ぜひ教えてください^^
任意の機械語をアセンブリ言語に変換するには、C言語を使います。
---------------------------
int main()
{
__asm__ __volatile__ (".byte 0x66, 0xf, 0x3a, 0xf, 0xd1, 0x4, 0x8d, 0x7f, 0x20, 0x66, 0xf, 0x7f, 0x54, 0x3a, 0xe0, 0x66");
}
---------------------------
次に、コンパイルします。
「gcc -m32 a.c」
これは、32bitのasmアセンブラなので、必ず-m32オプションを付けてください。このオプションが使えない場合、それのライブラリをダウンロードしてください。
「sudo apt-get install libc6-dev-i386」
最後に、「objdump -d a.out」で逆アセンブルし、main部分に対応のアセンブリコードがあります。
アドレス80483f0から、66, 0f...
これで、右のアセンブリコードに変換することができました。
ご覧いただき、ありがとうございました。