2019/03/09
Ghidraをちょっと使って思ったことなど
GhidraはRSA Conference USA 2019でお披露目された、NSAが開発したソフトウェアリバースエンジニアリング(SRE)スイートです。
要はNSA版IDAといったところです。
珍しくセキュリティネタですが、一応本業は情報セキュリティです。
ご注意
おそらく強い方々が求めているような情報はありません。そのような方々は他所にある英語のまとめ等を当たった方が良いでしょう。
使ってて出てきた疑問類
Ghidraの読みは?
公式のFAQにはGee-druh
と発音するということが書かれています。
なので日本語読みは「ギドラ」で良いと思います(結局キングギドラと関係あるのか?)
実行可能ファイルの形式の対応具合は?
PE、ELF、Mach-Oは問題なく読めます。
DWARFやObjective-Cなどの各種情報類も一通り対応しているようです。
会社で試してたときに、iOSのアプリバイナリ(ARM64)を突っ込んでみましたがきちんと読めました。
展開済みのLinuxカーネルみたいな、生バイナリ読める?
読めます。
ロード画面のLanguage欄でアーキテクチャを指定後、Optionsで入れるオプション設定画面でベースアドレスを指定できます。
IDAで言うセグメントはブロックって言うみたいですね。
IDAで言うセグメントレジスタを指定したい!
IDAでセグメントレジスタを指定するよくある例としては、ARMのThumbモードを強制するというのがありますね。
同じような設定は、Listingビューで右クリック→Processor Optionsにあります。
Thumbモードかどうか(IDAでいうT
)はTMode
が対応するようです。
まぁARMに限っては、ARMモードで逆アセンブル(デフォルトF11)とThumbモードで逆アセンブル(デフォルトF12)で解決しますが・・・
ブロックのrebaseはどこでやるの?
生バイナリでベースアドレスをミスった際にrebaseして解決することがありますが、操作が少し分かりにくくなっています。
Window→Memory Mapでブロックの一覧を開き、以下の画像の赤枠で囲った小さなボタン群で操作できます。
左から順に、以下のような機能になっています。
- ブロックを追加
- ブロックを別のアドレスに移動(rebase)
- ブロックを分割
- ブロックを上に伸ばす
- ブロックを下に伸ばす
- 2つのブロックを結合する
- ブロックを削除する
- イメージのベースアドレスを指定する
基本ブロックの後に改行が欲しい!
Edit→Tool Optionsでツール自体のオプションが開けます。
ここのListing Fields→Format Codeの「Lines After Basic Blocks」が基本ブロックの後に入れる改行の行数になります。
他ユーザでプロジェクトを開いたら怒られた!
デフォルトで専有プロジェクトになっているため、プロジェクトを作ったユーザで開かないと怒られます。
回避するには、プロジェクトのディレクトリにあるproject.prp
の以下の部分を書き換えると良いです。
<STATE NAME="OWNER" TYPE="string" VALUE="[ユーザ名]" />
共有プロジェクトにするには別途サーバが必要なようです。
逆コンパイラの性能どう?
ぶっちゃけ他の人があれこれ言っているところだと思うので今更だと思いますが・・・
とりあえずその辺にあったAndroidでDirty COWをやるときに使うプログラムのARMバイナリのmain
関数を以下のツールで逆コンパイルしてみました。
- Snowman
- Retdec
- Ghidra
お金持ちではないのでHex-Rays Decompilerのライセンスは持ってないです。
結果をここに置いておきます。
Snowmanが現時点でThumbに非対応なようなので、破滅したコードを吐いています・・・
使用感
結構いい感じです。無料でここまで使えるとなるといろいろ変わるかもしれないですね。
あとはスクリプト類がいろいろ出てきたりすれば使いやすくなると思います。