Эксплоит может быть скриптом на любом языке или бинарным исполняемым файлом.
При написании эксплоита:
-
Принимайте хост (IP или домен) атакуемой команды в первом аргументе командной строки (
sys.argv[1]
). -
Выводите флаги в stdout или stderr. Кроме флагов, туда можно выводить и любую другую информацию.
Флаги извлекаются из stdout и stderr с помощью регулярного выражения (формата флага), заданного в файле config.py на сервере фермы (например,
[A-Z0-9]{31}=
на RuCTF(E)). -
Указывайте интерпретатор, если эксплоит является скриптом. В случае Linux и macOS добавьте в начало файла shebang:
#!/usr/bin/env python3
Не пишите
#!/usr/bin/python3
(например, на macOS интерпретатор расположен в другом месте).В случае Windows клиент фермы попытается сам определить интерпретатор по расширению файла (см. таблицу
SCRIPT_EXTENSIONS
). Если ему не удастся сделать это правильно, укажите интерпретатор явно через опцию--interpreter
. -
После вывода флагов добавляйте перевод строки и выполняйте
flush(stdout)
:print(html_with_flags, flush=True)
Без этого часть флагов может быть потеряна. А именно, в случае, когда клиент фермы «убивает» долго работающие процессы, флаги останутся в буфере stdout эксплоита и не будут прочитаны клиентом фермы.