أداة الهندسة العكسية للثنائيات المجمعة بواسطة Nim

أداة الهندسة العكسية للثنائيات المجمعة بواسطة Nim


ال نيم أصبحت لغة البرمجة جذابة بشكل متزايد لمطوري البرامج الضارة نظرًا لمترجمها القوي وقدرتها على العمل بسهولة مع اللغات الأخرى. يمكن لمترجم نيم ترجمة Nim إلى JavaScript، وC، وC++، وObjective-C، والترجمة المتداخلة لأنظمة التشغيل الرئيسية مثل Windows، وLinux، وmacOS، وAndroid، وiOS. علاوة على ذلك، يدعم Nim استيراد الوظائف والرموز من اللغات المذكورة أعلاه، والاستيراد من المكتبات المرتبطة ديناميكيًا لنظام التشغيل Windows والمكتبات المشتركة لنظام التشغيل Linux. تتوفر أيضًا وحدات غلاف Nim، مثل وينيممما يجعل التفاعل مع نظام التشغيل غير مؤلم. تتيح كل هذه الإمكانات سهولة دمج Nim في مسارات التطوير باستخدام هذه اللغات وتعزيز تطوير أدوات جديدة، سواء الحميدة أو الخبيثة.

ليس من المفاجئ إذن أن تشهد أبحاث ESET استخدامًا مستمرًا للبرامج الضارة التي تم تطويرها في Nim في البرية. وفي عام 2019، تم رصد Sednit باستخدام أداة تنزيل ضارة مكتوبة بلغة Nim. مجموعة أخرى سيئة السمعة تلعب لعبة النيم، والحافز للتطوير نيمفيلت، هي مجموعة موستانج باندا APT. تم تسجيل أبحاث ESET موستانج باندا باستخدام نيم في مجموعة أدواتها لأول مرة في حملة ضد منظمة حكومية في سلوفاكيا في أغسطس 2023. تم اكتشاف ملف DLL الخبيث – واستخدامه كجزء من محمل Trident Korplug الكلاسيكي للمجموعة – بلغة Nim.

بالنسبة للباحثين المكلفين بالهندسة العكسية لمثل هذه الثنائيات، يعد Nimfilt أداة قوية لتسريع التحليل. بينما يمكن تشغيل Nimfilt كبرنامج نصي لـ Python في سطر الأوامر (مع مجموعة فرعية من وظائفه) وفي Hex-Rays. المؤسسة الدولية للتنمية سيتم تقديمه هنا بشكل أساسي كمكون إضافي لـ Python لـ IDA.

تهيئة Nimfilt في المؤسسة الدولية للتنمية

عند فتح IDA لأول مرة، فإنه يقوم بتحميل وتهيئة أي مكونات إضافية في دليل IDA plugins. أثناء تهيئة Nimfilt، يستخدم البرنامج المساعد الاستدلال الأساسي لتحديد ما إذا كان الملف الثنائي المفكك قد تم تجميعه باستخدام مترجم Nim. إذا تم اجتياز أحد الاختبارات التالية، يحدد Nimfilt أنه تم استخدام هذا المترجم:

  • يحتوي الثنائي على كلا السلاسل التالية:
  • يحتوي الملف الثنائي على أي من أسماء وظائف Nim المعروفة التالية:
    • نيممين
    • NimMainInner
    • NimMainModule
  • يحتوي الملف الثنائي على اثنتين على الأقل من سلاسل رسائل الخطأ التالية:
    • @القيمة خارج النطاق
    • @القسمة على صفر
    • @over- أو underflow
    • @index خارج الحدود

يتم توفير قواعد YARA جنبًا إلى جنب مع Nimfilt التي تقوم بإجراء فحوصات مماثلة لتحديد ما إذا كان ملف ELF أو PE قد تم تجميعه باستخدام Nim. تعد هذه الفحوصات معًا أقوى بكثير من النهج الذي تتبعه الأدوات الأخرى، مثل اكتشفه بسهولة، والذي يتحقق حاليًا فقط من .rdata قسم ملفات PE للسلسلة io.nim أو Fatal.nim.

