저번 시간에 AFL에 대한 정리를 했었는데,
이번에 AFL을 통해 unegg라는 프로그램을 실습해보고자 한다.
AFL setting
이미 afl 환경이 구축되어 있는 docker 내에서 실습을 진행한다.
unegg를 설치하고 AFL을 통해 실습을 진행한다.
/work/unegg/release-x64에서 make 를 수행하면 에러가 나온다.
getcwd 함수는 unistd.h 파일을 include 해야하는데 없나보다.
UnEgg.cpp 에 unstd.h를 include 한다.
make를 해주면 성공적으로 빌드가 된다. 그러나 자세히 보면 gcc 혹은 g++로 컴파일되는데, 이를 afl을 사용해주어야 한다.
따라서, gcc, g++ 부분을 afl-gcc, afl-g++로 변경하여야 한다.
#!/bin/bash
find . -type f -name '*.mk' -exec grep -l 'g++' {} \; | while read file
do
sed -i 's/g++/afl-g++/g' "$file"
done
#!/bin/bash
find . -type f -name '*.mk' -exec grep -l 'gcc' {} \; | while read file
do
sed -i 's/gcc/afl-gcc/g' "$file"
done
이를 위해서 .mk파일들에 있는 gcc, g++을 afl-gcc, afl-g++로 바꿔주는 쉘 스크립트를 작성한다.
makefile은 release-x64에만 있으므로, 그냥 수동으로 바꿔준다.
sudo chmod 777 replace_*
sudo ./replace_c.sh
sudo ./replace_cxx.sh
sudo make
모든 빌드에 대해 afl 컴파일이 잘 작동한다.
RUN AFL
이제 afl을 사용해보자.
sudo sysctl -w kernel.core_pattern=core
core 파일 생성을 설정해두어 afl이 확인하도록 한다.
input, output 디렉토리를 생성하고 input에 테스트할 a.egg를 둔다.
sudo afl-fuzz -i input -o output ./unegg @@
afl이 작동한다.
output 디렉토리에서는 이러한 파일들이 생겼다.
일반적인 상황에서는 잘 작동하지만
crash 디렉토리 내의 파일을 사용하면 segfault가 나타난다.
crash와 ASAN, 디버거를 통해 크래시를 분석하고 취약점을 찾을 수 있다.
각 크래시에 대한 code coverage 측정은 다른 도구를 써야하나보다..