Этот пример показывает фаззинг встраиваемого ПО архитектуры x86-64
на основе частичной эмуляции с помощью модифицированной QEMU и скриптов на языке Lua.
В поддиректории firmware находится тестируемое ПО (исходный и бинарный код).
В поддиректории testing - скрипты и материалы для запуска частичной эмуляции и фаззинга.
cd firmware
./build.sh
cd ..В ходе эмуляции выполняется функция func
Находясь в директории testing/, запустить скрипт ./fuzz.sh;
он принимает один аргумент - путь до fuzz_manager.
Запустить в другом терминале UI фаззера (укажите актуальные пути):
/path/to/crusher/bin_x86-64/ui --outdir /path/to/outКак только будут найдены аварийные завершения, значение поля unique_crashes (в окне UI - наверху справа) станет ненулевым.
Прервать фаззинг (в первом терминале, Ctrl + C).
В данном примере фаззер обнаруживает два уникальных аварийных завершения, соответствующие двум дефектам в ПО (см. исходный код).
Для запуска эмуляции - скрипт ./emulate.sh;
он принимает один аргумент - путь до исполняемого файла QEMU;
входные данные находятся в файле input.
QEMU x86-64: /path/to/crusher/bin_x86-64/QIT/QemuX64/qemu-system-x86_64
Записать найденные фаззером вх.данные ав.завершения (например, out/EAT_OUT/crashes/id_crash_0)
в файл input и запустить эмуляцию (как описано выше).
В случае ав.завершения, т.е. при возникновении исключения,
будет напечатана информация об этом исключении
(слово Exception, значения регистров в этот момент и т.п.)
Более подробное описание см. в документации.