
Manul — это параллельный фаззер, управляемый покрытием, для бинарных файлов с открытым исходным кодом и чёрного ящика на Windows, Linux и MacOS.

Manul — это фаззер с отслеживанием покрытия, работающий параллельно, для бинарных файлов с открытым и закрытым исходным кодом на Windows, Linux и macOS (бета), написанный на чистом Python.
pip3 install psutil
git clone https://github.com/mxmssh/manul
cd manul
mkdir in
mkdir out
echo "AAAAAA" > in/test
python3 manul.py -i in -o out -n 4 "linux/test/test_afl @@"
sudo apt-get install gcc make git wget
git clone https://gitlab.com/akihe/radamsa.git && cd radamsa && make && sudo make install
Нет необходимости устанавливать radamsa на Windows, Manul распространяется с нативной библиотекой radamsa на этой платформе.
| CVE IDs | Продукт | Обнаруживший |
|---|---|---|
| CVE-2019-9631 CVE-2019-7310 CVE-2019-9959 | Poppler | Maksim Shudrak |
| CVE-2018-17019 CVE-2018-16807 CVE-2019-12175 | Bro/Zeek | Maksim Shudrak |
Если вам удалось найти новую ошибку с помощью Manul, пожалуйста, свяжитесь со мной, и я добавлю вас в список.

pip install pywin32) на платформе Windows (требуется только для режима постоянной работы DBI).В настоящее время Manul поддерживает два типа инструментирования: на основе AFL (afl-gcc, afl-clang и afl-clang-fast) и DBI.
Инструментируйте вашу цель с помощью afl-gcc или afl-clang-fast и Address Sanitizer (рекомендуется для лучших результатов). Например:
CC=afl-gcc CXX=afl-g++ CFLAGS=-fsanitize=address CXXFLAGS=-fsanitize=address cmake <путь_к_вашей_цели>
make -j 8
USE_ASAN=1 CC=afl-clang-fast CXX=afl-clang-fast++ cmake <путь_к_вашей_цели>
make -j 8
Подробнее см. эти инструкции.
В этом режиме вам не нужно инструментировать цель, но необходимо загрузить последнюю версию фреймворка DynamoRIO для Windows или Linux.
Manul распространяется с предварительно скомпилированными клиентами x86/x64 для Linux и Windows. Вы можете найти их в следующих папках:
linux/dbi_32|dbi_64/libbinafl.so (клиент DynamoRIO)
win/dbi_32|dbi_64/binafl.dll
К сожалению, DynamoRIO официально не поддерживается на MacOS.
Вы можете найти последние пакеты релизов DynamoRIO на странице загрузки DynamoRIO.
Вы должны раскомментировать следующие строки в файле manul.config и указать правильный путь к загрузчику и клиенту DynamoRIO.
# Выберите фреймворк DBI для предоставления покрытия обратно в Manul ("dynamorio" или "pin"). Пример dbi = dynamorio
dbi = dynamorio
# Если параметр dbi не None, необходимо указать путь к загрузчику DBI и клиенту DBI.
dbi_root = /home/max/DynamoRIO/bin64/drrun
dbi_client_root = /home/max/manul/linux/dbi_64/libbinafl.so
dbi_client_libs = None
Кроме того, вы можете повысить производительность вашей кампании фаззинга с закрытым исходным кодом, используя постоянный фаззинг в памяти. В этом режиме вы должны указать Manul инструментировать конкретную функцию (да, вам нужно найти её, дизассемблировав ваш бинарный файл), и он будет запускать её в цикле, раскомментировав следующие строки:
dbi_persistence_mode = 1
dbi_target_module = afl_test
dbi_target_method = open_file
#dbi_target_offset = 0x3198 # опционально можно указать смещение этой функции вместо имени
dbi_fuzz_iterations = 1000
Авторы winAFL предоставляют очень хорошее объяснение того, как это работает на самом деле здесь. Manul использует большую часть кода библиотеки инструментирования winAFL для связи с целью и её инструментирования.
ВАЖНОЕ ПРИМЕЧАНИЕ: Для фаззинга 32-битных бинарных файлов следует использовать 32-битный загрузчик и 32-битный клиент, а для 64-битных бинарных файлов — 64-битный загрузчик и 64-битный клиент!
Для компиляции библиотеки инструментирования необходимо использовать последнюю версию DynamoRIO. Исходный код библиотеки инструментирования можно найти в dbi_clients_src, расположенной в главной папке Manul.
64-битный Linux
cd dbi_clients_src
wget <DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz> - загрузите последнюю версию DynamoRIO
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz/cmake
make
32-битный Linux
cd dbi_clients_src
wget <DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz> - загрузите последнюю версию DynamoRIO
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
CFLAGS=-m32 CXXFLAGS=-m32 cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz/cmake
make
На Windows проще всего скомпилировать библиотеку, установив Visual Studio (протестировано на версиях 2017 и 2013), запустив Командная строка перекрестных средств VS20XX и выполнив следующие команды:
64-битная Windows
cd dbi_clients_src
<Загрузите и извлеките последнюю версию DynamoRIO>
mkdir client_64
cd client_64
cmake -G"Visual Studio 15 Win64" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (или просто Debug, если нужно)
32-битная Windows
cd dbi_clients_src
<Загрузите и извлеките последнюю версию DynamoRIO>
mkdir client_32
cd client_32
cmake -G"Visual Studio 15" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (или просто Debug, если нужно)
Manul изначально поддерживал фаззинг с отслеживанием покрытия с помощью Intel PIN, но из-за низкой производительности и высоких затрат на обслуживание эта возможность больше не поддерживается.
Наиболее часто используемые параметры можно указать через командную строку. Больше параметров поддерживается с помощью файла конфигурации (manul.config).
Пример: python3 manul.py -i corpus -o out_dir -n 40 "target @@"
positional arguments:
target_binary Целевой бинарный файл и параметры для выполнения (не забудьте заключить в кавычки, например "target e @@").
optional arguments:
-h, --help показать это справочное сообщение и выйти
-n NFUZZERS Количество параллельных фаззеров
-s Запустить слепой фаззинг (без инструментирования кода)
-c CONFIG Путь к файлу конфигурации с дополнительными параметрами (см. раздел Параметры файла конфигурации ниже)
-r Восстановить предыдущий сеанс
Required parameters:
-i INPUT Путь к каталогу с начальным корпусом
-o OUTPUT Путь к выходному каталогу