Участники могли отправить сетевой запрос к Python-скрипту, который создавал новый Python-скрипт cо случайными именем, добавлял поступившие от пользователя данные в текст комментария, вырезав символы «n» и «r», и запускал этот скрипт командой «python3 имя.py». Контролируя только содержимое комментария участник должен был извлечь строку из файла «/home/ctfuser/flag». Скрипт создавался следующим кодом:
comment = input("› ").replace("n", "").replace("r", "") code = f"""print("hello world!") # This is a comment. Here's another: # {comment} print("Thanks for playing!")"""
Вместо «{comment}» подставлялись данные, поступившие от участника, и в итоге запускался следующий код:
print("hello world!") # This is a comment. Here's another: # Данные, поступившие от участника соревнования print("Thanks for playing!")
Задание было сформировано по мотивам уязвимости в парсере CPython, который обрабатывал символ с нулевым кодом, как окончание строки. В применяемом в конкурсе обработчике вырезались только символы «n» и «r», но при использовании уязвимой версии СPython участник мог использовать символ «