Skip to content

NGRsoftlab/c_fuzz_workshop

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fuzzing json-parser

Реализация black box фаззера

Подготовка окружения и создание корпуса

  1. Клонируем репозиторий со всеми артефактами
git clone https://github.com/lenix123/bmstu_fuzz.git
cd bmstu_fuzz
  1. Собираем образ с подготовленным окружением. Потом запускаем на основе собранного образа контейнер:
docker build -t json_fuzz_img .
docker run -it --name="json_fuzz" -v "$(pwd)/artifacts:/home/fuzzer/artifacts" json_fuzz_img
  1. Собираем целевое приложение. Чтобы в будущем статически прилинковать библиотеку, можно удалить динамическую библиотеку.
cd /home/fuzzer/json-parser-1.1.0
./configure
make
  1. Копируем артефакты по фаззингу в рабочую директорию. Собираем наш тест:
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
  1. Подготавливаем начальный корпус (тесткейсы):
cd /home/fuzzer/json-parser-1.1.0/fuzz
mkdir corpus
cp ../tests/*.json corpus
  1. Прогоняем скомпилированный тест с корпусом
for filename in corpus/*; do ./json_parse < $filename; done

Добавляем мутатор

  1. Компилируем простой мутатор
cd /home/fuzzer/json-parser-1.1.0/fuzz
clang mutate.c -o mutate
  1. Запускаем тест с мутируемым корпусом
cd /home/fuzzer/json-parser-1.1.0/fuzz
./scripts/run_mutate.sh
  1. Устанавливаем radamsa мутатор
cd /home/fuzzer
git clone https://gitlab.com/akihe/radamsa.git
cd radamsa
make
make install
  1. Запускаем тест с мутируемым с помощью radamsa корпусом
cd /home/fuzzer/json-parser-1.1.0/fuzz
./scripts/run_radamsa.sh

ДОбавляем обработку падений

  1. Добавляем проверку на код возврата и запускаем тест:
cd /home/fuzzer/json-parser-1.1.0/fuzz
./scripts/radamsa_crash.sh

AFL++ фаззер

  1. Собираем целевое приложение с помощью afl++ компилятора
cd /home/fuzzer/json-parser-1.1.0
CC=afl-clang-lto ./configure
make
rm -f libjsonparser.so
  1. Собираем обёртку с afl++:
cd /home/fuzzer/json-parser-1.1.0/fuzz
afl-clang-lto json_parse.c -I.. -L.. -ljsonparser -lm -o json_parse
  1. Запускаем фаззинг:
afl-fuzz -i corpus/ -o out -- ./json_parse

Собираем покрытие

  1. Инструментируем целевую программу:
cd /home/fuzzer/json-parser-1.1.0
CC=clang CFLAGS="-fprofile-instr-generate -fcoverage-mapping" ./configure
  1. Компилируем обёртку
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
  1. Генерируем html отчёт
llvm-profdata merge default.profraw -o default.profdata
llvm-cov show cov_json_parse --instr-profile=default.profdata -format=html -output-dir=report
  1. Просматриваем отчёт о покрытии на хосте:
docker cp json_fuzz:/home/fuzzer/json-parser-1.1.0/fuzz/report .
open report/index.html

Добавляем санитайзеры

  1. Собираем с помощью скрипта build.sh целевую программу и обёртку с нужными санитайзерами:
cd /home/fuzzer/json-parser-1.1.0/fuzz
./build.sh
  1. Запускаем главный инстанс фаззера:
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
  1. Запускаем второстепенный инстанс с адресным санитайзером:
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
  1. Запускаем второстепенный инстанс с 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
  1. Узнаём статистику фаззинга по всем инстансам:
cd /home/fuzzer/json-parser-1.1.0/fuzz\
afl-whatsup out

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Shell 47.0%
  • C 33.9%
  • Dockerfile 19.1%