دراسة حالة * أسفل 2023

ابحث عن العلم في
ثنائي كتف.

استخدام REA لفحص مدقق علم صغير ، حول قواعده إلى معادلات وابحث عن إدخال يجعل البرنامج الأصلي يطبع Correct!.

مربعات ملثمين مدقق العلم * سهل · Linux إكس 86-64

عرض التحدي الأصلي

من ثنائي إلى إجابة محددة

  1. 01 * ابحث عن الشيكسلاسل-فحص وظائفREA يجد المطالبة ومراجعها والرمز الذي يقبل أو يرفض الإدخال.
  2. 02 * استخراج القواعد36 حرفا * 26 مبالغREA إرجاع التعليمات والبيانات وراء كل الاختيار. الوكيل يحولهم إلى معادلات.
  3. 03 * حل وتشغيلالعلم المسترد-صحيح!نص بيثون يحل المعادلات. REA يلتقط البرنامج الأصلي قبول النتيجة.
التحدي هو جوزيف ، الذي نشر في مستودع داوندركتف الرسمي.

ابحث عن رمز التحقق

النشرة هي ملف 15 كيلو بايت قابل للتنفيذ. يسأل عن العلم ، ثم يطبع Correct! أو Incorrect!. ابدأ بطلب بسيط إلى وكيلك.

مساعدك البرمجي

استخدام REA لتحليل مس-فلاغ-تشيكر والعثور على العلم. اشرح كيفية عمل الشيكات ، ثم تحقق من الإجابة باستخدام البرنامج الأصلي.

مثال موجه ، مع التحدي الذي تم تنزيله متاح محليا وتحليل موفر برامج رمز الجهاز المتصل.

  1. اتبع موجه الإدخال إلى وظيفته

    وكيل → REA
    open_binary
    {"path": "ms_flag_checker"}
    
    search_strings
    {"pattern": "flag|correct|wrong|input",
     "mode": "regex", "case_sensitive": false}
    
    xrefs
    {"address": "0x102004"}
    
    resolve_containing_procedure
    {"address": "0x10126d"}
    REA - وكيل * نتائج مختارة
    0x102004  "What is the flag? "
    0x10201c  "Incorrect!"
    0x102027  "Correct!"
    
    Prompt referenced at: 0x10126d
    Containing function: 0x10124d

    يعطي المرجع الوكيل مكانا للتحقيق ، على الرغم من إزالة أسماء الوظائف الأصلية القابلة للتنفيذ.

  2. قراءة المدقق واثنين من المساعدين

    وكيل → REA
    analyze_function
    {"procedure": "0x10124d"}
    
    analyze_function
    {"procedure": "0x101189"}
    
    analyze_function
    {"procedure": "0x101217"}
    REA - وكيل * تعليمات مختارة
    0x1012c1: CMP EDI, 0x24
    0x1012c6: LEA RBX, [0x1040e0]
    0x1012cd: LEA RBP, [0x104060]
    0x1012d4: LEA R13, [RBX + 0x270]
    0x1012e1: CALL 0x00101189
    0x1012ec: CALL 0x00101217
    0x1012f1: CMP dword ptr [RBP], EAX
    0x1012f4: JNZ 0x00101335
    0x1012f6: ADD RBX, 0x18

    الحلقة الأولى نسخ 36 رموز الأحرف. تقوم حلقة الفحص بفك تشفير القناع ، وتلخص الرموز المحددة وتقارن النتيجة برقم مخزن. لها 0x18- خطوات بايت عبر 0x270 بايت تعطي 26 أقنعة.

يتم اختيار هذه النتائج من جديد REA تحليل. يتم تقصير مسار الهدف المحلي للعرض ؛ تشير العناوين إلى REAالصورة المستوردة.

شيك واحد يكشف عن حرف واحد

المدقق يرتب المدخلات في شبكة 6 6 6. يختار القناع الخلايا التي تساهم في المجموع. يستخدم ترميزه المضغوط أرقاما سالبة لتخطي الخلايا والأرقام الموجبة لتحديدها.

يتخطى القناع السابع 21 خلية ، ويختار الموضع 21 ، ثم يتخطى 14. فقط تلك الخلية تساهم في المجموع. رمز الحرف المطلوب هو 55 ، مما يعني أن الحرف هو 7.
الاختيار السابع يختار موقف واحد فقط. الشكل المفتوح.

اقرأ القناع وهدفه من الثنائي

وكيل → REA * قراءة _ بايت
{"address": "0x1040e0", "length": 624}
{"address": "0x104060", "length": 144}
REA agent الوكيل * الإدخالات السابعة
Mask at 0x104170:
eb 01 f2 00  →  -21, +1, -14, stop

Target at 0x104078:
37 00 00 00  →  55

التعليمات MOVSX يقرأ بايت القناع كقيم موقعة. هذا هو السبب eb يعني -21. الهدف هو عدد صحيح صغير. معا ، تخبر هذه البايتات الوكيل أن code[21] = 55، بحيث تكون هذه الشخصية 7.

