/Разборы задач
6 ноября 2026
Райтап на задачу «Учебная граната»
Распаковываем 1015 вложенных ZIP-архивов и собираем скрытое сообщение из имён файлов.5
7

Misc
Задача «Гесс вот (Guess what)»
Откроем консоль и подключимся к серверу.
Мы можем вводить символы, и нам показывает, где у нас «ошибка». Таким образом, мы можем подобрать, какую же строку от нас всё-таки хотят, но вручную это делать очень долго, поэтому вооружаемся питоном.
Мы можем сделать тупой перебор, и это даже сработает. Это займёт примерно 1050 запросов. Мы создаём сокет, подключаемся к серверу, перебираем символы нашего ASCII-алфавита с +/=, т. к. это Base64 и, например, = может уйти в паддинги. Смотрим на «ошибка на позиции Х» и продолжаем подбирать, пока не получим флаг.
import base64, re, socket, string, time, sys
HOST, PORT = "guess-what.t1.bug-makers.ru", 20002
ALPHABET = string.ascii_uppercase + string.ascii_lowercase + string.digits + "+/="
def pos(r):
m = re.search(rb"mistake at position (\d+)", r)
return int(m.group(1)) if m else None
s = socket.create_connection((HOST, PORT))
def recv():
buf = b""
while not (b"guess the string:" in buf or b"BugCTF{" in buf):
chunk = s.recv(4096)
if not chunk:
sys.exit(1)
buf += chunk
return buf
recv()
known, reqs, t0 = "", 0, time.time()
while True:
i = len(known)
for ch in ALPHABET:
reqs += 1
s.sendall((known + ch + "\n").encode())
r = recv()
print(known+ch)
if b"BugCTF{" in r:
print("WIN после", reqs, "запросов за", round(time.time() - t0, 1), "s")
print("секрет:", known + ch, "=", base64.b64decode(known + ch))
print(r.decode('utf-8'))
sys.exit(0)
p = pos(r)
if p is not None and p > i:
known += ch
break
Теперь, когда мы подобрали втупую эту строку, попробуем понять, из чего она состоит. Это Base64 от следующей строки: «[случайные_hex_символы] [ip 10.42.0.0] [YYYY-MM-DD] [HH:MM:SS]», например «309 10.42.0.0 2026-11-06 00:12:27». Мы явно видим части, которые можно оптимизировать, например дату, примерное время и айпи-адрес. Мы можем считать их заранее и проверять целый блок, а не перебирать каждый Base64-символ. Таким образом, мы можем заметно ускорить время решения задачи.
Если будете писать собственные скрипты, не забудьте про UTF-8, иначе будут отображаться некоторые не-ASCII-символы в флаге.
Итак, теперь, если мы запустим наш скрипт, то после успешного подбора мы получим:
Задача со звёздочкой для тех, кто любит программировать, — оптимизировать скрипт, чтобы он подбирал по целым известным блокам. А для флага можно и подождать ~70 секунд.