
Emulador de pcode multiarquitetura usando Ghidra/Sleigh para fuzzing com AFL++ de binários, firmware e alvos embarcados; detecta bugs de corrupção de memória via ASAN.

O Ghidralligator é um emulador de pcode multiarquitetura em C++ baseado na libsla do Ghidra, projetado para fuzzing com AFL++.
Ele permite realizar fuzzing baseado em emulação, mantendo um desempenho interessante ao lidar com binários executados em arquiteturas exóticas.
Sua natureza extensível torna fácil emular literalmente qualquer arquitetura (desde que você consiga escrever o arquivo de especificação Sleigh correspondente) para aplicar fuzzing em qualquer trecho arbitrário de código.
O Ghidralligator pode ser executado em sistemas Linux. Ele requer apenas uma versão do GCC que suporte C++ 17 (testado e funcionando com GCC versão 12.2.0).
As dependências do Ghidra estão embutidas no próprio projeto, no diretório "./src/".
Para instalar o Ghidralligator corretamente, você deve baixar e compilar o AFL++ da seguinte forma:
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
O Ghidralligator tem como objetivo preencher a lacuna entre os emuladores já existentes, que exigem muita configuração e modificações manuais para instrumentar, executar e aplicar fuzzing no binário, e os emuladores "caixa-preta", que dificilmente são extensíveis e não são adequados para aplicações específicas e incomuns.
Seu principal uso é na pesquisa de vulnerabilidades em binários de código fechado, especialmente ao visar aplicações/firmwares de dispositivos embarcados executados em arquiteturas exóticas.
O Ghidralligator é o sucessor do afl_ghidra_emu. Ele melhora consideravelmente a velocidade de execução e inclui recursos úteis como detecção de corrupção de memória na heap (ASAN).
Uma grande variedade de corrupções de memória pode ser detectada: operações de leitura/escrita fora dos limites, use-after-free, double-free, leitura de memória não inicializada, violações de acesso de leitura/escrita/execução...
Para executar o Ghidralligator, as seguintes etapas devem ser realizadas:
Para entender como usar o Ghidralligator, foi criado um exemplo de um programa vulnerável, compilado em diferentes arquiteturas.
Você pode executar run_examples.sh para ver os mecanismos de ASAN em ação.
O Ghidralligator vem com várias opções de linha de comando:
usage: ./ghidralligator [OPTION]
-h Print this help and exit.
-m [replay|fuzz] Specify an emulation strategy. [REQUIRED]
In 'replay' mode, the emulator will only launch the program once, exiting after a single loop.
In 'fuzz' mode, this program must be launched through AFL.
-c [FILENAME] Specify the emulator json configuration file to load. [REQUIRED]
-i [FILENAME] Specify a test-case file to insert during a replay session. [OPTIONAL]
-I Display info log (/!\ Slow down the emulation). [OPTIONAL]
-D Display debug and info log (/!\ Slow down the emulation). [OPTIONAL]
-t Store log in ./ghidraligator.log file. [OPTIONAL]
Uso para uma emulação padrão:
$ ./ghidralligator -m replay -c examples/x86/config.json -I -i examples/x86/input/normal_use_case.bin

Uso para uma sessão de fuzzing padrão com 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

O Ghidralligator pode emular código graças ao arquivo .sla (arquivo de definição de instruções Sleigh). Arquivos SLA fornecidos pela comunidade Ghidra podem estar parcialmente implementados. Para obter uma emulação consistente, os usuários podem precisar completar a definição da arquitetura Sleigh relacionada ou adicionar alguns hooks.
O Ghidralligator é baseado no Ghidra, que não foi projetado para ter alto desempenho em emulação. Portanto, não é capaz de competir com fuzzers clássicos como o afl_qemu em arquiteturas padrão (binários x86 Linux / Windows).
Como o projeto Ghidra está em constante evolução, não é recomendado atualizar manualmente as dependências do Ghidralligator para futuras versões do Ghidra. A ferramenta foi compilada e testada com os fontes do decompilador Ghidra 11.0.3. Ela pode quebrar com versões futuras, e a compatibilidade retroativa com versões anteriores à 11.0.3 não é suportada. Isso é transparente para o usuário, pois as dependências do Ghidra são fornecidas neste repositório.
O Ghidralligator é licenciado sob a licença Apache versão 2.0.
O código do Ghidralligator inclui código do projeto Ghidra da NationalSecurityAgency, licenciado sob a licença Apache 2.0.
O parser de arquivo de configuração do Ghidralligator inclui a biblioteca json C++ de Niels Lohmann, licenciada sob a licença MIT.
O módulo Ghidralligator inclui a biblioteca xxHash de Yann Collet, licenciada sob a Licença BSD de 2 Cláusulas.