
Ghidra/Sleigh 기반 다중 아키텍처 pcode 에뮬레이터로, 바이너리, 펌웨어 및 임베디드 대상에 대한 AFL++ 퍼징을 지원하며 ASAN을 통해 메모리 손상 버그를 탐지합니다.

Ghidralligator는 Ghidra libsla 기반의 C++ 다중 아키텍처 pcode 에뮬레이터로, AFL++를 이용한 퍼징을 위해 설계되었습니다.
이 도구는 이국적인 아키텍처에서 실행되는 바이너리를 다룰 때 흥미로운 성능을 유지하면서 에뮬레이션 기반 퍼징을 수행할 수 있게 해줍니다.
확장 가능한 구조 덕분에 사실상 모든 아키텍처를 에뮬레이션할 수 있으며(해당 Sleigh 사양 파일을 작성할 수만 있다면) 임의의 코드 조각을 퍼징할 수 있습니다.
Ghidralligator는 Linux 시스템에서 실행할 수 있습니다. C++ 17 버전을 지원하는 GCC 버전만 있으면 됩니다(GCC 12.2.0에서 테스트 및 작동 확인됨).
Ghidra 종속성은 "./src/" 디렉토리 아래 프로젝트 자체에 포함되어 있습니다.
Ghidralligator를 제대로 설치하려면 AFL++를 다운로드하여 컴파일해야 합니다:
git clone https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus
make distrib
sudo make install
git clone https://github.com/airbus-cyber/ghidralligator
cd ghidralligator
make ghidralligator
Ghidralligator는 바이너리를 계측(instrument), 실행, 퍼징하기 위해 많은 설정과 수동 수정이 필요한 기존 에뮬레이터와, 확장이 어렵고 특정하고 비일반적인 애플리케이션에 적합하지 않은 "블랙박스" 에뮬레이터 사이의 격차를 메우는 것을 목표로 합니다.
주 용도는 클로즈드 소스 바이너리의 취약점 연구이며, 특히 이국적인 아키텍처에서 실행되는 임베디드 디바이스 애플리케이션/펌웨어를 대상으로 할 때 유용합니다.
Ghidralligator는 afl_ghidra_emu의 후속작입니다. 실행 속도를 크게 개선했으며 힙 메모리 손상 탐지(ASAN)와 같은 유용한 기능을 포함합니다.
다양한 메모리 손상을 탐지할 수 있습니다: 경계를 벗어난 읽기/쓰기 작업, use-after-free, double-free, 초기화되지 않은 메모리 읽기, 읽기/쓰기/실행 접근 위반 등...
Ghidralligator를 실행하려면 다음 단계를 수행해야 합니다:
Ghidralligator 사용법을 이해하기 위해 서로 다른 아키텍처로 컴파일된 취약한 프로그램의 예제가 준비되어 있습니다.
run_examples.sh를 실행하여 ASAN 메커니즘이 동작하는 것을 확인할 수 있습니다.
Ghidralligator는 여러 명령줄 옵션을 제공합니다:
usage: ./ghidralligator [OPTION]
-h 도움말을 출력하고 종료합니다.
-m [replay|fuzz] 에뮬레이션 전략을 지정합니다. [필수]
'replay' 모드에서 에뮬레이터는 프로그램을 한 번만 실행하며, 단일 루프 후 종료됩니다.
'fuzz' 모드에서는 이 프로그램이 AFL을 통해 실행되어야 합니다.
-c [FILENAME] 로드할 에뮬레이터 json 구성 파일을 지정합니다. [필수]
-i [FILENAME] 리플레이 세션 중에 삽입할 테스트 케이스 파일을 지정합니다. [선택]
-I 정보 로그 표시 (/!\ 에뮬레이션 속도 저하). [선택]
-D 디버그 및 정보 로그 표시 (/!\ 에뮬레이션 속도 저하). [선택]
-t 로그를 ./ghidraligator.log 파일에 저장합니다. [선택]
표준 에뮬레이션 사용법:
$ ./ghidralligator -m replay -c examples/x86/config.json -I -i examples/x86/input/normal_use_case.bin

표준 AFL++ 퍼징 세션 사용법:
mkdir afl_inputs afl_outputs
echo -n "AAAAAA" > ./afl_inputs/input.bin
$ AFL_SKIP_BIN_CHECK=1 afl-fuzz -D -i ./afl_inputs -o ./afl_outputs/ -- ./ghidralligator -m fuzz -c examples/x86/config.json

Ghidralligator는 .sla 파일(Sleigh 명령어 정의 파일) 덕분에 코드를 에뮬레이션할 수 있습니다. Ghidra 커뮤니티에서 제공하는 SLA 파일은 부분적으로 구현되어 있을 수 있습니다. 일관된 에뮬레이션을 얻으려면 사용자가 관련 sleigh 아키텍처 정의를 완성하거나 몇 가지 훅을 추가해야 할 수 있습니다.
Ghidralligator는 에뮬레이션 목적을 위해 높은 성능을 갖도록 설계되지 않은 Ghidra를 기반으로 합니다. 따라서 표준 아키텍처(x86 linux / windows 바이너리)에서 afl_qemu와 같은 기존 퍼저와 경쟁할 수 없습니다.
Ghidra 프로젝트는 지속적으로 진화하고 있으므로 향후 Ghidra 버전을 위해 Ghidralligator 종속성을 수동으로 업데이트하는 것은 권장되지 않습니다. 이 도구는 Ghidra 11.0.3 디컴파일러 소스로 빌드 및 테스트되었습니다. 향후 버전에서 깨질 수 있으며, 11.0.3 미만 버전과의 하위 호환성은 지원되지 않습니다. Ghidra 종속성은 이 저장소에 포함되어 있으므로 사용자에게는 투명합니다.
Ghidralligator는 Apache 라이선스 버전 2.0에 따라 배포됩니다.
Ghidralligator 코드는 NationalSecurityAgency의 Ghidra 프로젝트 코드를 포함하며, Apache 라이선스 2.0에 따라 배포됩니다.
Ghidralligator 구성 파일 파서는 Niels Lohmann의 C++ json 라이브러리를 포함하며, MIT 라이선스에 따라 배포됩니다.
Ghidralligator 모듈은 Yann Collet의 xxHash 라이브러리를 포함하며, BSD 2-Clause License에 따라 배포됩니다.