- Клонируем репозиторий со всеми артефактами
git clone https://github.com/lenix123/bmstu_fuzz.git
cd bmstu_fuzz
- Собираем образ с подготовленным окружением. Потом запускаем на основе собранного образа контейнер:
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
- Копируем артефакты по фаззингу в рабочую директорию. Собираем наш тест:
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
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
CC=clang CFLAGS="-fprofile-instr-generate -fcoverage-mapping" ./configure
- Компилируем обёртку
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
./build.sh
- Запускаем главный инстанс фаззера:
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