*p5.brush
p5.js 환경에서 자연스러운 텍스처를 탐구하는 아티스트·디자이너·취미자를 위한 다목적 라이브러리
Ghidra UI에서 바로 작동하는, angr와 Z3 기반 인터랙티브 심볼릭 실행 플러그인
Interactive symbolic execution plugin for Ghidra, powered by angr + Z3. Solve constraints, crack passwords, reverse algorithms — right from the Ghidra UI.
플러그인Python · JavaGitHub @overkazaf온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Interactive symbolic execution plugin for Ghidra, powered by angr + Z3.
Right-click an address, symbolize the input, click Solve — the plugin finds concrete values that make the program reach your target. Passwords, license keys, flag checkers, crypto parameters — if it's a constraint satisfaction problem, Ponce4Ghidra solves it.
Project Page — architecture diagrams, workflow guide, and SAT/SMT primer.
Constraints Tab — see how the solver derived the passwordREADME 전문 보기 ↗
Interactive symbolic execution plugin for Ghidra, powered by angr + Z3.
Right-click an address, symbolize the input, click Solve — the plugin finds concrete values that make the program reach your target. Passwords, license keys, flag checkers, crypto parameters — if it's a constraint satisfaction problem, Ponce4Ghidra solves it.
Project Page — architecture diagrams, workflow guide, and SAT/SMT primer.
1. Open test_crackme in Ghidra
2. Right-click 0x1000004d7 (return 1) → Set as Find Target
3. Right-click 0x100000484 (return 0) → Set as Avoid
4. Ponce4Ghidra → Symbolize argv[1] (size: 4)
5. Ponce4Ghidra → Solve Constraints
→ Solved: argv1 = P4Rg
Each constraint maps to a byte of the password: byte0 == 80 ('P'), byte1 == 52 ('4'), byte2 ^ 0x42 == 0x10 ('R'), byte3 + 0x20 == 0x87 ('g').
Multi-solution enumeration on test_license_elf: the solver found 5 valid license keys, all variants of K9mZ-4wR2-Xp7B-3nLf differing in the last byte.
Core
Analysis
Platform
UX
flowchart LR
A["🎯 Set Find/Avoid"] --> B["📝 Symbolize Input"]
B --> C["🔀 angr: Fork at Branches"]
C --> D["📋 Collect Constraints"]
D --> E["🧮 Z3: Solve Equations"]
E --> F["✅ P4Rg"]
Not brute force — a 16-byte input has 2¹²⁸ possibilities. The constraints reduce it to a system Z3 solves in seconds.
┌─────────────┐ JSON/TCP ┌──────────────────┐
│ Ghidra │ ◄────────────► │ angr Engine │
│ Plugin │ port 13370 │ (Python) │
│ (Java) │ │ │
│ │ commands: │ angr.Project │
│ Panel: │ init │ SimState │
│ Variables │ symbolize_* │ SimulationMgr │
│ Find/Avoid │ set_find/avoid│ explore() │
│ Results │ explore │ solver.eval() │
│ Constraints│ solve │ │
│ │ get_state │ Z3 SMT Solver │
│ Actions: │ get_constraints │
│ 8 menu │ replay │ Veritesting │
│ items │ set_options │ Unicorn (opt) │
└─────────────┘ └──────────────────┘
| Method | Use when |
|---|---|
| Symbolize argv[N] | Program reads input from command line. Binary is small/simple. |
| Symbolize Function Argument | You know which function checks the input. Binary is large/complex. Analyzing a .so library. Start here. |
| Symbolize Register | The unknown is a scalar (int/long), not a buffer. |
| Symbolize Memory | The unknown is at a known fixed memory address. |
Rule of thumb: start with Function Argument (faster, targeted). Use argv only when you need the whole program's execution context.
# 1. Create a Python venv with angr
python3 -m venv .venv
source .venv/bin/activate
pip install angr
# Optional: faster concrete execution
pip install unicorn
# 2. Build the Ghidra extension
export GHIDRA_INSTALL_DIR=/path/to/ghidra_11.4.3_PUBLIC
gradle buildExtension
# 3. Install in Ghidra
# Ghidra → File → Install Extensions → Add → select dist/*.zip
# Or manually unzip into ~/Library/ghidra/.../Extensions/
Option A — Let the plugin manage the engine (automatic): Just use the plugin. It starts the engine process when needed.
Option B — Start the engine manually (for development):
cd Ponce4Ghidra
PYTHONPATH=python python3 -m ponce4ghidra_engine -v
The plugin connects to whatever is already on port 13370.
# Run all tests (spawns engine instances on ports 13371+)
PYTHONPATH=python python3 test/test_engine.py
Tests:
| Binary | Format | Password/Key | Find | Avoid |
|---|---|---|---|---|
test_crackme | Mach-O x86_64 | P4Rg | 0x1000004d7 | 0x100000484 |
test_license | Mach-O x86_64 | K9mZ-4wR2-Xp7B-3nLf | 0x100000a38 | 0x100000a4f |
test_license_elf | ELF x86_64 (static) | K9mZ-4wR2-Xp7B-3nLf | 0x1017327 | 0x101731e |
Ponce4Ghidra uses symbolic execution — not brute force, not fuzzing.
if (input[0] == 'P') → byte0 == 0x50A 16-byte input has 2¹²⁸ possibilities. The constraints reduce it to a system Z3 solves in seconds.
See the SAT/SMT Primer for the full explanation with architecture diagrams.
MIT