
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 حتمية وبالتالي كل تشغيلة لمانول ستؤدي إلى نفس المخرجات.
print_per_thread = False|True. بتفعيل هذا الخيار، سيقوم مانول بطباعة ملخص لكل خيط يتم تنفيذه بدلاً من الملخص الكلي.
disable_volatile_bytes = False|True بتفعيل هذا الخيار، لن يقوم مانول بإدراج المسارات المتقلبة في القائمة السوداء.
forkserver_on = False|True تفعيل أو تعطيل خادم الشوكة الخاص بـ AFL.
dbi = dynamorio|pin. يخبر هذا الخيار مانول بإطار DBI الذي سيتم استخدامه لتجهيز الهدف.
dbi_root = <path>. يخبر هذا الخيار مانول بمكان العثور على المشغل الرئيسي لإطار DBI.
dbi_client_root = <path>. يخبر هذا الخيار مانول بمكان العثور على عميل DBI لتنفيذ التجهيز.
dbi_client_libs = name_#1,name_#2|None. يمكن استخدام هذا الخيار لتحديد قائمة المكتبات التي تحتاج إلى التجهيز إلى جانب الهدف الرئيسي (مثلًا، لديك ملف تنفيذي يقوم بتحميل المكتبة المستهدفة بالإضافة إلى عدة مكتبات أخرى تريد البحث عن الأخطاء فيها).
dbi_persistence_mode = 0|1|2. يستخدم هذا الخيار للاختيار بين أوضاع استمرارية DBI. 0 - بدون استمرارية، 1 - استمرارية قياسية (تغليف دالة)، 2 - غير مدعوم بعد.
إذا dbi-persistence_mode = 1|2، يجب تحديد الخيارات التالية:
dbi_target_module = <module name>. سيحاول مانول البحث عن الدالة المستهدفة في الوحدة المحددة هنا.
dbi_target_method = <function name>. اسم الدالة المراد تغليفها للاستمرارية.
dbi_target_offset = <offset of function e.g. 0x3198>. إزاحة الدالة المراد تغليفها للاستمرارية. يمكن استخدام هذا الخيار بدلاً من dbi_target_method إذا كانت رموز التصحيح غير متوفرة.
dbi_fuzz_iterations = 500. عدد تكرارات التدمير التي سيتم تشغيلها في الذاكرة قبل إعادة تشغيل البرنامج بالكامل. يمكنك تجربة هذه الوسيطة للعثور على القيمة التي تعمل بشكل أفضل مع هدفك.
dbi_thread_coverage = False. تجهيز التغطية فقط من الخيط الذي نفذ الدالة المستهدفة (غير مدعوم بعد).
timeout = 10. الوقت الذي يجب الانتظار قبل قتل الهدف وإرسال حالة الاختبار التالية.
init_wait = 1. يمكن استخدام هذا الخيار لتعيين مهلة مطلوبة لتهيئة الهدف.
يتم استخدام الخيارين net_config_master و net_config_slave لتوزيع مثيلات مانول عبر الشبكة. عليك تنفيذ الخطوات الثلاث التالية لتشغيل التدمير الموزع.
IP:port حيث سيتم تنفيذ التوابع.net_config_slave = 0.0.0.0:1337. سيقوم مانول بتشغيل المثيل وسينتظر اتصالًا واردًا من المثيل الرئيسي على المنفذ 1337.net_config_master = file_name.debug = False|True - طباعة معلومات التصحيح.
logging_enable = False|True - حفظ معلومات التصحيح في السجل.
manul_logo = False|True - طباعة شعار مانول في البداية.
no_stats = False|True - حفظ الإحصائيات.
sync_freq = 10000. يسمح للمستخدم بتغيير تردد مزامنة الصورة النقطية للتغطية. يخبر هذا الخيار مانول بعدد المرات التي يجب فيها مزامنة التغطية بين مثيلات التدمير المتوازية. القيمة المنخفضة تقلل الأداء ولكنها تزيد التنسيق بين المثيلات.
#custom_path = test_path - يتيح هذا الخيار حفظ حالة الاختبار في مجلد مخصص (إذا أراد الهدف تحميلها من مكان محدد مسبقًا).
cmd_fuzzing = True|False. إذا تم تفعيل هذا الخيار، سيقوم مانول بتوفير الإدخال للهدف عبر سطر الأوامر بدلاً من الحفظ في ملف.
user_signals = 6,2,1|None. يمكن للمستخدم إخبار مانول بأي إشارات من الهدف يجب تجاهلها (لا تعتبر تعطلًا).
target_ip_port = 127.0.0.1:7715|None - يستخدم لتحديد IP و PORT الهدف.
target_protocol = tcp|tcp - يستخدم لتحديد البروتوكول لإرسال الإدخال إلى الهدف عبر الشبكة.
net_sleep_between_cases = 0.0. يمكن استخدام هذا الخيار لتحديد تأخير بين حالات الاختبار التي يتم إرسالها إلى الهدف.
حاليًا، تدمير الشبكة هو ميزة تجريبية (راجع المشكلات لمزيد من التفاصيل).
يمكن إضافة مطفر مخصص في الخطوات الثلاث التالية: الخطوة 1. أنشئ ملف بايثون (.py) وأعطه اسمًا (مثل example_mutator.py)
الخطوة 2. أنشئ دالتين def init(fuzzer_id) و def mutate(data). راجع example_mutator لمزيد من التفاصيل. سيقوم مانول باستدعاء دالة init أثناء تهيئة التدمير و mutate لكل ملف يتم توفيره للهدف.
الخطوة 3. قم بتفعيل المطفر عن طريق تحديد اسمه باستخدام mutator_weights في ملف manul.config. مثلًا: mutator_weights=afl:2,radamsa:0,example_mutator:8.
ملاحظة: يجب دائمًا تحديد مطفرات AFL و Radamsa. إذا كنت تريد تعطيل AFL و/أو Radamsa، فقط قم بتعيين أوزان صفرية لهم.
قريباً
