Ghidraを使ったリバースエンジニアリングに挑戦

セキュリティ

Ghidraを使うと実行ファイルのリバースエンジニアリングができると聞きましたので、さっそくやってみました。

環境

Windows11 Home
※JDKが入っていなかったので、入れました。

準備

Ghidraのダウンロード
 ここからzipファイルをダウンロードして解凍しました(ghidra/Ghidra at Ghidra_11.2.1_build · NationalSecurityAgency/ghidra · GitHub
 最近は解凍じゃなくて、展開という表現を使うのが一般的のようですが、いまだに解凍の方を使っています。

ghidraRun.batを実行したところ、JAVAのランタイムが見つからないとのエラーが出ます。
Javaで作られているのですね。

JDKのインストール
 GhidraのDOCを確認するとJDK 21 64 bitが必要でしたので、こちらからダウンロードしてインストールしました。
 最新リリース |JDK

JDKのインストール後、ghidraRun.batを実行したところ起動した様子。

勝手に改変しないこと等が書かれていますが、特に問題もないのでAgreeします。

問題なくGhidraが起動しました。
手前に表示されているのは「今日のTips」。とりあえず閉じます。

とりあえず使ってみる

使い方の流れ 

 使い方は
  ① プロジェクトを作る
  ② exeファイルを登録すると解析が始まる
  ③ ブラウザで必要な情報を確認する
といった流れになります。

プロジェクトを作る

 [File] – [NewProject] を選択

 共有プロジェクト/ 非共有プロジェクトを選択(非共有を選択)

プロジェクト用のディレクトリを選択(プロジェクト名はとりあえずTest)

これで準備完了

exeファイルを登録すると解析が始まる

リバースしたい実行ファイルをWindowsにドラックして登録します。
事前に作っておいた「ConsoleApplication.exe」を読み込ませてみました。
 ※C++で作った、ただのHelloCです

ConsoleApplication.exeが登録された様子

ファイル名をダブルクリックすると解析が始まります
ファイルが小さいので一瞬で終わりました

今すぐ解析しますか?と聞かれるので「OK」を選ぶと分析オプションが選べます。
(このままAnalyzeしました)

ニモニックが並んでいるので解析できたのだと思います。私にはまったく読めません。

ブラウザで必要な情報を確認する

関数名は復元されないので、Stringやmainでターゲットを絞り込みました。
①含まれている文字列で検索する
Filterを使って文字列を直接検索しました。

 Filterに「Hello」と入力すると、「s_Hello_c++_World!」がヒットしました。
 内部的には、DSで領域を確保してASCII文字を使っているようでした。

②main関数の関数名で検索する
 Filterを使ってMain関数を検索すると「main」がつく関数が絞り込まれるので、この中から探していく感じです。

探していたmain関数はここにありました。
ちなみに今回作成したソースとリバースソースを比較するとこんな感じです。

(元)作成したソースプログラム

#include <iostream>

int main()
{
    std::cout << "Hello c++ World!\n";
}

リバースしたソース

int __cdecl main(int _Argc,char **_Argv,char **_Env)

{
  __CheckForDebuggerJustMyCode(&__89188920_ConsoleApplication1@cpp);
  std::operator<<<std::char_traits<char>_>((basic_ostream<> *)cout_exref,"Hello c++ World!\n");
  return 0;
}

 癖は強いですがなんとなく読めるかな程度だと感じました。
ニモニック「PUSH RBI」 よりこっちの方が断然読みやすいです。
関数名は、右クリックで変更できるので、正しい関数名に変えると可読性が上がります。

最後に

 初めて使ったので、もっといい使い方があるのかもしれませんが、以前使っていた「binaryanalysis」より可読性が高いソースにリバースしてくれると感じました。
 しかも、javaで作られているのでプラットフォームに依存しない作りが素晴らしい。
 操作性も直感的で、なんとなくでも使えるあたりがいいですね。