
FLARE 팀이 개발한 Ghidra에 Python 3 스크립팅 기능을 추가하는 오픈소스 확장 프로그램입니다.
Ghidrathon은 Ghidra에 Python 3 스크립팅 기능을 추가하는 Ghidra 확장 프로그램입니다. 왜일까요? Ghidra는 기본적으로 Java와 Jython으로 스크립팅을 지원합니다. 불행히도 capa, Unicorn Engine, angr 등 많은 오픈소스 분석 도구가 Python 3로 작성되어 있어 Ghidra에서 이러한 도구를 사용하기 어렵고, 경우에 따라서는 불가능합니다. 더욱이 보안 커뮤니티는 IDA Pro나 Binary Ninja 같은 다른 SRE 프레임워크를 위한 훌륭한 플러그인을 여러 개 발표했지만, 이들 중 상당수가 Python 3를 사용하기 때문에 Ghidra로 포팅하기 어렵습니다. Ghidrathon을 사용하면 Ghidra에서 기존 Python 3 도구를 사용하고 새로운 도구를 개발할 수 있으며, Ghidra의 UI와 긴밀하게 통합되는 방식으로 최신 Python을 사용하여 Ghidra를 스크립팅할 수 있습니다. 또한 Jython을 통해 구현된 기존 Python 2.7 확장을 대체합니다. 여기에는 대화형 인터프리터 창, Ghidra Script Manager 통합, Ghidra headless 모드에서의 스크립트 실행이 포함됩니다.

Ghidra용 Python 3 스크립트 작성 방법을 자세히 살펴보려면 여기에 있는 Ghidra Python 3 스크립트 예제를 확인하세요.
다음을 확인하세요:
다음 단계에 따라 Ghidra 환경에 Ghidrathon을 설치하세요:
$ python -m pip install -r requirements.txt
$ python ghidrathon_configure.py <absolute_path_to_ghidra_install_dir>
참고: ghidrathon_configure.py는 기본적으로 <absolute_path_to_ghidra_install_dir>에 ghidrathon.save라는 파일을 쓰려고 시도합니다. ghidrathon_configure.py와 Ghidra를 실행하기 전에 GHIDRATHON_SAVE_PATH 환경 변수를 설정하여 이 파일이 기록되는 경로를 지정할 수 있습니다:
$ export GHIDRATHON_SAVE_PATH="/path/to/custom/dir" # Linux/MacOS
$ set GHIDRATHON_SAVE_PATH="C:\path\to\custom\dir" # Windows
참고: JAVA_HOME이라는 환경 변수를 설정하라는 메시지가 표시될 수 있습니다. 이 변수는 Ghidra 설치를 위해 구성한 JDK의 절대 경로를 가리켜야 합니다.
.zip)을 Ghidra에 설치합니다:
File > Install Extensions...로 이동합니다.+ 버튼을 클릭합니다..zip)으로 이동합니다.Ok를 클릭합니다.Extension Version Mismatch 창이 표시되면 Install Anyway를 선택합니다..zip)을 <absolute_path_to_ghidra_install_dir>\Ghidra\Extensions에 압축을 풉니다.새 Python 인터프리터로 2단계를 실행하면 Ghidrathon이 다른 Python 인터프리터를 사용하도록 전환할 수 있습니다.
가상 환경에서 2단계를 실행하면 Ghidrathon과 함께 Python 가상 환경을 사용할 수 있습니다. 다른 가상 환경으로 전환하려면 새 가상 환경에서 2단계를 실행하기만 하면 됩니다.
인터프리터 창은 Python 3 인터프리터에 대한 대화형 액세스를 제공합니다. 인터프리터 창을 열려면 "Window"를 클릭하고 "Ghidrathon"을 선택하세요.

Ghidrathon은 Ghidra Script Manager와 직접 통합되어 Ghidra 내에서 Python 3 스크립트를 생성, 편집, 실행할 수 있게 해줍니다. 새 Python 3 스크립트를 만들려면 "Create New Script"를 클릭하고 "Python 3"를 선택하세요. Python 3 스크립트를 실행하려면 "Run Script" 또는 "Run Editors's Script"를 클릭하고 Ghidra Console 창에서 스크립트 출력을 확인하세요.

