Ghidraの使い方(調査まとめ)
はじめに
しばらくGhidraについて調べていたので、見つけた機能をいろいろ紹介していきます。 インストール方法やプロジェクトの共有については、別の記事を参考にしてください。
tsalvia.hatenablog.com tsalvia.hatenablog.com
公式サイトからチートシートも用意されているので、こちらも参考になります。
Ghidra Cheat Sheet
検証環境
下記の環境で検証を行いました。
- Windows 10 バージョン 1809
- OpenJDK 11.02
- Ghidra v9.0.2
解析用のサンプルプログラム
紹介するにあたって、解析サンプルとなるようなプログラムを用意しました。 このプログラムをベースに説明していきます。 正しいパスワードを入力したら、flagが取得できるようなCTF形式の簡単なプログラムを用意しました。
- 実行例
$ ./HelloGhidra Usage: ./HelloGhidra <password> $ ./HelloGhidra aaaaaaaa Incorrect password. $ ./HelloGhidra Hello_Ghidra! Congratulations! flag{Hello_Ghidra!}
コンパイル方法(今回はシンボル情報も削除しました)
$ gcc -o HelloGhidra HelloGhidra.c $ strip ./HelloGhidra
Ghidraの機能紹介
ウィンドウのレイアウト変更
各ウィンドウの青いバーをドラッグアンドドロップすることで、レイアウトを自由に変更できる。
- で別ウィンドウで表示する。
- で間に挿入する。
- でウィンドウを重ねる。
アセンブラ表示のレイアウト変更
Listingウィンドウのレイアウトは、細かく修正することができます。
Listingウィンドウの右上のをクリックすると、レイアウト編集モードに入れます。
スタックの深さを表示する
- Listingウィンドウの右上のをクリックすると、レイアウト編集モードに入ります。
- 「挿入したい場所を右クリック」→「Add Field」→「Stack Depth」をクリックする。
- 左端に「Stack Depth」が追加されました。
コードグラフの表示
「Window」→「Function Graph」もしくはをクリックすると表示されます。
スナップショットの作成
現在見ている場所をスナップショットとして別ウィンドウに保持することができます。
各ウィンドウの右上にあるをクリックすると、スナップショットを作成することができます。
関数名や型の書換え
関数名や返り値の型などを修正することができます。
「関数名を右クリック」→「Edit Function Signature」で編集ウィンドウが表示されます。
変更前
変更後
変数名の変更
ループカウンタ変数である「local_c」を「i」に書き換えてみます。
「変数(local_c)を右クリックする」→「Rename Variable」で変更できます。
変更前
変更後
数値の表示形式を変更する(例:16進数→10進数)
「Listingウィンドウの数値を右クリックする」→「Convert」で様々な形式に変換できます。
Listingウィンドウで変換した内容は、Decompileウィンドウにも反映されます。
文字列の検索(Defined Strings)
「Window」→「Defined Strings」で表示できます。
文字列の参照先にジャンプする
- 「対象の文字列をダブルクリック」すると、文字列が格納されている場所にジャンプします。
- 「ジャンプ先の文字列を右クリック」→「References」→「Show References to Address」をクリックする。
- 参照先のアドレス一覧が表示されるので、ジャンプしたい項目をダブルクリックする。
オーバービューやエントロピーの表示
「どこに何が格納されているのか」や「どういう形式なのか」を色で確認することができます。
Listingウィンドウの右上にある「Toggles overview margin displays.」をクリックする。 「Show Overview」や「Show Entropy」にチェックを入れる。
Overview
Entropy
マウスオーバーで参照先を表示する
関数名やラベルにマウスカーソルを当てると、参照先がどうなっているのかを確認することができます。
マウスオーバー機能の無効化
Listingウィンドウの右上にあるをクリックすると、 に変わり、マウスオーバーで表示する機能を無効化できる。
関数呼び出しをツリーグラフで確認する
「Window」→「Function Call Graph」で表示できます。
コメントの挿入
「コメントを挿入したい個所を右クリック」→「Comments」→「Set Pre Comment...」をクリックします。
コメント挿入用のウィンドウが表示されるのでコメントを書き込んで、「Apply」をクリックする。
コメントは、DecompileウィンドウやListingウィンドウに反映されます。
バイナリ表示(Bytes)
「Window」→「Bytes」 もしくは ボタンをクリックすると表示されます。
アスキー文字列の表示
Bytesウィンドウの右上のボタンをクリックし、 「Ascii」にチェックを入れる。
スクリプトマネージャ
Ghidraにはさまざまなスクリプトが用意されています。
「Window」→「Script Manager」もしくはで開くことができます。
Script Managerの右上のをクリックすると、ソースコードを表示することができます。
XOR変換(XorMemoryScript.java)
- XOR変換したい個所を「Bytes」ウィンドウで指定する。 マウスでドラッグすると、緑色にハイライトされます。
- 「Script Manager」を開いて、「XorMemoryScript.java」にチェックを入れます。
- 「Run Script」ボタンを押すと、スクリプトが起動します。
- 今回は、0x15でxorされていることが、Decompile結果から分かっているので、「15」と入力します。
- 「OK」を押すと、ハイライトされた箇所が「]pyyzJR}|qgt4」から「Hello_Ghidra!」に変換されていることが分かります。
ダークモード
「Edit」→「Tool Options...」→「Tool」→「Use Inverted Colors」にチェックを入れる。
※ CodeBrowserではなく、プロジェクト管理のEditメニューから設定する。