🔥 300+ участников, динамический скоринг в CTFd, и база данных —
SQLite по дефолту. Именно так выглядит рецепт катастрофы на реальном Jeopardy. Скорборд лёг через сорок минут после старта: динамический скоринг пересчитывал стоимость тасков при каждом сабмите, а SQLite просто не справился с нагрузкой. Итог — перезапуск, миграция на PostgreSQL, потеря двух раундов и час разборок в чате. Одна конфигурационная ошибка, которую тест за 10 минут поймал бы ещё до старта.Организация CTF — это инженерная задача, а не «закинул таски на платформу и открыл регистрацию». Каждая деталь имеет значение.
⚙️ Три формата — три разных уровня боли
Jeopardy — самый доступный старт. Команды решают независимые таски из категорий web, crypto, pwn, reverse, forensics и других, сдают флаги вида
flag{s0m3_t3xt} и получают очки. Масштабируется от 10 до 1000+ команд без изменения инфраструктуры. Главная трудность здесь — не сервера, а сами задания. Каждый таск нужно проверить на unintended-решения: один реальный кейс — таск по crypto за 500 очков решался командой strings на бинарнике, потому что автор забыл убрать дебаг-вывод. Второй автор нашёл бы это за минуту.Attack-Defense — совсем другая история. Каждая команда получает идентичный уязвимый сервер (vulnbox) и одновременно атакует противников и защищает себя. Игра идёт по тикам — раундам длиной 1-5 минут. Отошёл на обед — потерял 20 тиков. Классическая ловушка: команда блокирует все входящие соединения через
iptables -P INPUT DROP и радуется, что её «не сломают». Через тик gameserver фиксирует DOWN — и SLA-очки улетают в ноль. Нельзя просто выключить сервис и стать неуязвимым: в этом и есть главный баланс формата.🛡 Скоринг: где ошибаются чаще всего
Статический скоринг прост: 100 очков за easy, 500 за hard. Но если организатор ошибся в оценке сложности и «хард» решили 80% команд — баланс турнирной таблицы рушится. Динамический скоринг решает эту проблему: чем больше команд решило таск, тем меньше он стоит. Но именно здесь живёт та самая история с
SQLite — при большом потоке сабмитов база данных просто не выдерживает. Мигрируй на PostgreSQL до старта, а не во время.💡 Хочешь разобрать полную механику скоринга, античит и выбор инфраструктуры — читай статью целиком.
https://codeby.net/threads/organizatsiya-ctf-sorevnovanii-formaty-skoring-i-antichit-na-praktike.92940/
