0x8. The Reverse Engieneer's Mindset
بسم الله الرحمن الرحيم.
المهندس العكسي لا يرى الكود كأوامر برمجية معقدة فحسب، بل يراه كـ “صندوق أسود” (Black Box) له مدخلات (Inputs) ومخرجات (Outputs). لذلك، سنناقش في هذا المقال كيف يتم بناء عقلية المهندس العكسي وكيفية استنتاج المنطق البرمجي المخفي.
السيناريو: الباب الإلكتروني (The Scenario)
تخيل أننا أمام باب إلكتروني مغلق. هذا الباب لا يُفتح إلا إذا أدخلت “حرفاً” واحداً صحيحاً من لوحة المفاتيح. لدينا فقط لوحة المفاتيح وشاشة صغيرة تعرض رسالة واحدة عند كل محاولة إدخال.
التجربة (The Experiment)
قمنا بإدخال 3 أحرف مختلفة لمراقبة سلوك الباب، وكانت النتيجة على الشاشة كالتالي:
- إدخال A –> النتيجة: 66
- إدخال B –> النتيجة: 67
- إدخال C –> النتيجة: 68
بعدها، ظهرت رسالة توضح أن الباب يفتح فقط إذا ظهر الرقم 89.
منهجية التفكير (The Thought Process)
هنا يبدأ عقل المهندس العكسي بطرح ثلاثة أسئلة محورية:
- (Static Analysis): ما هي الخوارزمية (Algorithm) التي يعمل بها هذا الباب بناءً على المدخلات والمخرجات؟
- (Extracting the Flag): ما هو الحرف الدقيق الذي يجب إدخاله للوصول إلى النتيجة المطلوبة لفتح الباب؟
- (Dynamic Analysis & Patching): إذا قمنا بفك لوحة المفاتيح ووجدنا سلكاً برمجياً مكتوباً عليه “إذا كانت النتيجة 89 أرسل إشارة لفتح الباب”. وقررنا قطع هذا السلك ووصله ببطارية ليعطي إشارة دائمة بالفتح.. ماذا نسمي هذه العملية؟
الحل والتحليل (The Solution)
1. فهم الخوارزمية (Algorithm Analysis)
بمجرد النظر إلى النتائج، نلاحظ وجود نمط ثابت ومطرد. في علوم الحاسوب، لكل حرف قيمة رقمية تمثله تُعرف بـ (ASCII Code).
- الحرف A قيمته الحقيقية في الحاسوب هي 65.
- الحرف B قيمته الحقيقية هي 66.
- الحرف C قيمته الحقيقية هي 67.
الاستنتاج: الخوارزمية التي يعمل بها الباب هي (Input + 1). البرنامج يأخذ قيمة الحرف المدخل (ASCII) ويزيد عليها الرقم 1.
2. استخراج العلم (Finding the Flag)
الهدف هو الوصول للرقم 89. بتطبيق العملية الرياضية العكسية للخوارزمية التي اكتشفناها: 89 - 1 = 88
بالبحث في جدول الـ ASCII، نجد أن الرقم 88 يمثل الحرف Xإذن الحل لفتح الباب بالطريقة الشرعية هو: إدخال الX.
3. التعديل البرمجي (Patching)
المهمة الثالثة تشرح مفهوماً جوهرياً في الهندسة العكسية وهو Patching (الترقيع أو التعديل).
بدلاً من البحث عن الحرف X (الذي يمثل كلمة السر الشرعية)، قمنا بتعديل “سلوك” البرنامج (قطعنا الأسلاك) ليتجاهل الفحص وعملية المقارنة تماماً.
في بيئة التنقيح الحقيقية (x64dbg)، هذا الإجراء يشبه تماماً تغيير تعليمة القفز JZ (اقفز إذا كان الناتج متطابقاً/صفراً) إلى تعليمة قفز إجباري JMP (اقفز دائماً). هذا التعديل البسيط يجعل الباب يُفتح دائماً في كل مرة، سواء كانت كلمة السر المُدخلة صحيحة أم خاطئة!