
注意: この機能は radare2 のコアに直接実装され、gopc analysis plugin として提供されています。
radare2ベースのGo gopclntab パーサーで、完全にストリップされたものを含むGoバイナリから関数シンボルを復元します。ELF、Mach-O、PEバイナリをサポートし、Goバージョン1.2、1.16、1.18、1.20+に対応しています。
Go 1.2以降のすべてのバイナリには、gopclntab(Program Counter Line Table)と呼ばれるデータ領域が埋め込まれており、Goランタイムがスタックトレース、パニックメッセージ、ガベージコレクション、デバッガサポートに使用します。これはGoバイナリにおける最も貴重なシンボル情報源の1つです。
r2gopclntabParserは、radare2を介してこの領域を読み取り、バージョン固有の構造を解析し、復元された関数リスト(アドレス、ソースファイル、行番号を含む)を表示するか、復元された名前を関数定義、フラグ、コメントとして開いているradare2セッションに適用します。
| 依存関係 | 最小バージョン |
|---|---|
| Python 3 | 3.8+ |
| radare2 | 5.0+ (6.0.9でテスト済み) |
| r2pipe | 任意 |
他のPythonパッケージは不要です。スクリプトは標準ライブラリ(struct, json, argparse, os, sys)とr2pipeのみを使用します。
python3 r2_gopclntab.py -f ./mybinary -l
python3 r2_gopclntab.py -f ./mybinary -n main.main
python3 r2_gopclntab.py -f ./mybinary -v -l
python3 r2_gopclntab.py -f ./mybinary --apply
python3 r2_gopclntab.py -f ./mybinary --json
#!pipe python3 r2_gopclntab.py --r2pipe --apply -v
## CLIリファレンス```
usage: r2_gopclntab.py [-h] [-f FILE] [-n FUNCNAME] [-v] [-l]
[--apply] [--json] [--files] [--r2pipe]
| フラグ | 説明 |
|---|---|
-f FILE, --file FILE | 解析するGoバイナリへのパス。スクリプトは独自のr2インスタンスを起動します。 |
--r2pipe | 既に実行中のr2セッションにアタッチします(r2コンソール内で使用する場合)。 |
| フラグ | 説明 |
|---|---|
-l, --list | 復元されたすべての関数をそのアドレスとともに表示します。 |
-n NAME, --funcname NAME | 名前に NAME を含む関数のみを表示します(部分一致)。完全一致がある場合、そのアドレスは個別に表示されます。 |
-v, --verbose | 進行状況メッセージ、解析済みヘッダーフィールド、内部オフセットを表示します。 |
--apply | 復元された関数名をradare2セッションに関数定義(af+)として書き込み、go.フラグスペースにフラグを追加し、元のGo名とソース位置をコメントとして追加します。 |
--json | ヘッダーと完全な関数リストをJSONとしてstdoutに出力します。 |
--files | ファイルテーブルから抽出されたソースファイルパスのリストを表示します。 |
-h, --help | ヘルプメッセージを表示します。 |
フラグは自由に組み合わせることができます。出力フラグが指定されていない場合、デフォルトの動作はヘッダーと完全な関数リストを表示することです。
以下の例はすべて、ストリップされたGo 1.26 Mach-O arm64バイナリ(-ldflags="-s -w" でビルド)に対して実行されました。テストプログラムは main.main、main.fibonacci、main.helloWorld、main.addNumbers を定義しています。コンパイラは helloWorld と addNumbers をインライン化したため、これらはgopclntabに現れません。
フラグなし(または -f のみ)で実行すると、解析されたヘッダーに続いて完全な関数テーブルが表示されます。```
$ python3 r2_gopclntab.py -f ./gotest_stripped
(このチャンクは空です。翻訳するテキストがありません。)```
============================================================
Go pclntab Header
============================================================
Magic: 0xFFFFFFF1
Go version: 1.20+
Pointer size: 8
Min LC (quantum):4
Num functions: 2030
Num files: 261
funcnameOffset: 0x48
cuOffset: 0x14D20
filetabOffset: 0x158D8
pctabOffset: 0x19A98
pclnOffset: 0x55E40
============================================================
ADDRESS FUNCTION NAME
----------------------------------------------------------------------
0x100001000 go:buildid
0x100001070 internal/abi.BoundsDecode (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/bounds.go:86)
0x100001150 internal/abi.NoEscape (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/escape.go:19)
0x100001160 internal/abi.Kind.String (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:143)
0x1000011E0 internal/abi.TypeOf (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:181)
0x1000011F0 internal/abi.(*Type).ExportedMethods (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:453)
...
0x1000A0BB0 main.fibonacci (/tmp/gotest/main.go:13)
0x1000A0C20 main.main (/tmp/gotest/main.go:20)
0x1000A0D20 go:textfipsstart
0x1000A0D30 go:textfipsend
[+] 2030 function(s) shown
セクションスキャンの進行状況、textStartの解決詳細、および内部オフセット情報を追加します。``` $ python3 r2_gopclntab.py -f ./gotest_stripped -v
| DetectorChecker | マルウェアやステガノグラフィを検出するための強力なツールを提供します。 | | PulseDive | オープンソースの脅威インテリジェンスプラットフォームです。 |
[*] Running radare2 analysis...
[*] Binary format: mach0, endian: little, arch: arm, bits: 64
[*] Scanning binary for gopclntab magic bytes...
[*] Scanning section '0.__TEXT.__text' (0x100001000, 0x9FD44)...
[*] Scanning section '1.__TEXT.__symbol_stub1' (0x1000A0D60, 0x2B8)...
[*] Scanning section '2.__TEXT.__rodata' (0x1000A1020, 0xACC2)...
[*] Scanning section '3.__TEXT.__gopclntab' (0x1000ABCE8, 0xA48AE)...
[*] Found magic at vaddr=0x1000ABCE8
[*] Parsed header: PcHeader(magic=0xFFFFFFF1, version=1.20+, ptrSize=8, minLC=4,
nfunc=2030, nfiles=261, textStart=0x0)
[*] textStart is 0, using .text section vaddr: 0x100001000
[*] Parsed 2030 functions
============================================================
Go pclntab Header
============================================================
Magic: 0xFFFFFFF1
Go version: 1.20+
...
```
### 検索モード (-n)
関数リストを部分文字列一致でフィルタリングします。完全一致が存在する場合、そのアドレスが別途表示されます。
部分文字列検索で `main.` を含むすべての関数:```
$ python3 r2_gopclntab.py -f ./gotest_stripped -n "main."
```
インストール方法
以下のコマンドでインストールできます:
```
yum install -y feroxbuster
```
またはDockerを使用:
```
docker pull feroxbuster/feroxbuster
0x100041920 runtime.main.func2 (/opt/homebrew/Cellar/go/1.26.1/libexec/src/runtime/proc.go:207) 0x10006CE30 runtime.main.func1 (/opt/homebrew/Cellar/go/1.26.1/libexec/src/runtime/proc.go:174) 0x1000A0BB0 main.fibonacci (/tmp/gotest/main.go:13) 0x1000A0C20 main.main (/tmp/gotest/main.go:20)
[+] 4 function(s) shown (filtered from 2030 total)
完全一致検索:```
$ python3 r2_gopclntab.py -f ./gotest_stripped -n "main.fibonacci"
リソース説明: このリソースはセキュリティ状況を調査し、重大な脆弱性を特定し、特定の設定ミスやCVE IDに対する概念実証を示します。適切なセキュリティ構成の重要性を強調し、セキュリティ原則の理解を検証する役割を果たします。
シナリオは現実的: ラボ環境は、実際のペネトレーションテスト業務で遭遇する実世界の構成、ネットワーク、脆弱性を反映するように設計されています。
チャレンジを求める方: このラボは単なるウォークスルーにとどまらず、スキル、批判的思考、問題解決能力を必要とすることを目指しています。
学ぶことがある: クライアントが意図的にサービスを誤設定し、バイパスされるセキュリティ機構を設定しているため、ラボではポストエクスプロイテーションの機会が提供されます。