
مكوّن إضافي لـ Binary Ninja يستخدم تجزئات XFG المُخمَّنة بالقوة الغاشمة لاستعادة نماذج الدوال الأولية الدقيقة.
يحتوي هذا المستودع على سكربتات لتوليد تجزئات eXtended Flow Guard والبحث عنها.
تتوفر دراسة موسّعة حول كيفية عمل ذلك في العدد 22 من International Jouranl Of Proof Of Concept || GTFO.
تم تبسيط عملي في هذا الإثبات المفاهيمي (PoC) إلى حد كبير بفضل الأشخاص في Quarkslab الذين قاموا بهندسة عكسية موسّعة للأجزاء ذات الصلة من مترجم MS. يمكن قراءة شرحهم المفصّل حول كيفية حساب تجزئات XFG هنا: https://blog.quarkslab.com/how-the-msvc-compiler-generates-xfg-function-prototype-hashes.html
ملاحظة: هذا لا "يكسر" XFG كآلية تخفيف للاستغلال، بل يسيء استخدام آثاره الجانبية فقط لإظهار الدوال التي لا تملك رموزًا.
باختصار، تعمل XFG كما نُفِّذت على ويندوز على توسيع وتشديد آلية تخفيف الاستغلال Control Flow Guard من خلال تقييد الأهداف الممكنة لاستدعاءات الدوال غير المباشرة، ليس فقط بنقاط دخول صالحة للدوال، بل بالدوال ذات التوقيع المطابق. للقيام بذلك، يتم حساب تجزئة XFG لكل دالة ويتم التحقق منها أثناء وقت التشغيل. تعتمد التجزئات على توقيع الدالة فقط (أي اصطلاح الاستدعاء والوسائط وأنواعها). وبالتالي، يمكننا حسابها مسبقًا للأنواع المعروفة ثم البحث عنها لاحقًا للدوال في الملفات الثنائية غير المعروفة.
إذا كان البحث ناجحًا، يمكننا أن نكون متأكدين بنسبة 100% من العدد والأنواع الدقيقة لجميع الوسائط بالإضافة إلى قيمة إرجاع الدالة. يمكن أن يكون هذا مفيدًا للغاية للملفات الثنائية والدوال التي لا تملك رموزًا عامة.
أدعوك لقراءة المقال الكامل في PoC||GTFO، المتاح من مرآة قريبة.
السكربتات هي:
لاستخدام هذه السكربتات، ستحتاج أولاً إلى تعديل gen_function_prototypes.py لإضافة "الأنواع البدائية" والهياكل (structs) والتعدادات (enums) الخاصة بالهدف الذي تفحصه. أيضًا، ستحتاج إلى اختيار عدد الوسائط التي تريد تخمينها. ما يصل إلى 3 يستغرق دقيقة، وما يصل إلى 4 يستغرق يومًا...
بعد توليد توقيعات الدوال لجميع التركيبات، ستحتاج إلى تشغيل gen_hash_from_ast.py الذي سيحلل الملف المُولَّد سابقًا سطرًا سطرًا ويولّد تجزئة XFG المقابلة.
عند اكتمال ذلك، سيكون لديك قاعدة بيانات SQLite لتوقيعات الدوال مع تجزئات XFG المطابقة لها. تم تضمين إضافة Binary Ninja بسيطة جدًا في xfg_analyzer.py. عند تشغيلها على ملف ثنائي محمي بـ XFG، ستجد جميع تجزئات XFG وتبحث عنها في قاعدة البيانات، وإذا تم العثور على تطابق، فستطبق توقيع الدالة الجديد على الدالة المعرَّفة.
اعلم أن هذا مجرد إثبات مفاهيمي (PoC). لكي يكون مفيدًا حقًا، يجب توليد قاعدة بيانات ضخمة من التجزئات (ربما تكون مملوءة بجميع أسماء الهياكل/التعدادات من ملفات رأس ويندوز) وإتاحتها للبحث عبر الإنترنت. بالإضافة إلى ذلك، توسيع هذه الفكرة لتشمل تجزئات XFG الخاصة بـ C++ سيكون مشروعًا ممتعًا للغاية.
لا تتردد في استخدام الكود الموجود في هذا المستودع بأي طريقة. إذا وجدته مفيدًا، أود أن أسمع منك.