AlphaGolang
بواسطة خوان أندريس غيريرو-سادة (JAG-S @ SentinelLabs)
الوصف:
AlphaGolang هي مجموعة من نصوص IDAPython لمساعدة مهندسي عكس البرامج الضارة على إتقان ملفات Go الثنائية. الفكرة هي تقسيم النصوص إلى خطوات ملموسة، وبالتالي تجنب النصوص المتجانسة الهشة، ومحاكاة المنهجية التي قد يتبعها المحلل عند التعامل مع ملف Go ثنائي.
النصوص مُفرَجة تحت ترخيص GPL (تقديرًا لـ GolangLoaderAssist الأصلي لـ Tim Strazzere الذي قمنا بإعادة هيكلته وتحديثه لـ python3، تحية لـ Tim :) ). المساهمات مرحب بها ومشجعة!
المتطلبات: IDA Pro (يفضل الإصدار v7.6+) و Python3 (ew)
الخطوتان الأوليتان (recreate_pclntab و function_discovery_and_renaming) ستعملان على IDA v7.5- لكن النصوص بعد ذلك تتطلب IDAv7.6+. الإصدارات الأحدث هي الهدف المثالي للنصوص الأحدث في المستقبل.
المرجع الأصلي: محاضرة قمة Mandiant للدفاع السيبراني 2021 (الفيديو قيد الانتظار)
منهجية تحليل AlphaGolang
-
الخطوة 0: قاعدة YARA لتحديد ملفات Go الثنائية (PE/ELF/MachO)
- identify_go_binaries.yara
- فحص رأس بسيط + تعبير نمطي لسلسلة معرف بناء Go.
- ربما يمكن تحسين نطاق طول معرف البناء.
-
الخطوة 1: إعادة إنشاء جدول pcln
- recreate_pclntab.py (متوافق مع IDA v7.5-)
- يعيد إنشاء قسم gopclntab من الاستدلالات.
- مفيد بشكل أساسي لـ IDA v7.5-
-
الخطوة 2: اكتشاف الدوال بتجوال جدول pcln وإضافة أسماء للكل
- function_renaming.py (متوافق مع IDA v7.5-)
- مفصول من golang loader assist
- يكشف بقوة عن الدوال المفقودة بناءً على جدول pcln
- أصلح بعض مشكلات تنظيف أسماء الدوال من الانتقال إلى py3
- أعيدت هيكلته لإضافة تحسينات لـ Go v1.18 بناءً على Panchan من Akamai! شكرًا لـ Alex (CycleOfTheAbsurd).
-
الخطوة 3: إظهار الدوال التي أنشأها المستخدم
- categorize_go_folders.py (يتطلب IDA v7.6+)
- يصنف الدوال تلقائيًا إلى مجلدات
- يتطلب IDAv7.6 + تفعيل 'إظهار المجلدات' في عرض الدوال
- تحديث 05.16.2022: إصلاح تعارض مع فرز المجلدات في IDA v7.7
- يوصى بشدة بعكس البيانات الوصفية من Lumina قبل تشغيل هذا المكون الإضافي.
-
الخطوة 4: إصلاح مراجع السلاسل النصية
- fix_string_cast.py
- مفصول من golang loader assist
- أضاف منطقًا لإلغاء تعريف كتل السلاسل النصية الموجودة مسبقًا قبل تعريف سلسلة جديدة
- فحوصات العقلانية الجديدة تجعله أكثر فعالية بكثير
-
الخطوة 5: استخراج معلومات النوع (بواسطة إيفان كوياتكوفسكي)
- extract_types.py
- يعلق على وسائط جميع الاستدعاءات لـ
newobject, makechan, إلخ.
- يطبق نوع C الصحيح على هذه الكائنات ويعيد تسميتها
- يحصل على الاسم القابل للقراءة البشرية ويضيفه كتعليق
إصلاحات معلقة ومجال للمساهمات:
- fix_string_cast.py
- لا يزال بحاجة إلى إعادة هيكلة + استدلالات تحميل سلاسل أفضل
- قد يؤدي إلى تجميد في الملفات الثنائية الضخمة.
- يفتقد بعض آليات تحميل السلاسل غير المباشرة.
- extract_types.py
- يعمل حاليًا على ملفات PE و Mach-O بالبحث عن أسماء الأقسام المضمنة
.rdata أو __rodata.
- يلزم وجود فحص / تنفيذ مناسب للأحجام المشفرة بـ varint
الخطوات التالية:
- تتبع مراجع السلاسل بواسطة الدوال التي أنشأها المستخدم
- إنشاء توقيعات YARA تلقائيًا بناءً على دوال المستخدم
- إنشاء مخرجات كود زائف من Hex-Rays للدوال التي أنشأها المستخدم
- تعيين نقاط توقف تلقائيًا للتحليل الديناميكي للوسائط
- ???
الفضل يعود لـ:
- تيم سترازير لإصداره golang_loader_assist الأصلي
- ميلان بوهاتشيك (Avast Software s.r.o.) لمساعدته القيمة في فهم API idatree.
- يواكيم كينيدي (Intezer)
- إيفان كوياتكوفسكي (Kaspersky GReAT) للخطوة 5.
- إيغور كوزنيتسوف (Kaspersky GReAT)
- أليكس (المعروف بـ CycleOfTheAbsurd) من ESET لإعادة هيكلة الخطوة 2 لدعم Go v1.18.