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

Разбор: filter с отбора X Кубка CTF

Условие: pwn с меткой beginner. Сервис принимает шелл-код, прогоняет его через крошечный трансформер и исполняет из RWX-буфера, если модель считает код безопасным. По таблице организаторов задание решили 450 раз.

Что ищет фильтр

Байты Инструкция
0f 05 syscall
cd 80 int 0x80
0f 34 sysenter

Код с такой парой байтов получает score +20 и отклоняется.

Ход решения

  • Заметить, что буфер доступен и на запись, и на исполнение
  • Положить в код два безобидных байта 90 90
  • Во время работы двумя отдельными записями заменить их на 0f и 05
  • Провалиться исполнением в эти байты: теперь это syscall

Модель видит статичный код: на этом месте у неё 90 90, score -10, и сервис исполняет код. Пейлоад авторов занимает 42 байта.

Что вынести

Статическая проверка видит только то, что прислано, а не то, чем код станет в работе. Смотрите, какие права у буфера.

Пример

Пример условный. Команда сначала выписывает, что именно считает фильтр, и только потом пишет эксплойт: отдельная проверка на три пары байтов занимает минуты.

Чек-лист

  • ☐ Понятно, что проверяет фильтр
  • ☐ Права буфера проверены
  • ☐ Сборка не содержит запрещённых пар
  • ☐ Приём записан в разбор команды

Документ уже составлен

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

Основание: условие и решение авторов задачи, репозиторий acisoru/ctfcup2026-quals, pwn/filter. Канал не принадлежит организаторам; официальный сайт — ctfcup.ru.

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