FineArt News

セキュリティ専門家やコンピュータフォレンジック調査員になるには、ソフトウェアのソースコードに対する理解が必要不可欠です。プログラムがどのように脆弱性を利用されるかを把握して、悪意あるソフトウェアのソースコードを分析する必要があります。逆アセンブリは、実行ファイルをより人間に理解しやすいプログラミング言語に変換するプロセスです。通常は実行可能ファイルをアセンブリ言語に変換し、さらにC言語や他プログラミング言語にデコンパイルします。

実行ファイルは、プログラマーの最終的なプロダクトです。プログラマーは、機能や要件に基づいて自分の理解に合わせてプログラムを書き、コンパイラでコードをコンパイルして実行ファイルに変換します。

上記のプロセスを逆転させると、リバースエンジニアリングになります。実行可能ファイルをディスアセンブラやデコンパイラを通じて、最終的に人が読めるソースコードに復元します。

ハッカーやウイルスプログラムの原理や特徴を解析する場合、リバースエンジニアリングでそのプログラムのフローと原理を復元する必要があります。このプロセスは、探偵のように現場の証拠を分析して徐々に真実を明らかにするようなものです。例えばウイルスを分析する場合、プログラムコードやテキストからウイルスの特徴や感染する特定文字列ファイル、特定文字列URLからファイルをダウンロードするなどの行動特性を推測することができます。

以下では簡単な例を使って、リバースエンジニアリングの方法を説明します。

シンプルなプログラムを作成

コンパイラをダウンロードして、簡単なプログラムを書きます。

以下から無料のC ++コンパイラであるDec-C ++をダウンロードすることができます。

https://sourceforge.net/projects/orwelldevcpp/

まず、コマンドプロンプトで実行できるプログラムを作成します。このプログラムは非常にシンプルで、ユーザーにパスワード(key)を入力するよう要求します。パスワードが10であれば「key OK」と出力します。

#include <stdio.h>

#include <string.h>

 

int main(int argc,char** argv) {

int Key;

 

scanf( "%d",&Key);

if ( Key == 10 )

{

printf("key OK\n");

}

return 0;

}

コンパイルに成功した場合、Test1.exeファイルがプログラムのディレクトリに作成されます。DOS環境で実行して、パスワードが正しい場合は「key OK」と表示されます。

MadEditでEXE の構造を解析

MadEditなどのツールを使用して、EXEファイルの構造を分析することができます。Test1.exeファイルの内容を表示すると、最初の2バイトは「MZ」であり、これはPEファイルであることを示しています。

「key OK」という文字列がファイルのどこにあるかを見つけると、逆アセンブリの基準点と見なすことができます。この位置を参照するサブルーチンがある場合、これは出力に使用されるサブルーチンであり、パスワード検証に通じていることを示します。

このサブルーチンの上部に移動すると、正しいパスワードを判断するプログラムの位置を見つけることができます。

逆アセンブラ (Disassembler)

MadEditを使用してTest1.exeを表示すると、このファイルに関する直感的な概要を得ることができますが、Test1.exeを詳細に分析するにはさらに強力なツールが必要です。公認された最高のツールとしてIDA Proがあります。

IDA Proはプログラムの逆アセンブリから始まり、プログラムのフロー・変数・および関数の呼び出しを分析します。ただしIDA Proは有料であり、十分なプログラミングの基礎が必要です。初心者にとっては扱いにくい場合もあります。

逆アセンブラの分析

IDA Pro 64を使用してTest1.exeを開くと自動的に内容が分析され、逆アセンブリが行われます。逆アセンブリの結果は構造図とプログラムリストで表示することができます。

構造図 プログラムリスト

 

デコンパイル (Decompiler)

また、IDA Proは簡単な分析を行い、アセンブリ言語をC言語に逆コンパイルすることもできます。F5を使用して逆コンパイルの結果を試すことができます。

以下は、元のコードとIDA Proの仮想コードの比較です。

元のコード IDA Proの仮想コード

#include <stdio.h>

#include <string.h>

 

int main(int argc,char** argv) {

int Key;

 

scanf( "%d",&Key);

if ( Key == 10 )

{

printf("key OK\n");

}

return 0;

}

int __cdecl main(int argc,const char **argv,const char **envp)

{

int Key; // [rsp+2Ch] [rbp-4h]

 

_main();

scanf("%d",&Key);

if ( Key == 10 )

puts("key OK");

return 0;

}

 

IDA Pro のデコンパイル

IDA Proは仮想コードを生成することができますが、ほとんどの場合は直接再コンパイルすることはできません。仮想コードは実際のソースコードではないが、ロジックプロセスを理解し、動作フローを分析するのに役立ちます。例えば、仮想コードからTest1.exeがパスワードを要求し、パスワードが10と等しい場合は「key OK」と表示することが容易にわかります。したがって、正しいパスワード10がプログラムにハードコーディングされていると推測できます。

IDA Proによる変数の解析で、さらにソースコードでローカル変数int Keyが定義されていることがわかります。

一部のコンパイラは、デバッグ時に使用するためにソースコードの注釈を実行ファイルに書き込む場合があります。リリース前にコンパイラパラメータを変更して、デバッグ情報を削除することで、プログラムサイズを軽減でき、脆弱性も回避できます

結論

以上で未知の実行ファイルをアセンブリ言語に変換し、さらに仮想コードに変換して、実行ファイルの動作を理解するためのいくつかのツールを利用したリバースエンジニアリング方法を紹介しました。皆さんの役に立つことができれば幸いです。