
Manul هو مفزر متوازي موجه بالتغطية للثنائيات مفتوحة المصدر والصندوق الأسود على أنظمة Windows و Linux و MacOS.

مانول هو مدمج موازٍ موجه بالتغطية للتطبيقات مفتوحة المصدر ومغلقة المصدر على ويندوز ولينكس وماك أو إس (نسخة تجريبية) مكتوب بلغة بايثون النقية.
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 على ويندوز، حيث يتم توزيع مانول مع المكتبة الأصلية لـ radamsa على هذا النظام الأساسي.
| معرفات CVE | المنتج | المكتشف |
|---|---|---|
| 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 |
إذا تمكنت من العثور على خطأ جديد باستخدام مانول، فيرجى الاتصال بي وسأضيفك إلى القائمة.

pip install pywin32) على ويندوز (مطلوب لوضع استمرارية DBI فقط).حاليًا، يدعم مانول نوعين من التجهيز: القائم على 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 <path_to_your_target>
make -j 8
USE_ASAN=1 CC=afl-clang-fast CXX=afl-clang-fast++ cmake <path_to_your_target>
make -j 8
راجع هذه التعليمات لمزيد من التفاصيل.
لا تحتاج إلى تجهيز هدفك في هذا الوضع ولكن تحتاج إلى تنزيل أحدث إصدار من إطار DynamoRIO لويندوز أو لينكس.
يتم توزيع مانول مع عملاء مُجمَّعين مسبقًا لويندوز ولينكس بتقنيتي x86/x64. يمكنك العثور عليهم في المجلدات التالية:
linux/dbi_32|dbi_64/libbinafl.so (عميل DynamoRIO)
win/dbi_32|dbi_64/binafl.dll
لسوء الحظ، DynamoRIO غير مدعوم رسميًا على ماك أو إس.
يمكنك العثور على حزم إصدار DynamoRIO الأحدث على صفحة تحميل DynamoRIO.
يجب إلغاء تعليق الأسطر التالية في ملف manul.config وتقديم المسار الصحيح لمشغل DynamoRIO وعميله.
# اختر إطار DBI لتوفير التغطية لمانول ("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
بالإضافة إلى ذلك، يمكنك زيادة أداء حملة التدمير مغلقة المصدر باستخدام التدمير المستمر في الذاكرة. في هذا الوضع، يجب توجيه مانول لتجهيز دالة معينة (نعم، تحتاج إلى العثور عليها عن طريق فك تجميع ثنائيك) وسيقوم بتشغيلها في حلقة عن طريق إلغاء تعليق الأسطر التالية:
dbi_persistence_mode = 1
dbi_target_module = afl_test
dbi_target_method = open_file
#dbi_target_offset = 0x3198 # اختياريًا يمكنك تقديم إزاحة هذه الدالة بدلاً من الاسم
dbi_fuzz_iterations = 1000
يقدم مؤلفو winAFL شرحًا جيدًا جدًا لكيفية عمل ذلك فعليًا هنا. يستخدم مانول جزءًا كبيرًا من كود مكتبة تجهيز winAFL للتواصل وتجهيز الهدف.
ملاحظة هامة: يجب استخدام مشغل 32 بت وعميل 32 بت لتدمير التطبيقات ذات 32 بت، ومشغل 64 بت وعميل 64 بت للتطبيقات ذات 64 بت!
لتجميع مكتبة التجهيز، تحتاج إلى استخدام أحدث إصدار من DynamoRIO. يمكن العثور على الكود المصدري لمكتبة التجهيز في dbi_clients_src الموجود في المجلد الرئيسي لمانول.
لينكس 64 بت
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 بت
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
على ويندوز، أسهل طريقة لتجميع المكتبة هي تثبيت Visual Studio (تم اختباره على إصداري 2017 و 2013)، تشغيل VS20XX Cross Tools Command Prompt وتشغيل الأوامر التالية:
ويندوز 64 بت
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 بت
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 إذا لزم الأمر)
كان مانول يدعم في البداية التدمير الموجه بالتغطية عبر Intel PIN ولكن نظرًا لضعف الأداء وارتفاع تكلفة الصيانة، لم يعد هذا مدعومًا.
يمكن تقديم الخيارات الأكثر استخدامًا عبر سطر الأوامر. يتم دعم المزيد من الخيارات باستخدام ملف التكوين (manul.config).
مثال: python3 manul.py -i corpus -o out_dir -n 40 "target @@"
الوسائط الموضعية:
target_binary التطبيق الهدف والخيارات التي سيتم تنفيذها (لا تنس تضمين علامات الاقتباس مثل "target e @@").
الوسائط الاختيارية:
-h, --help يعرض رسالة المساعدة هذه ويخرج
-n NFUZZERS عدد المدمجين المتوازيين
-s تشغيل التدمير الأعمى (بدون تجهيز كود)
-c CONFIG مسار ملف التكوين مع خيارات إضافية (انظر قسم خيارات ملف التكوين أدناه)
-r استعادة الجلسة السابقة
المعاملات المطلوبة:
-i INPUT مسار الدليل الذي يحتوي على النماذج الأولية
-o OUTPUT مسار دليل الإخراج
يتم توزيع مانول مع ملف manul.config الافتراضي حيث يمكن للمستخدم العثور على جميع الخيارات المدعومة وأمثلة الاستخدام. يجب تحديد الخيارات بالتنسيق التالي Format: <option_name> = <value>. يمكن استخدام الرمز # لتجاهل سطر.
dict = /home/max/dictionaries/test.dict. تسمح استراتيجية الطفرات في AFL للمستخدم بتحديد قائمة من الرموز المخصصة التي يمكن إدراجها في أماكن عشوائية في الملف المدمَّر. يدعم مانول هذه الوظيفة عبر هذا الخيار (يُفضل المسارات المطلقة).
mutator_weights=afl:7,radamsa:2,my_mutator:1. تسمح أوزان المطفرات للمستخدم بإخبار مانول بعدد الطفرات لكل 10 عمليات تنفيذ التي يجب أن يقوم بها مدمج معين. في هذا المثال، سيتم تنفيذ مطفر AFL في 7/10 من الطفرات، و Radamsa 2/10، وسيحصل my_mutator المخصص على 1/10. إذا كنت تريد تعطيل مطفر معين، يجب تعيين الوزن إلى 0 (مثل mutator_weights=afl:0,radamsa:1,my_mutator:9).
deterministic_seed = False|True. بتقديم True، ستصبح طفرات Radamsa حتمية وبالتالي كل تشغيلة لمانول ستؤدي إلى نفس المخرجات.