GhostFrame
Из всех вводных в таске нам дается только URL. Сначала необходимо найти скрытую страницу, потом выкачать debug-бандл с [ONNX](https://onnx.ai/onnx/intro/)-моделью и метаданными, и потом уже собрать картинку, которая пройдёт все фильтры классификатора.
## Решение
Раз на главной пусто, начинаем с банального перебора директорий:
```bash
gobuster dir -u http://: \
-w /usr/share/seclists/Discovery/Web-Content/common.txt
```
Всплывает скрытая страница `/backup`, внутри — ссылка на архив `prizrachny_kadr_export.zip`. Скачиваем, распаковываем:
| Файл | Назначение |
|---|---|
| `vision_gate.onnx` | Сам классификатор |
| `preprocess.json` | Список признаков и порог |
| `memory.log` | Лог прошлых попыток |
Самый полезный — `preprocess.json`. Формулы он прямо не раскрывает, но рассказывает, какие признаки модель считает:
```text
amber_ratio
blue_ratio
contrast
edge_density
filename_signal
metadata_signal
```
Точные пороги неизвестны — вытягиваем их через `/api/submit`. После каждой отправки сервис выводит чего именно не хватило. Из подсказок составляем полный набор требований:
| Признак | Требование |
|---|---|
| `filename_signal` | Имя файла содержит `lens`, `prism` или `lattice` |
| `metadata_signal` | [PNG `tEXt`](https://www.w3.org/TR/png/#11tEXt) `ghost-signal` начинается с `iris` |
| `amber_ratio` | Тёплый янтарный тон |
| `blue_ratio` | Заметный синий канал |
| `contrast` | Высокий |
| `edge_density` | Много резких границ |
PNG с шахматным или полосатым паттерном даст и контраст, и кучу граней. Красим его в янтарно-синий микс, называем `lattice-lens.png`, прописываем в метадате `ghost-signal=iris-lane` и отправляем на `/api/submit`. Score перевалил порог — сервис возвращает флаг. Автоматический пайплайн — [`solve/solver.py`](solve/solver.py):
```bash
python solve/solver.py http://:
```
## Флаг
`caplag{3409b3f6f9e70dce81617ab19bd3016469b745fb0b9b007ed4967b4b5a3a6486}`