Ghidrathon을 사용하면 Ghidra headless 모드에서 Python 3 스크립트를 실행할 수 있습니다. Ghidra 설치 폴더에 있는 analyzeHeadless 스크립트를 실행하고 Python 3 스크립트를 지정한 다음 콘솔 창에서 스크립트 출력을 확인하세요.
$ analyzeHeadless C:\Users\wampus example -process example.o -postScript ghidrathon_example.py
[...]
INFO SCRIPT: C:\Users\wampus\.ghidra\.ghidra_10.0.3_PUBLIC\Extensions\Ghidrathon-master\ghidra_scripts\ghidrathon_example.py (HeadlessAnalyzer)
Function _init @ 0x101000: 3 blocks, 8 instructions
Function FUN_00101020 @ 0x101020: 1 blocks, 2 instructions
Function __cxa_finalize @ 0x101040: 1 blocks, 2 instructions
Function printf @ 0x101050: 1 blocks, 2 instructions
Function _start @ 0x101060: 1 blocks, 13 instructions
Function deregister_tm_clones @ 0x101090: 4 blocks, 9 instructions
Function register_tm_clones @ 0x1010c0: 4 blocks, 14 instructions
Function __do_global_dtors_aux @ 0x101100: 5 blocks, 14 instructions
[...]
INFO REPORT: Post-analysis succeeded for file: /example.o (HeadlessAnalyzer)
INFO REPORT: Save succeeded for processed file: /example.o (HeadlessAnalyzer)
Ghidra를 headless 모드로 실행하는 방법에 대한 자세한 내용은 <absolute_path_to_ghidra_install_dir>/support/analyzeHeadlessREADME.html을 확인하세요.
Ghidrathon 개발의 가장 큰 동기 중 하나는 Ghidra에서 타사 Python 3 모듈을 사용할 수 있게 하는 것이었습니다. 일반적인 Python 환경에서와 마찬가지로 모듈을 설치하고 Ghidra 내부에서 사용할 수 있습니다. 이는 이전에 설치한 모듈에도 적용됩니다. 예를 들어 Unicorn을 설치하여 Ghidra 내부에서 ARM 코드를 에뮬레이션할 수 있습니다.

Ghidrathon은 Ghidra의 Java 및 Jython 확장과 매우 유사한 스크립팅 환경을 제공합니다. 여기에는 GhidraScript 상태 인스턴스 변수(예: currentProgram)와 FlatProgramAPI 메서드(예: findBytes)를 Python builtins 범위에서 사용할 수 있게 하는 것이 포함됩니다. 즉, 코드에서 import하는 모든 Python 모듈이 이러한 변수와 메서드에 접근할 수 있습니다. Ghidrathon은 GhidraScript 상태 변수를 직접 접근하는 대신 Python 함수 호출로 노출한다는 점에서 Ghidra의 Java 및 Jython 확장과 약간 다릅니다. 예를 들어 Python 3 코드는 currentProgram() 함수 호출을 사용하여 currentProgram에 접근해야 합니다. 이 작은 변경은 실행 중에 Python 3 코드에 올바른 GhidraScript 상태 변수가 제공되도록 보장합니다. Ghidra용 Python 3 스크립트 작성에 대해 자세히 알아보려면 여기에 있는 Ghidra Python 3 스크립트 예제를 참조하세요.
Ghidrathon은 오픈소스 프로젝트 Jep을 사용하여 로컬 Python 설치를 Ghidra에 연결합니다. 기본적으로 로컬 Python 인터프리터가 Ghidra 내부에서 실행되며 모든 Python 패키지 및 표준 Ghidra 스크립팅 API에 접근할 수 있습니다. Ghidrathon은 Python 가상 환경에서도 작동하므로 Ghidra에서만 사용하려는 패키지를 만들고, 격리하고, 관리하는 데 도움이 됩니다. Ghidrathon은 로컬 Python 설치를 사용하므로 Ghidra 내부에서 실행되는 Python 버전과 환경을 제어할 수 있습니다.
Jep이 Java에 Python을 임베딩하는 방식에 대한 자세한 내용은 여기에 있는 문서를 참조하세요.
Ghidrathon은 JVM에 Python을 임베딩하기 위해 Java Native Interface(JNI)를 사용하는 오픈소스 라이브러리 Jep을 사용합니다. Ghidra 개발자들은 여기에서 논의된 이유로 Ghidra에서 JNI 사용을 권장하지 않습니다.
| 도구 | 버전 | 출처 |
|---|
| Ghidrathon | >= 4.0.0 | https://github.com/mandiant/Ghidrathon/releases |
| Python | >= 3.8.0 | https://www.python.org/downloads |
| Jep | == 4.2.0 | https://pypi.org/project/jep |
| Ghidra | >= 10.3.2 | https://github.com/NationalSecurityAgency/ghidra/releases |
| Java | >= 17.0.0 | https://adoptium.net/temurin/releases |