---
title: 'Rekayasa Balik KKP: Pemeriksa Bendera DownUnderCTF-REA'
url: https://rea.tools/id/showcase/ctf/
---

[Rumah](https://rea.tools/id/) / [Menampilkan](https://rea.tools/id/showcase/) / CTF

Studi kasus \* DownUnderCTF 2023

# Temukan bendera di biner KKP.

Gunakan REA untuk memeriksa pemeriksa bendera kecil, mengubah aturannya menjadi persamaan, dan menemukan masukan yang membuat program asli dicetak `Correct!`.

pemeriksa bendera kotak bertopeng \* Mudah \* Linux x86-64

[Lihat tantangan aslinya](https://github.com/DownUnderCTF/Challenges_2023_Public/tree/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker)

Dari biner ke jawaban yang dicentang

1. 01 \* Temukan ceknya

   **String →** 

   REA menemukan prompt, referensinya, dan kode yang menerima atau menolak input.
2. 02 \* Ekstrak aturan

   **36 karakter · 26 jumlah**

   REA mengembalikan instruksi dan data di balik setiap pemeriksaan. Agen mengubahnya menjadi persamaan.
3. 03 \* Pecahkan dan jalankan

   **Bendera yang dipulihkan →** 

   Skrip Python memecahkan persamaan. REA menangkap program asli yang menerima hasilnya.

Tantangannya adalah oleh joseph, diterbitkan di repositori resmi DownUnderCTF.

## Temukan kode pemeriksaan

Handout adalah executable 15 KB. Ia meminta bendera, lalu mencetak `Correct!` atau `Incorrect!`. Mulailah dengan permintaan sederhana kepada agen Anda.

Agen pengkodean Anda

Gunakan REA untuk menganalisis ms_flag_checker dan menemukan benderanya. Jelaskan cara kerja pemeriksaan, lalu verifikasi jawabannya dengan program aslinya.

Contoh prompt, dengan tantangan yang diunduh tersedia secara lokal dan analisis penyedia program kode mesin terhubung.

1. #### Ikuti prompt input ke fungsinya

   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 →

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

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

   Referensi memberi agen tempat untuk menyelidiki, meskipun nama fungsi asli yang dapat dieksekusi telah dihapus.
2. #### Baca pemeriksa dan dua pembantunya

   Agent → REA

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

   analyze_function
   {"procedure": "0x101189"}

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

   REA → agen \* instruksi yang dipilih

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

   Loop pertama menyalin 36 kode karakter. Loop pemeriksaan menerjemahkan topeng, menjumlahkan kode yang dipilih, dan membandingkan hasilnya dengan nomor yang disimpan. Nya `0x18`- langkah byte melintasi `0x270` byte memberikan 26 topeng.

Ini adalah hasil yang dipilih dari analisis REA baru. Jalur target lokal dipersingkat untuk ditampilkan; alamat mengacu pada gambar yang diimpor REA.

## Satu cek mengungkapkan satu karakter

Pemeriksa mengatur masukan dalam kisi 6× Topeng memilih sel mana yang berkontribusi pada penjumlahan. Pengkodeannya yang ringkas menggunakan angka negatif untuk melewati sel dan angka positif untuk memilihnya.

![Topeng ketujuh melompati 21 sel, memilih posisi 21, lalu melompati 14. Hanya sel itu yang berkontribusi pada jumlah tersebut. Kode karakter yang diperlukan adalah 55, yang berarti karakternya adalah 7.](https://rea.tools/assets/localized/id/figures/ctf-mask-equation.svg)

Pemeriksaan ketujuh hanya memilih satu posisi. [Sosok terbuka](https://rea.tools/assets/localized/id/figures/ctf-mask-equation.svg).

### Baca topeng dan targetnya dari biner

Agen → REA \* read_bytes

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

Instruksi `MOVSX` membaca byte topeng sebagai nilai yang ditandatangani. Inilah mengapa `eb` artinya -21. Targetnya adalah bilangan bulat little-endian. Bersama-sama, byte ini memberi tahu agen bahwa `code[21] = 55`, jadi karakter itu adalah `7`.

## Dari instruksi hingga pemeriksaan yang dapat dibaca

Pilih langkah untuk menghubungkan summing helper dan fungsi pemanggilnya ke aturan yang sama di C.

REA \* instruksi asli yang dipilih

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

Ringkasan satu cek C \* yang dapat dibaca

```
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 \* Mulai dari nol.** `ECX` memegang jumlah yang sedang berjalan.

**02 \* Periksa sel topeng.** Nilai nol melewatkan karakter; nilai bukan nol menyertakannya.

**03 \* Tambahkan kode karakter.** Bilangan bulat input pada offset yang sama ditambahkan ke jumlah.

**04 \* Pindah ke sel berikutnya.** Loop asli memajukan empat byte per bilangan bulat dan mengunjungi enam baris dari enam sel.

**05 \* Bandingkan dengan target yang disimpan.** Fungsi pemanggil menerima jumlah dalam `EAX`. Ketidakcocokan melompat ke `Incorrect!`.

Instruksi datang dari pembantu penjumlahan dan fungsi pemanggilnya. C adalah ringkasan penjelasan dengan nama deskriptif dan loop 36 sel yang diratakan.

## Selesaikan 26 persamaan tersebut

Sebagian besar topeng memilih beberapa sel. Misalnya, pemeriksaan pertama menambahkan 16 kode karakter dan membutuhkan total 1441. Pilihan yang tumpang tindih memberikan persamaan yang dapat diselesaikan bersama oleh skrip Python kecil.

Python \* kutipan pemecah

```
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 adalah pemecah yang menemukan nilai-nilai yang memenuhi persamaan ini. Kutipan ini menggunakan pemeriksaan yang diekstraksi dan mengasumsikan `DUCTF{…}` bendera dengan huruf, angka,garis bawah, dan tanda kurung. Unduhan lengkap mencakup semua 26 topeng dan target.

[Unduh pemecah lengkap](https://rea.tools/showcase/ctf/solve.py)

## Periksa jawabannya dengan program aslinya

Pengambilan proses REA merekam executable asli yang menerima flag yang diselesaikan. Mengubah satu karakter yang dipilih dari `z` untuk `y` membuat jumlah pertama 1440, bukan 1441, dan program menolaknya.

| Masukan | Keluaran yang diamati | Kode keluar |
| --- | --- | --- |
| Bendera pemecah | `Correct!` | 0 |
| Satu karakter berubah | `Incorrect!` | 255 |

Tampilkan bendera yang dipulihkan dan keluaran yang diambil

REA \* keluaran program asli

```
What is the flag? DUCTF{ezzzpzzz_07bcda7bfe81faf43caa}
Correct!
```

Nilai yang dipulihkan juga cocok dengan tanda dalam metadata tantangan yang diterbitkan penyelenggara, dicentang setelah menyelesaikan biner.


Sumber, identitas target, dan detail analisis

Analisis baru dan dua tangkapan proses pada 8 Oktober 2026, menggunakan REA 4.1.0 dengan Ghidra 12.1.4 pada Linux x64. Binernya adalah ELF x86-64 yang dilucuti, 15.248 byte.

Eksekusi asli \* SHA-256

```
dcd3bec4f608e11f3a12ce461100aaf5f621851ee63a1f870d7c90d4e3dd51ae
```

Referensi string, fungsi, dan konstanta diperiksa sebelum membaca sumber atau solusi penyelenggara. Pemecah Python dan diagram dibuat dari hasil REA tersebut.

[Bandingkan dengan sumber penyelenggara](https://github.com/DownUnderCTF/Challenges_2023_Public/blob/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker/src/ms_flag_checker.c) · [Tantang metadata dan bendera](https://github.com/DownUnderCTF/Challenges_2023_Public/blob/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker/ctfcli.yaml) ·  [Catatan bukti REA](https://github.com/morluto/rea/blob/main/website/evidence/ctf-masked-squares.md)

## Cobalah sendiri

Unduh tantangan asli dan pemecah ke dalam satu folder. Gunakan perintah di atas untuk menyelidiki dengan agen Anda, atau jalankan skrip yang disertakan.

[Unduh tantangan asli](https://raw.githubusercontent.com/DownUnderCTF/Challenges_2023_Public/b48f83db2984bc7fa2ec7879a32d7efb1be8d333/rev/masked-squares-flag-checker/publish/ms_flag_checker)[Unduh pemecah](https://rea.tools/showcase/ctf/solve.py)

Terminal \* selesaikan dan jalankan

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

Skrip mencetak bendera kandidat; tempelkan pada prompt program. Memecahkan kebutuhan Python dan `z3-solver`. Menjalankan executable asli membutuhkan Linux x86-64.

[Siapkan REA dengan agen pengkodean Anda](https://rea.tools/get-started/)
