ذكرت برنامج
Check Point Security Academy عدة مرات على حبري: جوهره هو أن شركة
Check Point أعلنت عن منافسة في تنسيق Capture the Flag في الصيف ، حيث الخبرة السابقة للمشارك ليست مهمة ، ولكن فقط قدرته على كشف الإنترنت الألغاز. بناءً على نتائج هذه المسابقة ، قامت الشركة بتجنيد عشرين مشاركًا لدورة الأمن الإلكتروني المهنية لمدة ثلاثة أشهر ، ويحصل جميع المشاركين من بداية الدورة على الراتب الكامل لمتخصص في KB ، بموجب الالتزام بالعمل في الشركة بعد عامين من نهاية الدورة.
في مسابقة CTF ، يمكن أن يكون العلم حتى صورة ، مثل هذه.تم الانتهاء من اختيار المشاركين في أغسطس ، لكن موقع المسابقة سيستمر في العمل حتى الصيف المقبل ، وأدعو أولئك الذين يرغبون في التسجيل وتجربة أيديهم من أجل الاهتمام بالرياضة. تتكون المسابقة من 12 الألغاز ذات التعقيد المتفاوت ، المصنفة من 10 إلى 150 نقطة.
هنا أريد تحليل لغز "اختبر صبرتي" من فئة "مفاجأة". إنها ذات صعوبة متوسطة (50 نقطة) ، وهنا نصها الكامل:
مرحبًا بكم
وجدنا هذا قابل للتنفيذ على كمبيوتر صانع الساعات المحلي.
يشاع أن صانع الساعات هو بطريقة ما الشخص الوحيد الذي نجح في كسرها.
هل تعتقد أنك جيد مثل صانع الساعات؟
ملاحظة: هذا الملف ليس ضارًا بأي شكل من الأشكال
بالإشارة - ثنائي 32 بت لنظام التشغيل Windows ، والذي
تقسم عليه بعض برامج مكافحة الفيروسات ، ولكن إذا استمر تشغيله ، فسيبدو الأمر كما يلي:

يتم تشفير داخل ثنائي ؛ يرفض تشغيل تحت المصحح. إذا حاولت توصيل مصحح أخطاء أثناء تشغيله ، فإنه ينتهي على الفور. على الأرجح ، قام متخصصون من Check Point بلف أحجيةهم في باكر مشفر ، مستعار من نوع ما من مالفاري.
كيف سنخمن الرقم المكون من صانع الساعات؟
هناك طريقتان. يمكن تسمية الأولى بشروط "هناك قوة ، لا مانع": إذا كان البرنامج لا يمكن تصحيحه مباشرة ، فسوف نقوم بتصحيح الميت!
أطلقنا "إدارة المهام" 32 بت (\ Windows \ SysWOW64 \ taskmgr.exe) ، وانقر بزر الماوس الأيمن على العملية الغامضة ، وحدد إنشاء ملف تفريغ. (تقوم إدارة المهام 64 بت لعمليات 32 بت بإنشاء ملف تفريغ لمحاكي wow64cpu ، وهو أكثر صعوبة في العمل معه.)
ننظر في التفريغ ونرى أنه تم فك تشفير الخطوط الموجودة فيه على الأقل:

لكن الخطوط التي تحتوي على الرقم المخفي أو العلم غير مرئية بعد.
ننتقل إلى سلاح العيار الرئيسي: WinDbg (X86) -> Open Crash Dump ...

أين في الذاكرة يوجد الخط الذي نريد أن نراه مطبوعًا - "عمل جيد يا صديقي!"؟
يسمح لك الأمر
lm
بتحديد تحميل الملف الثنائي من
01140000
إلى
015b2000
؛ ثم
sa 01140000 015b2000 "Good job my friend!"
يجد سلسلة البحث في
0115a0d0
:

