
أداة اختبار تشويش للبرامج الثنائية مغلقة المصدر مبنية على Unicorn و LibFuzzer
uniFuzzer هي أداة اختبار تشويش (fuzzing) للملفات الثنائية مغلقة المصدر تعتمد على Unicorn و LibFuzzer. تدعم حالياً اختبار تشويش ملفات ELF ذات 32 بت بنظام LSB على معماريات ARM/MIPS، والتي توجد عادةً في أجهزة إنترنت الأشياء.
.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=<target> [UF_PRELOAD=<preload>] UF_LIBPATH=<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=<path to demo-vuln> UF_PRELOAD=<path to demo-libcpreload.so> UF_LIBPATH=<lib path for MIPS> ./uf
يقوم Unicorn بمسح ذاكرة التخزين المؤقت JIT الخاصة بـ QEMU بسبب هذه المشكلة، مما يبطئ سرعة اختبار التشويش حيث سيتم إعادة ترجمة الملف الثنائي المستهدف عبر JIT في كل جولة تنفيذ.
يمكننا التعليق على tb_flush(env); كما هو مذكور في تلك المشكلة لتحسين الأداء.
GNU_HASHIFUNC