今回から、リバースエンジニアリングツールである Ghidra を使っていきます。
書籍「リバースエンジニアリングツールGhidra実践ガイド (Compass Booksシリーズ)」を読みながら進めていきます。
それでは、やっていきます。
参考文献
はじめに
「セキュリティ」の記事一覧です。良かったら参考にしてください。
セキュリティの記事一覧
まず、書籍「リバースエンジニアリングツールGhidra実践ガイド (Compass Booksシリーズ)」のサポートサイトは以下です。
ここからサンプルプログラムがダウンロードできます。
book.mynavi.jp
今回は、Ghidra の環境を構築していきます。
Ghidraのインストール
Ghidra とは、アメリカ国家安全保障局(NSA:National Security Agency)によって開発されたソフトウェアリバースエンジニアリングのツールです。
どんなことが出来るかは、書籍「リバースエンジニアリングツールGhidra実践ガイド (Compass Booksシリーズ)」のサンプルプログラムを動かしながら理解したいと思います。
今回は、VirtualBox の Ubuntu 22.04 に Ghidra をインストールしていきます。
まず、以下は、Ghidra の GitHub です。
github.com
インストール方法が書かれています。
まず、JDK 17 64bit をインストールします。
私は既にインストール済みですが、以下で簡単にインストールできます。
$ sudo apt install openjdk-17-jdk
続いて、Ghidra の GitHub の releases から zipファイルをダウンロードします。
github.com
ファイル名は、ghidra_11.0.3_PUBLIC_20240410.zip です。
※2024/8/30:追記
新しい gcc、g++ ビルドしたプログラムは、DWARF v5 が使われていて、Ghidra は、v11.1 から、この DWARF v5 に対応しています。ダウンロードするときは、v11.1 以降を選んだ方がいいです。
解凍します。
$ unzip ghidra_11.0.3_PUBLIC_20240410.zip
解凍したディレクトリの ghidraRun を起動します。
cd ghidra_11.0.3_PUBLIC/
./ghidraRun
起動すると、使用許諾が出るので、問題なければ、I Agree をクリックします。
使用許諾の画面
Ghidra が起動しました。
Ghidraが起動した
インストールは以上で完了です。
プロジェクトの作成からプログラムの解析まで
プロジェクトの作成
Tip of the Day は閉じておきます。
プロジェクトを作成していきます。
File → New Project... をクリックします。
プロジェクトを作成する
Non-Shared Project と Shared Project が選択として現れます。Shared Project は、共同で作業するためのプロジェクトで、Ghidra Server というのが必要らしく、通常は、Non-Shared Project を選びます。Nextをクリックします。
Non-Shared Projectを選ぶ
次に、プロジェクトの場所と、プロジェクト名を決めます。どちらも任意ですが、プロジェクトの場所とは、複数のプロジェクトが格納される場所なので、新しいディレクトリを作って、そこを指定してください。その下に、今回指定したプロジェクト名のディレクトリが出来ます。指定できたら、Finish をクリックします。
プロジェクトの場所とプロジェクト名を決める
プロジェクトが作られました。
プロジェクト作成完了
これからプログラムをロードするのですが、構造の分からないプログラムより、以前に作った STM32 のサンプルプログラムを使います。
daisuke20240310.hatenablog.com
プログラムのインポート
STM32 のプログラム(ELFファイル)をインポートします。
File → Import File... をクリックします。
プログラムのインポート
STM32 の ELFファイルを指定すると、確認画面が出ます。
ELFファイルで、32bit の ARM と正しく認識していますので、OKをクリックします。
ELFファイルのインポート確認画面
インポート結果のサマリが出ます。OKをクリックします。
インポート結果のサマリ
プログラムの解析
続いて、プログラムを解析させます。
Active Project のテキストのアイコンをダブルクリックします。
テキストアイコンをダブルクリックする
すると、Code Browser が開き、解析するかどうか聞かれるので、Yes をクリックします。
解析するかを確認される
解析オプションを聞かれるので、デフォルトのままでいいと思います。もしくは、Select All を選択して、Analyze をクリックします。
解析オプションの選択
右下に解析状況が表示されています。解析が完了すると、ソースコードが表示されます。試しに main をクリックすると、デコンパイルされた結果が右のウィンドウに表示されます。
解析結果が表示される
ちなみに、もとの main関数のソースコードは以下になります。
int main(void)
{
initialise_monitor_handles();
led_init();
button_init();
systick_init();
while (1) {
time = g_system_time - lap_time;
switch (state) {
case WAINTING:
waiting();
break;
case RUNNING:
running();
break;
case STOP_OK:
stop_ok();
break;
case STOP_NG:
default:
stop_ng();
break;
}
}
return 0;
}
デバッグ情報が含まれている ELFファイルですが、ほぼ、Cソースコードを復元できています。
今回はここまでにします。
おわりに
今回から、Ghidra を使ったリバースエンジニアリングを始めました。
次回は、Ghidra の使い方を理解していきたいと思います。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。