
P-Code 解析を使用して Go バイナリの文字列定義を復元するスクリプト群です。 x86、x86-64、ARM、ARM64 でテストされています。
これらはスクリプトマネージャーの Golang カテゴリにあります。
GoDynamicStrings.java
GoFuncCallStrings.java
GoStaticStrings.java
GoKnownStrings.java
data/known_strings.json から読み込まれます。GoStringFiller.java
go.string.* のギャップを埋めます。ダイナミック文字列解析スクリプトには、特別なバリエーションがいくつかあります:
GoDynamicStringsSingle.java
GoDynamicStrings.java と同じ解析を実行しますが、単一のデコンパイラプロセスを使用します。バイナリの解析により並列デコンパイラプロセスがシステムメモリを使い果たす場合は、これを使用してください。GoDynamicStringsHigh.java
これはスクリプトマネージャーの PCode カテゴリにあります。
PrintHighPCode.java
これらのスクリプトを使用して Go バイナリの文字列定義を復元する一般的な流れは次のとおりです:
.rodata、.rdata、__rodata 内のすべての文字列を選択します。次に、コードリストで右クリックして "Clear Code Bytes" を選択します。GoKnownStrings.java を実行して、標準的な文字列をいくつか検出します。GoStaticStrings.java を実行します。GoFuncCallStrings.java を実行します (Golang バイナリのバージョンが Ghidra の組み込み Golang 機能でサポートされている場合)。GoDynamicStrings.java を実行します。GoStringFiller.java を実行します。
go.string.* ラベルを作成します。go.string.* に残っているギャップを確認し、明らかな開始点と終了点を持つ文字列を定義します。
GoStringFiller.java を最大限に活用するには、未定義の文字列データ内で文字列の長さが変わる箇所を特定し、その境界に最も近い文字列を定義します。その後、 を再実行すると、残りの未定義文字列の長さを正しく判定できる箇所が自動的に埋められます。Ghidra で:
GhidraDev プラグインを使用した Eclipse の場合:
Eclipse でビルド:
Gradle で直接ビルド:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>
Go プログラムのリバースエンジニアリングにおけるよく知られた問題として、Go 文字列には null 終端文字がないため、コンパイルされたバイナリから文字列定義を復元することが困難であることが挙げられます。Go プログラムの定数文字列値の多くは、コンパイルされたビルド内の 1 つの巨大なブロブにまとめて格納されており、ある文字列が終わり、別の文字列が始まる位置を示す終端文字は文字列データに組み込まれていません。"Hello world!" と出力するだけの単純なプログラムでさえ、Go ランタイムシステムやその他の標準ライブラリに関連する 1,500 を超える文字列が含まれています。このため、Ghidra が提供するような典型的な ASCII 文字列検出実装では、数万文字に及ぶ誤検知の文字列定義が作成される可能性があります。
Go は null 終端文字列の代わりに、ポインタと長さの値で構成される文字列構造を使用します。これらの文字列構造の多くは実行時にプログラムのスタック上に作成されるため、個々の文字列の開始位置と長さの値を復元するには、コンパイルされたマシンコードの解析が必要です。この解析を x86-64 命令の特定のパターンをチェックして実行する既存のスクリプトがいくつかありますが、それらは最終的にスタックに対して同じ効果を持つ未処理の命令バリエーションで作成された構造を見逃し、さらに特定の ISA に限定されています。
Ghostrings は、Ghidra のデコンパイラ解析によって生成される、アーキテクチャに依存しない簡略化された P-Code オペレーションを利用することで、これらの問題を両方とも回避します。
Copyright 2022 NCC Group. GPLv3 ライセンスのもとで公開されています(LICENSE を参照)。
プロジェクトの主著者: James Chambers [email protected]
GoStringFiller.java