# PokéBox | web **Автор:** [@itsnagixyz](https://t.me/itsnagixyz) ## Описание > Загрузите свой сейв, покажите команду, поделитесь боксом с тренерами. Blackbox. Участникам раздатки не выдаются (`attachments: []`). ## Деплой Per-instance: [deploy/](deploy/) — Ruby/Sinatra приложение, SQLite. ## Выдать участникам Ничего. ## Идея Платформа для шеринга сейвов Pokémon (Gen III / Emerald). Загружаешь `.sav`, сервер парсит имя тренера и партию, рендерит «карточку тренера» и даёт расшарить её в общий фид. На карточке есть *team chant* — никнеймы покемонов из партии, склеенные в одну строку. Эта строка подставляется в ERB-шаблон и рендерится на сервере: ```ruby @card = ERB.new("A wild cheer erupts: #{box['chant']}!").result(binding) ``` `chant` контролируется атакующим (это никнеймы из загруженного сейва) → **ERB SSTI**. Код исполняется от пользователя `app`, который читает `/flag.txt`. Фишка в том, что пейлоад надо протащить через формат сейва Gen III: 1. **Проприетарная кодировка символов.** Имена в сейве не ASCII — своя таблица (`0xA1–0xAA` цифры, `0xBB–0xD4` верхний регистр, `0xD5–0xEE` нижний, плюс пунктуация; поле терминируется `0xFF`). Таблица содержит `< % = > ( ) . ' /`, поэтому `<%= ... %>` записать можно; но нет бэктика и `*`, что уводит к `IO.read('/flag.txt')`. 2. **Ограничение длины поля + конкатенация.** Никнейм — всего 10 байт, а пейлоад `<%=IO.read('/flag.txt')%>` — 25 символов. Карточка склеивает никнеймы всей партии без разделителя, так что один ERB-тег **разбивается на трёх покемонов** (`<%=IO.read` + `('/flag.tx` + `t')%>`). Сырую склейку viewer показывает — то есть подсказка видна. Секции сейва проверяются по контрольной сумме Gen III (сумма 32-битных слов, свёрнутая в 16 бит), так что отредактированный сейв должен нести корректную сумму. См. [solve/gen3save.py](solve/gen3save.py). ## Решение [solve/solve.py](solve/solve.py) — регистрирует тренера, собирает сейв с пейлоадом в никнеймах партии, загружает, шарит бокс, читает флаг с карточки. Подробности в [solve/WRITEUP.md](solve/WRITEUP.md). ## Флаг Кладётся платформой в `/flag.txt` при деплое (в образе заглушка `ctfcup{test_flag}`).