من التعليمات إلى فحص قابل للقراءة

حدد خطوة لتوصيل مساعد التلخيص ووظيفة الاتصال الخاصة به بنفس القاعدة في ج.

REA * تعليمات أصلية مختارة
0x10121c: MOV ECX, 0x0

0x10122c: CMP dword ptr [RSI + RAX*0x1], 0x0
0x101230: JZ 0x00101223

0x101232: ADD ECX, dword ptr [RDI + RAX*0x1]

0x101223: ADD RAX, 0x4

0x1012f1: CMP dword ptr [RBP], EAX
0x1012f4: JNZ 0x00101335
قراءة ج * ملخص الاختيار واحد
int check_one_mask(const int codes[36],
                   const int mask[36],
                   int target) {
    int total = 0;
    for (int i = 0; i < 36; ++i) {
        if (mask[i]) {
            total += codes[i];
        }
    }
    return total == target;
}

01 * ابدأ من الصفر. ECX يحمل المبلغ الجاري.

تأتي التعليمات من مساعد التلخيص ووظيفة الاتصال الخاصة به. ال ج هو ملخص توضيحي بأسماء وصفية وحلقة مسطحة من 36 خلية.

حل المعادلات 26

تختار معظم الأقنعة عدة خلايا. على سبيل المثال ، يضيف الفحص الأول 16 رمزا للأحرف ويتطلب إجمالي 1441. تعطي التحديدات المتداخلة معادلات يمكن أن يحلها نص بايثون صغير معا.

بيثون * حلالا مقتطفات
from z3 import Int, Or, Solver, Sum, sat

codes = [Int(f"code_{i}") for i in range(36)]
solver = Solver()
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_{}"
for code in codes:
    solver.add(Or(*[code == ord(c) for c in alphabet]))
for code, char in zip(codes, "DUCTF{"):
    solver.add(code == ord(char))
solver.add(codes[-1] == ord("}"))

for selected, target in checks:
    solver.add(Sum([codes[i] for i in selected]) == target)

assert solver.check() == sat
model = solver.model()
print("".join(chr(model.eval(code).as_long()) for code in codes))

ض3 هو حلالا يجد قيما تفي بهذه المعادلات. يستخدم هذا المقتطف الشيكات المستخرجة ويفترض أ DUCTF{…} العلم مع الحروف والأرقام والشرطات السفلية والأقواس. يشمل التنزيل الكامل جميع الأقنعة والأهداف الـ 26.

تحميل حلالا كاملة

تحقق من الإجابة مع البرنامج الأصلي

REAالصورة القبض على عملية يسجل تنفيذ الأصلي قبول العلم حلها. تغيير حرف واحد محدد من z إلى y يجعل المبلغ الأول 1440 بدلا من 1441, والبرنامج يرفض ذلك.

المدخلات الإخراج المرصود رمز الخروج
علم حلالا Correct! 0
تم تغيير حرف واحد Incorrect! 255
إظهار العلم المسترد والإخراج الملتقط
REA * إخراج البرنامج الأصلي
What is the flag? DUCTF{ezzzpzzz_07bcda7bfe81faf43caa}
Correct!

تتطابق القيمة المستردة أيضا مع العلم في البيانات الوصفية للتحدي المنشورة للمنظمين ، والتي تم فحصها بعد حل الثنائي.

المصدر والهوية المستهدفة وتفاصيل التحليل

تحليل جديد واثنين من عمليات الالتقاط في 8 أكتوبر 2026 ، باستخدام REA 4.1.0 مع Ghidra 12.1.4 على Linux 64. ثنائي هو جردت س 86-64 قزم ، 15 ، 248 بايت.

قابل للتنفيذ الأصلي · SHA-256
dcd3bec4f608e11f3a12ce461100aaf5f621851ee63a1f870d7c90d4e3dd51ae

تم فحص مراجع السلسلة والوظائف والثوابت قبل قراءة مصدر أو حل المنظمين. تم بناء بيثون حلالا والرسم البياني من تلك REA النتائج.

قارن مع مصدر المنظمين · تحدي البيانات الوصفية والعلم · REA ملاحظات الأدلة

انها محاولة لنفسك

تحميل التحدي الأصلي وحلالا في مجلد واحد. استخدم المطالبة أعلاه للتحقيق مع وكيلك ، أو قم بتشغيل البرنامج النصي المضمن.

محطة * حل وتشغيل
python3 -m venv .venv
.venv/bin/python -m pip install z3-solver
.venv/bin/python solve.py

chmod +x ms_flag_checker
./ms_flag_checker

يقوم البرنامج النصي بطباعة علامة مرشح ؛ الصقه في موجه البرنامج. حل يحتاج بيثون و z3-solver. تشغيل الاحتياجات القابلة للتنفيذ الأصلي Linux س86-64.

إعداد REA مع مساعدك البرمجي

أعلى