ค้นหารหัสตรวจสอบ
เอกสารประกอบคำบรรยายเป็น 15 กิโลไบต์ปฏิบัติการ มันขอให้ธงแล้วพิมพ์ Correct! หรือ Incorrect!. เริ่มต้นด้วยการร้องขออย่างง่ายๆกับตัวแทนของคุณ
ใช้ REA วิจัย,การเขียนทางเทคนิค,การเขียนรายงาน,การเขียนเชิงวิชาการ อธิบายวิธีการตรวจสอบการทำงานแล้วตรวจสอบคำตอบด้วยโปรแกรมต้นฉบับ
พร้อมท์ตัวอย่างกับความท้าทายดาวน์โหลดพร้อมใช้งานภายในและการวิเคราะห์ผู้ให้บริก
-
ทำตามพร้อมท์อินพุตไปยังฟังก์ชัน
เจ้าหน้าที่→ REAopen_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การอ้างอิงให้ตัวแทนสถานที่ในการตรวจสอบแม้ว่าชื่อฟังก์ชันเดิมของปฏิบัติการได้ถูกลบออก
-
อ่านตรวจสอบและสองผู้ช่วย
เจ้าหน้าที่→ REAanalyze_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 ตาราง หน้ากากจะเลือกเซลล์ที่ส่งผลต่อผลรวม การเข้ารหัสขนาดกะทัดรัดใช้ตัวเลขเชิงลบเพื่อข้ามเซลล์และตัวเลขบวกเพื่อเลือกพวกเ
อ่านหน้ากากและเป้าหมายจากไบนารี
{"address": "0x1040e0", "length": 624}
{"address": "0x104060", "length": 144}
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.
จากคำแนะนำในการตรวจสอบที่อ่านได้
เลือกขั้นตอนในการเชื่อมต่อผู้ช่วยข้อสรุปและฟังก์ชั่นการเรียกของกฎเดียวกันในซี
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 ถือผลรวมการทำงาน
02·ตรวจสอบเซลล์หน้ากาก ค่าศูนย์ข้ามอักขระค่าที่ไม่ใช่ศูนย์รวม
03*เพิ่มรหัสอักขระ จำนวนเต็มของอินพุตที่ชดเชยเดียวกันจะถูกเพิ่มในผลรวม
04*ย้ายไปยังเซลล์ถัดไป ห่วงเดิมก้าวหน้าสี่ไบต์ต่อจำนวนเต็มและการเข้าชมหกแถวของหกเซลล์
05*เปรียบเทียบกับเป้าหมายที่เก็บไว้ ฟังก์ชั่นการโทรได้รับผลรวมใน EAX. ไม่ตรงกันกระโดดไป Incorrect!.
คำแนะนำมาจากผู้ช่วยข้อสรุปและฟังก์ชั่นการเรียก คเป็นบทสรุปอธิบายที่มีชื่ออธิบายและแบนลูป 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 |
แสดงธงที่กู้คืนและเอาท์พุทที่จับ
What is the flag? DUCTF{ezzzpzzz_07bcda7bfe81faf43caa}
Correct!
ค่าที่กู้คืนยังตรงกับธงในการเผยแพร่ข้อมูลเมตาความท้าทายของผู้จัดงาน,ตรวจสอบหลังจ
แหล่งที่มาอัตลักษณ์เป้าหมายและรายละเอียดการวิเคราะห์
เพิ่งวิเคราะห์และสองระบวนการจับภาพใน 8 ตุลาคม 2026 ใช้REA4.1.0 กับGhidra12.1.4 บLinuxx64. 86-64 เอลฟ์ 15,248 ไบต์
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