
AFL + DynamoRIO = 소스 코드 없이 리눅스 바이너리를 퍼징하기
원본 AFL은 QEMU 모드를 사용한 블랙박스 커버리지 기반 퍼징을 지원합니다. 먼저 이 방법을 시도해보시고 작동하지 않으면 이 도구를 사용할 것을 권장합니다. 또한 Windows 및 Linux에서 블랙박스 바이너리 퍼징을 지원하는 Manul을 시도해볼 수 있습니다.
DRRUN_PATH를 drrun 실행 프로그램을 가리키도록 설정하고 LIBCOV_PATH를 libbinafl.so 커버리지 라이브러리를 가리키도록 지정해야 합니다. 또한 AFL의 포크 서버를 비활성화해야 하며 (AFL_NO_FORKSRV=1), 아마 AFL_SKIP_BIN_CHECK=1도 설정해야 합니다. 자세한 내용은 아래 빌드 섹션의 5단계를 참조하세요.
참고: 64비트 바이너리에는 64비트 DynamoRIO를, 32비트 바이너리에는 32비트 DynamoRIO를 사용해야 합니다. 그렇지 않으면 작동하지 않습니다. 타겟이 DynamoRIO에서 실행되고 있는지 확인하려면 다음 명령어를 사용하여 실행할 수 있습니다:
drrun -- <path/to/your/app/> <app_args>
계측 라이브러리는 Ivan Fratric이 만든 winAFL의 커버리지 라이브러리를 수정한 버전입니다.
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 ..
DynamoRIO 컴파일에 문제가 있으면 이 페이지를 확인하세요.
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 @@
afl_test의 경우 초당 25-30회 실행과 2-3분 내에 1개의 고유한 크래시가 발생할 것으로 예상됩니다.