Необходимо установить модуль частичной эмуляции DualEmu, см. раздел "Частичная эмуляция с помощью модуля DualEmu" в документации Crusher.
В этом примере это не используется, но в общем случае нужно в файле dump/dump_info.json
указать
полный путь до папки с rootfs для используемой архитектуры и ОС. rootfs можно найти в официальном
репозитории qiling.
В данной директории расположен основной учебный пример на тему частичной эмуляции на архитектуре ARM.
В поддиректории dump/firmware
находится тестируемое ПО - исходный код, а также скомпилированный
образ.
В данном примере будет проводиться фаззинг функции function
(test.c
). Через свои аргументы
функция получает доступ к буферу с входными данными, читает оттуда число, и при выполнении
определённых условий на число происходит аварийное завершение (разыменование нулевого указателя).
DSE поможет фаззеру пройти это сложное условие.
Начальная точка выполнения - вход в функцию function
. В данной директории уже есть дамп в этой
точке (dump
) - снимок начального состояния. Конечная точка выполнения - возврат из
функции function
. Образец входных данных (от фаззера или пользователя) нужно записать в буфер,
адрес которого можно получить из аргументов функции; в случае DSE нужно пометить все входные байты
символьно. В тестируемом коде есть вызов функции check_hardware
, которая иллюстрирует обработку
неэмулируемых фрагментов - её нужно заменить пользовательским обработчиком (просто возвращает true,
чтобы обеспечить дальнейшее выполнение).
Скрипт fuzz.sh
запускает фаззер. Также можно запустить эмуляцию без фаззера в одном из режимов -
qiling/angr:
/path/to/crusher/bin/python-3.9_x86_64/bin/python3 emu_script_dump.py <--qiling/--angr> -i in/input -o out