---
title: 'CTF Kỹ Thuật Đảo Ngược: DownUnderCTF Cờ Checker-REA'
url: https://rea.tools/vi/showcase/ctf/
---

[Nhà](https://rea.tools/vi/) / [Giới thiệu](https://rea.tools/vi/showcase/) / CTF

Nghiên cứu điển hình \* DownUnderCTF 2023

# Tìm cờ trong MỘT NHỊ phân CTF.

SỬ DỤNG REA để kiểm tra một trình kiểm tra cờ nhỏ, biến các quy tắc của nó thành các phương trình và tìm một đầu vào làm cho chương trình gốc in `Correct!`.

mặt nạ hình vuông cờ checker \* Dễ dàng \* Linux x86-64

[Xem thử thách ban đầu](https://github.com/DownUnderCTF/Challenges_2023_Public/tree/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker)

Từ nhị phân đến câu trả lời đã kiểm tra

1. 01 \* Tìm séc

   **Chuỗi → kiểm tra chức năng**

   REA tìm lời nhắc, tham chiếu của NÓ và mã chấp nhận hoặc từ chối đầu vào.
2. 02 · Trích xuất các quy tắc

   **36 ký tự · 26 tổng**

   REA trả về các hướng dẫn và dữ liệu đằng sau mỗi lần kiểm tra. Tác nhân biến chúng thành phương trình.
3. 03 \* Giải Quyết và chạy

   **Cờ phục hồi → Đúng!**

   Một kịch bản Python giải quyết các phương trình. REA chụp chương trình ban đầu chấp nhận kết quả.

Thử thách là của joseph, được xuất bản trong Kho lưu trữ chính thức Của DownUnderCTF.

## 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.

Agent mã hóa 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.

1. #### Thực hiện theo lời nhắc đầu vào cho chức năng của nó

   Agent → 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 · kết quả đã chọn

   ```
   0x102004  "What is the flag? "
   0x10201c  "Incorrect!"
   0x102027  "Correct!"

   Prompt referenced at: 0x10126d
   Containing function: 0x10124d
   ```

   Tham 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.
2. #### Đọc trình kiểm tra và hai người trợ giúp của nó

   Agent → REA

   ```
   analyze_function
   {"procedure": "0x10124d"}

   analyze_function
   {"procedure": "0x101189"}

   analyze_function
   {"procedure": "0x101217"}
   ```

   REA → agent · hướng dẫn đã chọn

   ```
   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
   ```

   Vò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 qua `0x270` byte 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.

![Mặt nạ thứ bảy bỏ qua 21 ô, chọn vị trí 21, sau đó bỏ qua 14. Chỉ có tế bào đó đóng góp vào tổng. Mã ký tự bắt buộc của nó là 55, có nghĩa là ký tự là 7.](https://rea.tools/assets/localized/vi/figures/ctf-mask-equation.svg)

Kiểm tra thứ bảy chỉ chọn một vị trí. [Hình mở](https://rea.tools/assets/localized/vi/figures/ctf-mask-equation.svg).

### Đọc mặt nạ và mục tiêu của nó từ nhị phân

Agent → REA \* read_bytes

```
{"address": "0x1040e0", "length": 624}
{"address": "0x104060", "length": 144}
```

REA → agent · mục thứ bảy

```
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.

REA \* hướng dẫn ban đầu được chọn

```
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
```

Có Thể đọc Được C \* tóm tắt một lần kiểm tra

```
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.

Python \* giải đoạn trích

```
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.

[Tải xuống trình giải hoàn chỉnh](https://rea.tools/showcase/ctf/solve.py)

## 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

REA \* đầu ra chương trình gốc

```
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.

Thực thi ban đầu \* SHA-256

```
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](https://github.com/DownUnderCTF/Challenges_2023_Public/blob/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker/src/ms_flag_checker.c) · [Thách thức siêu dữ liệu và cờ](https://github.com/DownUnderCTF/Challenges_2023_Public/blob/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker/ctfcli.yaml) ·  [REA ghi chú bằng chứng](https://github.com/morluto/rea/blob/main/website/evidence/ctf-masked-squares.md)

## 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.

[Tải xuống thử thách ban đầu](https://raw.githubusercontent.com/DownUnderCTF/Challenges_2023_Public/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker/publish/ms_flag_checker)[Tải về người giải quyết](https://rea.tools/showcase/ctf/solve.py)

Thiết bị đầu cuối \* giải quyết và chạy

```
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.

[Thiết LẬP REA với agent mã hóa của bạn](https://rea.tools/get-started/)
