กรณีศึกษา·ดาวน์ดันเดอร์ซีเอฟ 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 agent ตัวแทน·ผลลัพธ์ที่เลือกไว้
    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 ตาราง หน้ากากจะเลือกเซลล์ที่ส่งผลต่อผลรวม การเข้ารหัสขนาดกะทัดรัดใช้ตัวเลขเชิงลบเพื่อข้ามเซลล์และตัวเลขบวกเพื่อเลือกพวกเ

หน้ากากที่เจ็ดข้าม 21 เซลล์เลือกตำแหน่ง 21 แล้วข้าม 14 เฉพาะเซลล์ที่ก่อให้เกิดผลรวม รหัสอักขระที่จำเป็นคือ 55 ซึ่งหมายความว่าอักขระคือ 7
ตรวจสอบที่เจ็ดเลือกเพียงหนึ่งตำแหน่ง เปิดรูป.

อ่านหน้ากากและเป้าหมายจากไบนารี

เจ้าหน้าที่→ REA ·อ่าน_ไบต์
{"address": "0x1040e0", "length": 624}
{"address": "0x104060", "length": 144}
REA →ตัวแทน*รายการที่เจ็ด
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 ใช้REA4.1.0 กับGhidra12.1.4 บLinuxx64. 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 กับตัวแทนการเขียนโค้ดของคุณ

ด้านบน