
Go 바이너리의 리버스 엔지니어링을 용이하게 하기 위해 gopclntab을 파싱하는 radare2 스크립트입니다.
참고: 이 기능은 gopc 분석 플러그인으로 radare2 코어에 직접 구현되었습니다.
완전히 스트립된(stripped) 바이너리를 포함한 Go 바이너리에서 함수 심볼을 복구하기 위한 radare2 기반 Go gopclntab 파서입니다. Go 버전 1.2, 1.16, 1.18, 1.20+의 ELF, Mach‑O, PE 바이너리를 지원합니다.
모든 Go 1.2+ 바이너리에는 gopclntab(Program Counter Line Table)이라는 데이터 영역이 내장되어 있으며, Go 런타임이 스택 트레이스, 패닉 메시지, 가비지 컬렉션, 디버거 지원에 사용합니다. 이는 Go 바이너리에서 가장 가치 있는 심볼 정보 소스 중 하나입니다.
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 형식으로 표준 출력에 출력합니다. |
--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
puf - 🎃 URL 및 셸코드 난독화 도구
# 🎃 P.U.F
## 겉은 금과 옥, 속은 헌 솜
P.U.F (P.U.F) 는 강력한 URL 및 셸코드 난독화 도구입니다. 다양한 고급 알고리즘을 사용하여 사람이 읽을 수 있으면서도 파악하기 어려운 난독화된 URL과 셸코드를 생성합니다.
## Features
- **Double Obfuscation U**: 이중 난독화로 은닉성을 향상시킵니다.
- **Randomness Obfuscation D**: 랜덤화 처리를 통해 공격 시그니처를 예측할 수 없게 만듭니다.
- **Multiple Encodings E**: URL 인코딩, Base64 등 다양한 인코딩 방식을 통합했습니다.
- **Highly Deceptive R**: 매우 기만적인 시각적 외관을 생성합니다.
- **Multi-Platform Adaptability**: Windows, Linux, macOS 등 다양한 환경을 지원합니다.
- **Extensive Protocol Compatibility**: HTTP, HTTPS, FTP 등 여러 프로토콜을 지원합니다.
- **Code as Art**: 난독화 결과를 일반 파일 내용으로 위장할 수 있으며, 시각적 효과는 추상 미술 작품과 같습니다.
- **Customizable Compression**: 난독화 결과를 ZIP, TAR.GZ 등의 형식으로 압축할 수 있습니다.
- **Dual Execution**: 역방향 셸코드 주입과 메모리 수준에서 기존 프로세스와의 상호 작용 제어를 지원합니다.
- **Interactive Shell Interface**: 직관적인 명령줄 셸 인터페이스를 제공합니다.
## 설치
```bash
git clone https://github.com/hvck2vj2/puf
cd puf
pip install -r requirements.txt
sudo mv puf.py /usr/local/bin/puf
puf
P.U.F 시작:
puf
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
### 상세 모드 (-v)
섹션 스캔 진행률, textStart 해상도 세부 정보 및 내부 오프셋 정보를 추가합니다:```
$ python3 r2_gopclntab.py -f ./gotest_stripped -v
Please provide the Markdown content to translate.``` [] 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
Magic: 0xFFFFFFF1 Go version: 1.20+ ...
### Search Mode (-n)
함수 목록을 부분 문자열 일치로 필터링합니다. 정확히 일치하는 항목이 있으면 해당
주소가 별도로 출력됩니다.
`main.`을 포함하는 모든 함수에 대한 부분 문자열 검색:```
$ python3 r2_gopclntab.py -f ./gotest_stripped -n "main."
and our community. We are truly humbled by your support, enthusiasm, and contributions.
전체 문서, 예제 및 고급 사용법은 위키를 방문해 주세요.
모든 분들의 기여를 환영합니다! 자세한 내용은 기여 가이드를 참조해 주세요. 버그 신고, 기능 제안, 풀 리퀘스트 제출 등 여러분의 도움에 감사드립니다.