كخطوة التهيئة النهائية، إذا كان Nimfilt تشغيل تلقائي علَم تم تعيينه على “صحيح”، ويعمل البرنامج الإضافي على الفور. بخلاف ذلك، يمكن تشغيل Nimfilt كالمعتاد من قائمة المكونات الإضافية الخاصة بـ IDA، كما هو موضح في الشكل 1.

الشكل 1. تهيئة وتشغيل البرنامج المساعد Nimfilt في المؤسسة الدولية للتنمية
الشكل 1. تهيئة وتشغيل البرنامج المساعد Nimfilt في المؤسسة الدولية للتنمية

التفكيك مع Nimfilt

يستخدم Nim نظامًا مخصصًا لتشويه الأسماء يمكن لـ Nimfilt فك تشفيره. أثناء التشغيل، يقوم Nimfilt بالتكرار من خلال كل اسم وظيفة في الملف الثنائي، والتحقق مما إذا كان الاسم عبارة عن حزمة Nim أو اسم وظيفة. تتم إعادة تسمية الأسماء المكتشفة إلى أشكالها المشوهة.

ومن المثير للاهتمام أن هذه الأسماء يمكنها تسريب معلومات حول بيئة المطور، بنفس طريقة مسارات PDB. ويرجع ذلك إلى قيام مترجم Nim بإضافة مسار الملف إلى الاسم أثناء التشويه – يكشف Nimfilt عن المسار عند التفكيك.

على سبيل المثال، يتم تخزين أسماء الوظائف من حزم الجهات الخارجية كمسارات مطلقة أثناء عملية التغيير. يوضح الشكل 2 اسم الوظيفة الذي تم تخزينه كمسار مطلق يكشف عن الإصدار والمجموع الاختباري للوظيفة نيمشا2 الحزمة المستخدمة، بالإضافة إلى مسار التثبيت الخاص بالمطور لـ ذكيا – مدير الحزم الافتراضي لنيم.

بايثون nimfilt.py GET_UINT32_BE__6758Z85sersZ85serOnameZOnimbleZpkgs50Znim837265504548O49O494554555453d57a4852c515056c5452eb5354b51fa5748f5253545748 505752cc56fdZnim83726550_u68

C:/Users/User.name/.nimble/pkgs2/nimSHA2-0.1.1-6765d9a04c328c64eb56b3fa90f45690294cc8fd/nimSHA2::GET_UINT32_BE u68

الشكل 2. فك اسم الوظيفة من حزمة جهة خارجية

في المقابل، يوضح الشكل 3 اسم دالة من حزمة Nim القياسية المخزنة كمسار نسبي (أي نسبة إلى مسار تثبيت Nim).

بايثون nimfilt.py toHex__pureZstrutils_u2067

نقي/ستروتيلز::toHex u2067

الشكل 3. فك اسم الوظيفة من حزمة Nim القياسية

ومع ذلك، لا يتم دائمًا تشويه الأسماء بنفس الطريقة. يوضح الشكل 4 أن نفس اسم الوظيفة أعلاه من حزمة nimSHA2 مخزّن على Linux كمسار نسبي.

python nimfilt.py GET_UINT32_BE__OOZOOZOOZhomeZalexZOnimbleZpkgs50Znim837265504548O49O494554555453d57a4852c515056c5452eb5354b51fa5748f525354574850575 2cc56fdZnim83726550_u49

../../../home/alex/.nimble/pkgs2/nimSHA2-0.1.1-6765d9a04c328c64eb56b3fa90f45690294cc8fd/nimSHA2::GET_UINT32_BE u49

الشكل 4. فك اسم الوظيفة من حزمة جهة خارجية على Linux

يتم تشويه وظائف تهيئة الحزمة بطريقة مختلفة تمامًا: يتم تخزين اسم الحزمة كمسار ملف (بما في ذلك امتداد الملف) يتم وضعه قبل اسم الوظيفة ويتم استخدام نظام الهروب لتمثيل أحرف معينة مثل الخطوط المائلة للأمام والواصلات والنقاط. عند فك التشابك، يقوم Nimfilt بتنظيف اسم الحزمة عن طريق إزالة ملف .نيم امتداد الملف كما هو موضح في الشكل 5.

