- Клонируем репозиторий со всеми артефактами
git clone https://github.com/lenix123/c_fuzz_workshop.git
cd c_fuzz_workshop- Собираем образ с подготовленным окружением. Потом запускаем на основе собранного образа контейнер:
docker build -t json_fuzz_img .
docker run -it --name="json_fuzz" -v "$(pwd)/artifacts:/home/fuzzer/artifacts" json_fuzz_img- Собираем целевое приложение. Чтобы в будущем статически прилинковать библиотеку, можно удалить динамическую библиотеку.
cd /home/fuzzer/json-parser-1.1.0
./configure
make
rm -f libjsonparser.so- Копируем артефакты по фаззингу в рабочую директорию. Собираем наш тест:
cd /home/fuzzer/json-parser-1.1.0 && mkdir fuzz && cd fuzz
cp -r /home/fuzzer/artifacts/* .
clang json_parse.c -I.. -L.. -ljsonparser -lm -o json_parse- Подготавливаем начальный корпус (тесткейсы):
cd /home/fuzzer/json-parser-1.1.0/fuzz
mkdir corpus
cp ../tests/*.json corpus- Прогоняем скомпилированный тест с корпусом
for filename in corpus/*; do ./json_parse < $filename; done- Компилируем простой мутатор
cd /home/fuzzer/json-parser-1.1.0/fuzz
clang mutate.c -o mutate- Запускаем тест с мутируемым корпусом
cd /home/fuzzer/json-parser-1.1.0/fuzz
./scripts/run_mutate.sh- Устанавливаем radamsa мутатор
cd /home/fuzzer
git clone https://gitlab.com/akihe/radamsa.git
cd radamsa
make
make install- Запускаем тест с мутируемым с помощью radamsa корпусом
cd /home/fuzzer/json-parser-1.1.0/fuzz
./scripts/run_radamsa.sh- Добавляем проверку на код возврата и запускаем тест:
cd /home/fuzzer/json-parser-1.1.0/fuzz
./scripts/radamsa_crash.sh- Собираем целевое приложение с помощью afl++ компилятора
cd /home/fuzzer/json-parser-1.1.0
make clean
CC=afl-clang-lto ./configure
make && rm -f libjsonparser.so- Собираем обёртку с afl++:
cd /home/fuzzer/json-parser-1.1.0/fuzz
afl-clang-lto json_parse.c -I.. -L.. -ljsonparser -lm -o json_parse- Запускаем фаззинг:
afl-fuzz -i corpus/ -o out -- ./json_parse- Инструментируем целевую программу:
cd /home/fuzzer/json-parser-1.1.0
make clean
CC=clang CFLAGS="-fprofile-instr-generate -fcoverage-mapping" ./configure
make && rm -f libjsonparser.so- Компилируем обёртку
cd /home/fuzzer/json-parser-1.1.0/fuzz
clang -fprofile-instr-generate -fcoverage-mapping json_parse.c -I.. -L.. -ljsonparser -lm -o cov_json_parse
for filename in out/default/queue/*; do cat $filename | ./cov_json_parse; done- Генерируем html отчёт
llvm-profdata merge default.profraw -o default.profdata
llvm-cov show cov_json_parse --instr-profile=default.profdata -format=html -output-dir=report- Просматриваем отчёт о покрытии на хосте:
docker cp json_fuzz:/home/fuzzer/json-parser-1.1.0/fuzz/report .
open report/index.html- Собираем с помощью скрипта
build.shцелевую программу и обёртку с нужными санитайзерами:
cd /home/fuzzer/json-parser-1.1.0/fuzz
./scripts/build.shДалее в отдельном окне на хосте создаём отдельные сессии для tmux.
2. Запускаем главный инстанс фаззера:
tmux new -s main
docker exec -it json_fuzz /bin/bash
cd /home/fuzzer/json-parser-1.1.0/fuzz
afl-fuzz -M main -i corpus -o out -- ./afl_fuzz- Запускаем второстепенный инстанс с адресным санитайзером:
tmux new -s asan
docker exec -it json_fuzz /bin/bash
cd /home/fuzzer/json-parser-1.1.0/fuzz
afl-fuzz -S asan -i corpus -o out -- ./asan_fuzz- Запускаем второстепенный инстанс с UBSAN санитайзером:
tmux new -s ubsan
docker exec -it json_fuzz /bin/bash
cd /home/fuzzer/json-parser-1.1.0/fuzz
afl-fuzz -S ubsan -i corpus -o out -- ./ubsan_fuzz- Узнаём статистику фаззинга по всем инстансам:
cd /home/fuzzer/json-parser-1.1.0/fuzz\
afl-whatsup out