Marsの5εcur1ty備忘録

不定期的にCTF、脆弱性検証、バグバウンティレポート分析など、情報セキュリティを中心とした技術ブログを更新します。

任意の機械語コードをアセンブリ言語に逆アセンブルする方法

 こんにちは、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部分に対応のアセンブリコードがあります。

f:id:z773733850:20190109003557p:plain

 アドレス80483f0から、66, 0f...

 これで、右のアセンブリコードに変換することができました。

 

 ご覧いただき、ありがとうございました。

Copyright Mars 2019