دعنا نجد الآن مكان طباعة هذا السطر: ربما يحتوي بعض الأوامر على وحدات البايت
d0 a0 15 01
المقابلة لعنوان السطر الذي تبحث عنه؟ (
sb 01140000 015b2000 d0 a0 15 01
)
حظا سعيدا! - تم العثور على هذا الفريق:

ما هو الرمز الموجود حول هذا الأمر؟ (
ub 011412f7; u 011412f7
)

نرى أنه بناءً على نتيجة الوظيفة
01141180
إما أن تتم طباعة الرسالة المطلوبة ، أو "خطأ ..."
يشغل رمز الوظيفة
01141180
ثلاث شاشات ؛ من السهل جدًا أن نفهم أن هذا هو تنفيذ
strcmp()
، الذي تمت إضافة مكالمة
Sleep(700)
فيه. لم يتضح بعد سبب
Sleep()
؛ لكنه لا يزال لا يؤثر على نتيجة الوظيفة ، لذا من الأفضل معرفة نوع الخطوط التي تتم مقارنتها:

ebp-24h
ebp-14h
و
ebp-24h
؛ تم تمرير الثانية منهم إلى الدالة
011410b0
.
أليست هذه هي الوظيفة التي تطلب الرقم المخفي؟ دعونا نتحقق من مكدس المكالمة (
k
):

نعم إنها هي!
المخطط العام للغز واضح الآن: يتم تخزين حدس المستخدم في
ebp-24h
، الرقم
ebp-14h
عند
ebp-14h
، ثم تتم مقارنتها ويتم طباعة إما "عمل جيد يا صديقي!" أو "خطأ واحد ...".
كل ما تبقى هو سحب الرقم المخفي من إطار المكدس. نحن نعرف بالفعل
ebp
الخاص
ebp
من مكدس المكالمات:

هيا ، هيا ...

نجاح! يمكنك عمل شيء لذيذ.
ولكن تركت ثلاثة أشياء غامضة دون تفسير:
- لماذا يوجد مكالمة
Sleep(700)
داخل strcmp()
Sleep(700)
؟ - لماذا ، عندما أدخلنا الرقم المخفي ، تجمد البرنامج لمدة عشر ثوانٍ قبل طباعة "عمل جيد يا صديقي!"؟
- ما علاقة صانع الساعات بهذا اللغز؟
لذلك ، اتضح أن هناك طريقة ثانية - أكثر ذكاء - لتخمين الرقم التخميني. إذا حاولت عشوائياً الأرقام من 0 إلى 9 ، فمن السهل ملاحظة أنه في التسعة "يتوقف" البرنامج قليلاً. إذا جربت الأرقام 90-99 ، يمكنك أن ترى أنه على الرقم 98 "يتجمد" البرنامج مرتين. (بعد الكشف عن الشجاعة ، نفهم بالفعل ما هو الأمر: تؤدي المقارنة الناجحة بين كل زوج من الأحرف إلى تأخير قدره 0.7 ثانية.) لحل اللغز دون بدء تشغيل المصحح ، كان يكفي تحديد كل رقم تالٍ حتى يزيد التأخير قبل الإجابة - إما يدويًا مع ساعة توقيت أو نص بسيط. وهكذا ، ألمح المترجمون إلى طريقة
طويلة الأمد لمهاجمة خوارزميات التشفير ، عندما يتم قياس الوقت حتى رسالة الخطأ وتحليلها.
ولكن لمعرفة كيفية التقاط البرامج المغلفة بباكرات التشفير غير المعروفة ، في رأيي ، هو أكثر إثارة للاهتمام وأكثر قيمة :-)
لاحظ أننا لم نكن بحاجة إلى معرفة كيف يتم تشفير الثنائي ، أو كيف تظهر السلسلة بالرقم الذي تراه على المكدس (رأينا في التفريغ أنه ليس من بين ثوابت السلسلة) - تمكنا من أن نكون جاهزين وجاهزين ، لذلك حوالي عشرة أوامر WinDbg كانت كافية.