TSALVIA技術メモ

CTFのWriteupや気になったツールについて書いていきます。また、このサイトはGoogle Analyticsを利用しています。

Ghidraの使い方(調査まとめ)

はじめに

しばらくGhidraについて調べていたので、見つけた機能をいろいろ紹介していきます。 インストール方法やプロジェクトの共有については、別の記事を参考にしてください。

tsalvia.hatenablog.com tsalvia.hatenablog.com

公式サイトからチートシートも用意されているので、こちらも参考になります。
Ghidra Cheat Sheet

f:id:tsalvia:20190401001401p:plain

検証環境

下記の環境で検証を行いました。

  • 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の機能紹介

ウィンドウのレイアウト変更

各ウィンドウの青いバーをドラッグアンドドロップすることで、レイアウトを自由に変更できる。

  • f:id:tsalvia:20190331193302p:plainで別ウィンドウで表示する。
  • f:id:tsalvia:20190331193421p:plainで間に挿入する。
  • f:id:tsalvia:20190331193500p:plainでウィンドウを重ねる。

https://i.gyazo.com/9279cc57778d902cacb150775b426e10.gif

アセンブラ表示のレイアウト変更

Listingウィンドウのレイアウトは、細かく修正することができます。

Listingウィンドウの右上のf:id:tsalvia:20190331225234p:plainをクリックすると、レイアウト編集モードに入れます。

https://i.gyazo.com/bd5941a6e4ee99a8bd88369d0f1bfd18.gif

スタックの深さを表示する

  1. Listingウィンドウの右上のf:id:tsalvia:20190331225234p:plainをクリックすると、レイアウト編集モードに入ります。
  2. 「挿入したい場所を右クリック」→「Add Field」→「Stack Depth」をクリックする。

f:id:tsalvia:20190331232606p:plain

  1. 左端に「Stack Depth」が追加されました。

f:id:tsalvia:20190331233301p:plain

コードグラフの表示

「Window」→「Function Graph」もしくはf:id:tsalvia:20190331233829p:plainをクリックすると表示されます。

f:id:tsalvia:20190331233809p:plain

スナップショットの作成

現在見ている場所をスナップショットとして別ウィンドウに保持することができます。

各ウィンドウの右上にあるf:id:tsalvia:20190331235834p:plainをクリックすると、スナップショットを作成することができます。

https://i.gyazo.com/cfb56e9d20218bc986ffdd3fc706508d.gif

関数名や型の書換え

関数名や返り値の型などを修正することができます。

「関数名を右クリック」→「Edit Function Signature」で編集ウィンドウが表示されます。

f:id:tsalvia:20190331194916p:plain

  • 変更前 f:id:tsalvia:20190331195058p:plain

  • 変更後 f:id:tsalvia:20190331195326p:plain f:id:tsalvia:20190331195358p:plain

変数名の変更

ループカウンタ変数である「local_c」を「i」に書き換えてみます。
「変数(local_c)を右クリックする」→「Rename Variable」で変更できます。

f:id:tsalvia:20190331205544p:plain

f:id:tsalvia:20190331205437p:plain

  • 変更前 f:id:tsalvia:20190331204922p:plain

  • 変更後 f:id:tsalvia:20190331205218p:plain

数値の表示形式を変更する(例:16進数→10進数)

「Listingウィンドウの数値を右クリックする」→「Convert」で様々な形式に変換できます。

f:id:tsalvia:20190331210350p:plain

Listingウィンドウで変換した内容は、Decompileウィンドウにも反映されます。 f:id:tsalvia:20190331210551p:plain

文字列の検索(Defined Strings)

「Window」→「Defined Strings」で表示できます。

f:id:tsalvia:20190331200313p:plain

文字列の参照先にジャンプする

  1. 「対象の文字列をダブルクリック」すると、文字列が格納されている場所にジャンプします。
  2. 「ジャンプ先の文字列を右クリック」→「References」→「Show References to Address」をクリックする。
  3. 参照先のアドレス一覧が表示されるので、ジャンプしたい項目をダブルクリックする。

