Tìm mã kiểm tra
Bản phát hành là một TỆP thực thi 15 KB. Nó yêu cầu một lá cờ, sau đó in Correct! hoặc Incorrect!. Bắt đầu với một yêu cầu đơn giản cho agent của bạn.
SỬ dụng REA để phân tích ms_flag_checker và tìm cờ. Giải thích cách kiểm tra hoạt động, sau đó xác minh câu trả lời với chương trình gốc.
Một lời nhắc ví dụ, với thử thách đã tải xuống có sẵn tại địa phương và phân tích nhà cung cấp chương trình mã máy được kết nối.
-
Thực hiện theo lời nhắc đầu vào cho chức năng của nó
Agent → 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 · kết quả đã chọn0x102004 "What is the flag? " 0x10201c "Incorrect!" 0x102027 "Correct!" Prompt referenced at: 0x10126d Containing function: 0x10124dTham chiếu cung cấp cho tác nhân một nơi để điều tra, mặc dù tên hàm ban đầu của tệp thực thi đã bị xóa.
-
Đọc trình kiểm tra và hai người trợ giúp của nó
Agent → REAanalyze_function {"procedure": "0x10124d"} analyze_function {"procedure": "0x101189"} analyze_function {"procedure": "0x101217"}REA → agent · hướng dẫn đã chọn0x1012c1: 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, 0x18Vòng lặp đầu tiên sao chép 36 mã ký tự. Vòng kiểm tra giải mã mặt nạ, tổng hợp các mã đã chọn và so sánh kết quả với một số được lưu trữ. Của nó
0x18- byte bước qua0x270byte cho 26 mặt nạ.
Đây là những kết quả được chọn từ một phân tích REA mới. Đường dẫn mục tiêu cục bộ được rút ngắn để hiển thị; địa chỉ tham khảo HÌNH ẢNH ĐÃ nhập CỦA REA.
Một kiểm tra cho thấy một nhân vật
Trình kiểm tra sắp xếp đầu vào trong lưới 6×6. Mặt nạ chọn ô nào đóng góp vào tổng. Mã hóa nhỏ gọn của nó sử dụng số âm để bỏ qua các ô và số dương để chọn chúng.
Đọc mặt nạ và mục tiêu của nó từ nhị phân
{"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
Hướng dẫn MOVSX đọc các byte mặt nạ dưới dạng các giá trị đã ký. Đây là lý do tại sao eb có nghĩa là -21. Mục tiêu là một số nguyên cuối nhỏ. Cùng với nhau, các byte này cho agent biết rằng code[21] = 55, vì vậy nhân vật đó là 7.
Từ hướng dẫn đến kiểm tra có thể đọc được
Chọn một bước để kết Nối trình trợ giúp tổng hợp và hàm gọi của nó với cùng một quy Tắc Trong C.
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 * Bắt đầu từ số không · ECX giữ số tiền đang chạy.
02 * Kiểm tra ô mặt nạ. Một giá trị bằng không bỏ qua ký tự; một giá trị khác không bao gồm nó.
03 * Thêm mã ký tự. Số nguyên của đầu vào ở cùng độ lệch được thêm vào tổng.
04 * Di chuyển đến ô tiếp theo. Vòng lặp ban đầu tiến bốn byte trên mỗi số nguyên và truy cập sáu hàng sáu ô.
05 * So sánh với mục tiêu được lưu trữ. Người gọi nhận được số tiền trong EAX. Một sự không phù hợp nhảy đến Incorrect!.
Các hướng dẫn đến từ người trợ giúp tổng hợp và hàm gọi của nó. C Là một bản tóm tắt giải thích với tên mô tả và một vòng lặp 36 ô phẳng.
Giải 26 phương trình
Hầu hết các mặt nạ chọn một số ô. Ví dụ: kiểm tra đầu tiên thêm 16 mã ký tự và yêu cầu tổng cộng 1441. Các lựa chọn chồng chéo cung cấp các phương trình mà một tập Lệnh Python nhỏ có thể giải quyết cùng nhau.
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))
Z3 là một bộ giải tìm các giá trị thỏa mãn các phương trình này. Đoạn trích này sử dụng các kiểm tra được trích xuất và giả định một DUCTF{…} cờ có chữ cái, chữ số, dấu gạch dưới và dấu ngoặc nhọn. Quá trình tải xuống hoàn chỉnh bao gồm tất cả 26 mặt nạ và mục tiêu.
Kiểm tra câu trả lời với chương trình gốc
REA ' s quá trình chụp ghi lại các thực thi ban đầu chấp nhận cờ giải quyết. Thay đổi một ký tự đã chọn từ z để y tạo tổng đầu tiên 1440 thay vì 1441 và chương trình từ chối nó.
| Đầu vào | Đầu ra quan sát | Mã thoát |
|---|---|---|
| Cờ của người giải | Correct! |
0 |
| Một nhân vật đã thay đổi | Incorrect! |
255 |
Hiển thị cờ đã khôi phục và đầu ra đã chụp
What is the flag? DUCTF{ezzzpzzz_07bcda7bfe81faf43caa}
Correct!
Giá trị được khôi phục cũng khớp với cờ trong siêu dữ liệu thử thách đã xuất bản của ban tổ chức, được kiểm tra sau khi giải nhị phân.
Nguồn, danh tính mục tiêu và chi tiết phân tích
Phân tích mới và hai quá trình chụp vào ngày 8 tháng 10 năm 2026, sử dụng REA 4.1.0 với Ghidra 12.1.4 TRÊN Linux x64. Nhị phân là MỘT ELF x86-64 bị tước, 15.248 byte.
dcd3bec4f608e11f3a12ce461100aaf5f621851ee63a1f870d7c90d4e3dd51ae
Các tham chiếu chuỗi, hàm và hằng số đã được kiểm tra trước khi đọc nguồn hoặc giải pháp của ban tổ chức. Bộ giải Python và sơ đồ được xây dựng từ CÁC KẾT quả REA đó.
So sánh với nguồn của ban tổ chức · Thách thức siêu dữ liệu và cờ · REA ghi chú bằng chứng
Hãy thử nó cho mình
Tải xuống thử thách ban đầu và người giải quyết vào một thư mục. Sử dụng lời nhắc ở trên để điều tra với agent của bạn hoặc chạy tập lệnh đi kèm.
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
Tập lệnh in cờ ứng cử viên; dán nó theo lời nhắc của chương trình. Giải quyết Nhu cầu Python và z3-solver. Chạy các nhu CẦU thực thi BAN ĐẦU Linux x86-64.