Разбор: 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.