https://i.gyazo.com/69c7d7828ae86dee2311fc25792f4da1.gif

オーバービューやエントロピーの表示

「どこに何が格納されているのか」や「どういう形式なのか」を色で確認することができます。

Listingウィンドウの右上にある「Toggles overview margin displays.」をクリックする。 「Show Overview」や「Show Entropy」にチェックを入れる。

https://i.gyazo.com/ac7ffaee50edcb850a3eb14caa1570c7.gif

  • Overview
    f:id:tsalvia:20190331202507p:plain

  • Entropy
    f:id:tsalvia:20190331202538p:plain

マウスオーバーで参照先を表示する

関数名やラベルにマウスカーソルを当てると、参照先がどうなっているのかを確認することができます。

https://i.gyazo.com/afde6c9af0471f3a9cdc61696c599838.gif

マウスオーバー機能の無効化

Listingウィンドウの右上にあるf:id:tsalvia:20190331204258p:plainをクリックすると、 f:id:tsalvia:20190331204319p:plainに変わり、マウスオーバーで表示する機能を無効化できる。

関数呼び出しをツリーグラフで確認する

「Window」→「Function Call Graph」で表示できます。

f:id:tsalvia:20190331220808p:plain

コメントの挿入

  1. 「コメントを挿入したい個所を右クリック」→「Comments」→「Set Pre Comment...」をクリックします。 f:id:tsalvia:20190331213943p:plain

  2. コメント挿入用のウィンドウが表示されるのでコメントを書き込んで、「Apply」をクリックする。 f:id:tsalvia:20190331214053p:plain

  3. コメントは、DecompileウィンドウやListingウィンドウに反映されます。 f:id:tsalvia:20190331213816p:plain

バイナリ表示(Bytes)

「Window」→「Bytes」 もしくは f:id:tsalvia:20190331211359p:plainボタンをクリックすると表示されます。

f:id:tsalvia:20190331211626p:plain

アスキー文字列の表示

Bytesウィンドウの右上のf:id:tsalvia:20190331213046p:plainボタンをクリックし、 「Ascii」にチェックを入れる。

f:id:tsalvia:20190331212243p:plain

f:id:tsalvia:20190331213011p:plain

スクリプトマネージャ

Ghidraにはさまざまなスクリプトが用意されています。

「Window」→「Script Manager」もしくはf:id:tsalvia:20190331234633p:plainで開くことができます。

f:id:tsalvia:20190331234550p:plain

Script Managerの右上のf:id:tsalvia:20190331234838p:plainをクリックすると、ソースコードを表示することができます。

f:id:tsalvia:20190331234806p:plain

XOR変換(XorMemoryScript.java

  1. XOR変換したい個所を「Bytes」ウィンドウで指定する。 マウスでドラッグすると、緑色にハイライトされます。

f:id:tsalvia:20190331215142p:plain

  1. 「Script Manager」を開いて、「XorMemoryScript.java」にチェックを入れます。
  2. 「Run Script」ボタンを押すと、スクリプトが起動します。
  3. 今回は、0x15でxorされていることが、Decompile結果から分かっているので、「15」と入力します。

f:id:tsalvia:20190331215441p:plain

  1. 「OK」を押すと、ハイライトされた箇所が「]pyyzJR}|qgt4」から「Hello_Ghidra!」に変換されていることが分かります。

f:id:tsalvia:20190331215608p:plain

ダークモード

「Edit」→「Tool Options...」→「Tool」→「Use Inverted Colors」にチェックを入れる。
※ CodeBrowserではなく、プロジェクト管理のEditメニューから設定する。

f:id:tsalvia:20190331193904p:plain

f:id:tsalvia:20190331194038p:plain

参考にしたサイト