Кубок CTF России

Разбор: babymisc с отбора Кубка CTF 2025

Задача из раздела для начинающих. Участнику дают исходник на C и адрес сервиса. У игрока 1 000 монет, флаг стоит 13 371 337. Игрок делает ставку и угадывает число. Ставка списывается сразу; угадал — возвращают двойную ставку, не угадал — ставку списывают ещё раз.

Где ошибка

Программа проверяет ставку только сверху — не больше ли она денег на счёте. Проверки, что ставка положительная, нет. Отрицательное число проходит, и все операции со ставкой работают наоборот.

Как решать

  1. Ставка −13 371 337. Проверка «ставка больше денег» не срабатывает, а списание отрицательной ставки прибавляет её к счёту: 13 372 337
  2. Угадать число почти невозможно — шанс 1 из 100, и здесь это на руку: при проигрыше «ставку» списывают ещё раз, счёт растёт до 26 743 674
  3. В оставшихся раундах — ставка 0, чтобы ничего не менять. Денег больше цены флага — сервис его отдаёт

В описании задачи авторы называют тему так: переполнение int в C. Но авторское решение обходится без переполнения — хватает отрицательного числа.

Важно. Урок задачи: любое число от пользователя проверяйте с двух сторон. На attack-defense такие проверки — первое, что стоит искать и в чужих сервисах, и в своих.

Чек-лист

  • ☐ Выписать все места, где программа читает ввод
  • ☐ Для каждого числа проверить нижнюю и верхнюю границу
  • ☐ Посчитать, что будет при отрицательном и нулевом значении
  • ☐ Проверить, хватит ли типа int для итоговой суммы
  • ☐ Записать разбор для команды

Шаблон разбора уже есть

Открыть «Разбор задачи для команды CTF» →

Источник: репозиторий заданий отбора Кубка CTF 2025, tasks/beginners/babymisc (README, public/main.c, solve/solve.py). Флаг в записи не приводится. Сверено 02.11.2026.

Первоисточник