
Инструмент для фаззинга бинарных файлов с закрытым исходным кодом на основе Unicorn и LibFuzzer
uniFuzzer — это инструмент для фаззинга закрытых бинарных файлов, основанный на Unicorn и LibFuzzer. В настоящее время он поддерживает фаззинг 32-битных LSB ELF файлов на ARM/MIPS, которые обычно встречаются в IoT-устройствах.
.c в каталоге callback, который должен содержать следующие колбэки:void onLibLoad(const char *libName, void *baseAddr, void *ucBaseAddr): Вызывается каждый раз, когда зависимая библиотека загружается в Unicorn.int uniFuzzerInit(uc_engine *uc): Вызывается сразу после загрузки всех бинарных файлов в Unicorn. Здесь можно настроить стек/кучу/регистры.int uniFuzzerBeforeExec(uc_engine *uc, const uint8_t *data, size_t len): Вызывается перед каждым раундом выполнения фаззинга.int uniFuzzerAfterExec(uc_engine *uc): Вызывается после каждого раунда выполнения фаззинга.make и получите инструмент фаззинга с именем uf.uniFuzzer использует следующие переменные окружения в качестве параметров:
UF_TARGET: Путь к целевому ELF-файлуUF_PRELOAD: Путь к библиотеке предзагрузки. Убедитесь, что библиотека имеет ту же архитектуру, что и цель.UF_LIBPATH: Пути, в которых находятся зависимые библиотеки. Для разделения нескольких путей используйте :.Фаззинг можно запустить следующей командой:
UF_TARGET=<цель> [UF_PRELOAD=<предзагрузка>] UF_LIBPATH=<путь_к_библиотекам> ./uf
Предоставлена демонстрация для базового использования. Демонстрация содержит следующие файлы:
vuln(), которая уязвима к переполнению стека/кучи.printf() и упрощённые malloc()/free().vuln().Сначала установите gcc для mipsel (пакет gcc-mipsel-linux-gnu в Debian) для сборки демонстрации:
# целевой бинарный файл
# '-Xlinker --hash-style=sysv' указывает gcc использовать 'DT_HASH' вместо 'DT_GNU_HASH' для поиска символов,
# так как uniFuzzer в настоящее время не поддерживает 'DT_GNU_HASH'
mipsel-linux-gnu-gcc demo-vuln.c -Xlinker --hash-style=sysv -no-pie -o demo-vuln
# библиотека предзагрузки
mipsel-linux-gnu-gcc -shared -fPIC -nostdlib -Xlinker --hash-style=sysv demo-libcpreload.c -o demo-libcpreload.so
Или вы можете просто использовать файлы demo-vuln и demo-libcpreload.so, которые были скомпилированы с помощью указанных выше команд.
Затем запустите make для сборки uniFuzzer. Обратите внимание: если вы скомпилировали MIPS-демонстрацию самостоятельно, некоторые адреса могут отличаться от предварительно собранной, и demo-callback.c следует обновить соответствующим образом.
Наконец, убедитесь, что готова библиотека libc для MIPS. В Debian она находится в /usr/mipsel-linux-gnu/lib/ после установки пакета libc6-mipsel-cross. Именно это значение следует указать в UF_LIBPATH:
UF_TARGET=<путь к demo-vuln> UF_PRELOAD=<путь к demo-libcpreload.so> UF_LIBPATH=<путь к lib для MIPS> ./uf
Unicorn очищает JIT-кэш QEMU из-за этой проблемы, что замедляет скорость фаззинга, так как целевой бинарный файл приходится перекомпилировать JIT при каждом раунде выполнения.
Для повышения производительности мы можем закомментировать tb_flush(env);, как указано в той проблеме.
GNU_HASHIFUNC