
AFL + DynamoRIO = fuzzing de binários sem código-fonte no Linux
O AFL original suporta fuzzing guiado por cobertura em modo caixa-preta usando o modo QEMU. Eu recomendo fortemente tentá-lo primeiro e, se não funcionar, você pode tentar esta ferramenta. Além disso, você pode querer tentar o Manul que suporta fuzzing de binários em caixa-preta no Windows e Linux.
Você precisa especificar DRRUN_PATH para apontar para o launcher drrun e LIBCOV_PATH para apontar para a biblioteca de cobertura libbinafl.so. Você também precisa desativar o servidor fork do AFL (AFL_NO_FORKSRV=1) e provavelmente AFL_SKIP_BIN_CHECK=1. Veja o passo 5 na seção de compilação abaixo para mais detalhes.
NOTA: Não esqueça que você deve usar o DynamoRIO de 64 bits para binários de 64 bits e o DynamoRIO de 32 bits para binários de 32 bits, caso contrário não funcionará. Para ter certeza de que seu alvo está rodando sob o DynamoRIO, você pode executá-lo usando o seguinte comando:
drrun -- <path/to/your/app/> <app_args>
A biblioteca de instrumentação é uma versão modificada da biblioteca de cobertura do winAFL criada por Ivan Fratric.
git clone https://github.com/mxmssh/drAFL.git /home/max/drAFL
cd /home/max/drAFL
git clone https://github.com/DynamoRIO/dynamorio
mkdir build_dr
cd build_dr/
cmake ../dynamorio/
make -j
cd ..
Se você tiver problemas com a compilação do DynamoRIO, verifique esta página
mkdir build
cd build
cmake ../bin_cov/ -DDynamoRIO_DIR=../build_dr/cmake
make -j
cd ..
cd afl/
make
cd ..
cd build
mkdir in
mkdir out
echo "AAAA" > in/seed
export DRRUN_PATH=/home/max/drAFL/build_dr/bin64/drrun
export LIBCOV_PATH=/home/max/drAFL/build/libbinafl.so
export AFL_NO_FORKSRV=1
export AFL_SKIP_BIN_CHECK=1
../afl/afl-fuzz -m none -i in -o out -- ./afl_test @@
No caso do afl_test, você deve esperar 25-30 execuções/seg e 1 crash único em 2-3 minutos.