Files
Serdtse-Sysoly/qualifiers/cratewatch-native-rust-reverse-hard/WRITEUP.md
T
2026-09-17 00:50:07 +03:00

2.3 KiB

CrateWatch

Reverse hard

В раздатке есть Rust-бинарь cratewatch, который сканирует рабочий каталог в поисках ключей. Нужно определить, куда программа отправляет найденные данные. Начинаем со строк и встроенных конфигов, затем проверяем их использование в коде.

Решение

Смотрим секции ELF и строки:

readelf -SW public/cratewatch
strings -a public/cratewatch

Находим нестандартную секцию .cratewatch и маркер CRATEWATCHCFG. В строках также виден cratewatch-fastlog, который код инициализации сканера связывает с конфигом.

За маркером лежит простой контейнер:

Поле Формат
Маркер ASCII CRATEWATCHCFG
Длина 4 байта, little-endian
Данные JSON, замаскированный повторяющимся XOR-ключом

Ключом служит найденная строка cratewatch-fastlog. Читаем указанное число байт и снимаем XOR:

from pathlib import Path
import json

data = Path("public/cratewatch").read_bytes()
start = data.index(b"CRATEWATCHCFG") + len(b"CRATEWATCHCFG")
size = int.from_bytes(data[start:start + 4], "little")
blob = data[start + 4:start + 4 + size]
key = b"cratewatch-fastlog"
plain = bytes(b ^ key[i % len(key)] for i, b in enumerate(blob))
print(json.loads(plain)["flag"])

Получаем читаемый JSON. Endpoint внутри — ложный след, а нужное значение хранится в поле flag. Объёмный Rust-код усложнял навигацию, но для решения хватило найти контейнер и его декодер.

Солвер.

Флаг

caplag{rust_trait_scanner_exposed_the_decoy_exfil}