بايثون nimfilt.py atmdotdotatsdotdotatsdotnimbleatspkgsatswinimminus3dot9dot1atswinimatsincatswinbasedotnim_DatInit000

../../.nimble/pkgs/winim-3.9.1/winim/inc/winbase::DatInit000

الشكل 5. فك اسم وظيفة التهيئة من حزمة جهة خارجية

يوضح الشكل 6 كيفية تخزين أسماء وظائف التهيئة من الحزم الأصلية كمسارات مطلقة.

بايثون nimfilt.py atmCatcatstoolsatsNimatsnimminus2dot0dot0atslibatssystemdotnim_Init000

C:/tools/Nim/nim-2.0.0/lib/system::Init000

الشكل 6. فك اسم وظيفة التهيئة من الحزمة الأصلية

في IDA، يتبع عملية فك تشابك اسم Nimfilt إنشاء أدلة في نافذة الوظائف لتنظيم الوظائف وفقًا لاسم الحزمة أو المسار الخاص بها، كما هو موضح في الشكل 7.

الشكل 7. تقوم نافذة وظائف IDA قبل (يسار) وبعد (يمين) Nimfilt بتنظيم أسماء الوظائف حسب الحزمة أو المسار
الشكل 7. تقوم نافذة وظائف IDA قبل (يسار) وبعد (يمين) Nimfilt بتنظيم أسماء الوظائف حسب الحزمة أو المسار

تطبيق الهياكل على سلاسل نيم

الإجراء الأخير الذي تم تنفيذه أثناء تشغيل Nimfilt هو تطبيق بنيات النمط C على سلاسل Nim. كما أن السلاسل في بعض لغات البرمجة الأخرى هي كائنات وليست تسلسلات بايت منتهية بصفر، كذلك السلاسل في Nim. ويبين الشكل 8 كيفية استخدام السلسلة ABCDEF يظهر في المؤسسة الدولية للتنمية قبل وبعد تشغيل Nimfilt. لاحظ أنه في النموذج المفكك، يستخدم الثنائي المترجم بواسطة Nim البادئة _TM كجزء من الاسم المؤقت لبعض المتغيرات؛ غالبًا ما تكون هذه سلاسل نيم.

الشكل 8. سلسلة Nim قبل (يسار) وبعد (يمين) تشغيل Nimfilt
الشكل 8. سلسلة Nim قبل (يسار) وبعد (يمين) تشغيل Nimfilt

يتكرر Nimfilt من خلال كل عنوان في ملف .rdata أو .rodata المقطع، وفي أي مقطع بيانات آخر للقراءة فقط، ابحث عن سلاسل Nim. يتم تطبيق الهياكل على أي سلاسل تم اكتشافها؛ تحتوي البنية على حقل طول ومؤشر للحمولة التي تتكون من الأحرف الموجودة في السلسلة.

يتم إحتوائه

في طريقها إلى أن يتم تجميعها كملف قابل للتنفيذ، عادةً ما تتم ترجمة كود مصدر Nim إلى C أو C++؛ ومع ذلك، فإن هذه العملية لا تزيل كل آثار نيم تمامًا. من خلال القيام برحلة عبر الكود المصدري لمترجم Nim، كشفنا عن بعض المسارات التي تم اتباعها في عملية التجميع، وبالتالي تمكنا من بناء Nimfilt كأداة Python، ومكون إضافي لـ IDA، للمساعدة في هذا الفك.

باختصار، سواء كنت جديدًا على Nim أم لا، فإن التحول إلى Nimfilt سيجعل عملك الهندسي العكسي مع الثنائيات المجمعة بواسطة Nim أسهل وأكثر تركيزًا على الفور تقريبًا. ومع ذلك، لم يتوقف تطور نيمفيلت بأي حال من الأحوال؛ نحن نعمل على ميزات إضافية للتعامل مع التشوه المزدوج وتحسين تنسيق الأسماء التي تم فكها وتجميع أسماء الحزم.

يتوفر الكود المصدري والوثائق الخاصة بـ Nimfilt في مستودع مستضاف على مؤسسة GitHub التابعة لـ ESET على https://github.com/eset/nimfilt.



Source link

إرسال التعليق

تفقد ما فاتك