في هذه المقالة ، سنتعامل مع إلغاء ترجمة MIPS الثنائية في Ghidra وعكس البرنامج المكتوب بلغة golang في المؤسسة الدولية للتنمية.
جزء 1 - C ، C ++ و DotNet فك.المعلومات التنظيميةخاصةً لأولئك الذين يرغبون في تعلم شيء جديد وتطويره في أي من مجالات أمن المعلومات والحاسوب ، سأكتب وأتحدث عن الفئات التالية:
- PWN.
- التشفير (التشفير) ؛
- تقنيات الشبكات (الشبكة) ؛
- عكس (الهندسة العكسية) ؛
- إخفاء المعلومات (Stegano) ؛
- بحث واستغلال مواطن الضعف WEB.
بالإضافة إلى ذلك ، سوف أشارك تجربتي في الطب الشرعي للكمبيوتر ، وتحليل البرامج الضارة والبرامج الثابتة ، والهجمات على الشبكات اللاسلكية وشبكات المناطق المحلية ، وإجراء عمليات pentests واستغلال الكتابة.
حتى تتمكن من معرفة المقالات الجديدة والبرامج والمعلومات الأخرى ، أنشأت
قناة في Telegram ومجموعة لمناقشة أي مشاكل في مجال التصنيف الدولي للأمراض. أيضًا ، سأدرس شخصيًا طلباتك الشخصية وأسئلتك واقتراحاتك وتوصياتك
شخصيًا وسأجيب على الجميع .
يتم توفير جميع المعلومات للأغراض التعليمية فقط. لا يتحمل مؤلف هذا المستند أية مسؤولية عن أي ضرر يلحق بشخص ما نتيجة استخدام المعرفة والأساليب التي تم الحصول عليها نتيجة لدراسة هذا المستند.
ELF MIPS

قم بتنزيل الملف وتحقق منه.

هذا ملف قابل للتنفيذ 32 بت لمعالجات MIPS المعمارية. لحل هذه المشكلة ، سوف نستخدم Ghidra. افتح hydra ، أنشئ مشروعًا جديدًا وأضفه إلى الملف القابل للتنفيذ.

افتح الآن الملف الذي تم التحقيق فيه ، وانتقل إلى نافذة Symbol Tree. في البحث ، اكتب main للعثور على نقطة دخول البرنامج.

عند تحديد وظيفة ، يتم فتحها على الفور في أداة فك التشفير.

دعنا تحويل الكود.

نرى أن 64 بايت تتم قراءتها في المتغير local_54 ، دعنا نسميها لإدخالها (hotkey L) وعمل صفيف char مكون من 64 حرفًا (hotkey Ctrl + L). يمكنك أيضًا إعادة تسمية المتغير sVar1.


بعد إجراء بعض التحويلات ، بدأ الرمز في الظهور بشكل أكثر جمالًا.

نحن نحلل الرمز. يجب أن يكون طول السلسلة التي ندخلها 19 حرفًا. في أي موقف يجب أن تكون الشخصية واضحة من الشفرة. في هذه الحالة ، من الثامن إلى السابع عشر يجب أن يكون الرمز "i". نحن استعادة ، تمرير كلمة المرور.
Golang الأساسية

في هذه المهمة ، يتم تزويدنا بملف قابل للتنفيذ مكتوب في Go. يمكنك حتى معرفة أي إصدار. أنا رمي في المؤسسة الدولية للتنمية. يجب أن يقال على الفور أن الوظيفة الرئيسية لا تسمى main ، ولكن تسمى main_main. لذلك ، نحن نقوم بالبحث حسب الوظيفة وننتقل إلى الرئيسية الحقيقية.

دعونا تحليل الرمز. لنبدأ من البداية.

هناك تعريفات لمفتاح الإدخال. الكتلة اليسرى مسؤولة عن إكمال وظيفة main_main. النظر في كتلة اليسار.

تم تصميم وظيفة fmt_Scanln لقراءة سطر من وحدة التحكم. نلاحظ أيضًا بيانات main_statictmp_2 المحفوظة بالفعل في البرنامج.

بعد ذلك ، يتم استدعاء وظيفة runtime_stringtoslicebyte ، وفقًا للرمز ، يمكننا افتراض أنها تأخذ البايتات الست الأولى من السطر التالي.

سيشير Key.ptr إلى بداية هذه الشريحة. دعونا نرى ما يأتي بعد ذلك.

اعتمادًا على المقارنة بين السجل r9 الملغى والسجل rsi ، حيث يوجد طول مدخلات المستخدم. من هذا يمكننا أن نستنتج أن r9 سيكون على الأرجح عدادًا. دعونا نلقي نظرة على الكتلة اليمنى ، حيث سيذهب التحكم ، بعد البيع على السطر الذي دخلنا إليه.

تسمى الدالة bytes_Compare ، والتي ، بناءً على نتيجة المقارنة ، تعرض أحد الخطوط.


اكتشفنا إخراج البرنامج ، والآن دعونا نلقي نظرة على فواصل الأسطر (في الفرع الأيسر).

يتم إدخال الحرف من إدخال المستخدم في سجل r10 ، ثم هناك مجموعة من التعليمات البرمجية المعقدة لإجراء مقارنات للتحكم في الاستثناءات مثل الفجوة الهزلية ومؤشر الذعر. سلطت الضوء على فرع تنفيذ البرنامج.

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

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