Разбор: Traverse с отбора X Кубка CTF
Условие: hardware и reverse с меткой beginner. Дан битстрим для Lattice iCE40 HX1K и run.py, который запускает его без железа. По таблице организаторов задание решили 390 раз.
Что внутри
- UART 115200 8N1
- Автомат с 8-битным регистром состояния
- Цепочка из 41 состояния читает флаг
- Ложные ветки на 97 состояний заканчиваются в мёртвом состоянии
- По переводу строки плата отвечает s или f
Ход решения
- Распаковать битстрим: iceunpack и icebox_vlog дают нетлист
- Взять симуляцию как оракул с доступом к регистрам
- Снимать срез всех триггеров после отправки строки
- Понять, как выглядит мёртвое состояние: одинаковый срез, если не считать регистры последнего байта
- Пустить поиск в ширину по префиксам и проверять кандидаты отправкой перевода строки
Решение авторов работает около 6–7 минут.
Что вынести
Там, где нет понятного кода, ищите наблюдаемое состояние. Его хватает, чтобы отличить живой префикс от мёртвого.
Пример
Пример условный. Один участник читает нетлист и ищет 8 триггеров регистра, второй уже собирает перебор на симуляции. Какая дорожка окажется быстрее, заранее неизвестно.
Важно. Авторы оставляют и статический путь: найти регистр состояния и логику сравнения байта с константами. Метод выбирайте по тому, что быстрее у вашей команды.
Для разбора в команде
- ☐ Инструменты icestorm поставлены
- ☐ Снят срез мёртвого состояния
- ☐ Перебор сохранён скриптом
- ☐ Приём записан в базу разборов
Запишите в шаблон разбора, какой путь выбрали и что увидели 👇
Основание: условие и решение авторов задачи, репозиторий acisoru/ctfcup2026-quals, hardware/traverse. Канал не принадлежит организаторам; официальный сайт — ctfcup.ru.