/Разборы задач
6 ноября 2026
Райтап на задачу «Зона риска»
Разбираем генератор ключа и обращаем шифрование в исполняемом файле, чтобы восстановить флаг.6
5

Rev
Задача «Bogosort»
Так, подождать (ничего не делая получить флажок) или вспомнить геометрию. Как по мне, выбор должен быть очевиден, вопрос — сколько придётся ждать. К сожалению, чтобы это выяснить, придётся покопаться в таске( По базе для начала проверяем файл одноимённой командой на линухе «file»:
Ура, не стрипнутый, значит, самое время открывать гидру и копаться в этой проге:
Понятное дело, что нам нужно открывать первым, разумеется, функцию main. О боже, мне кажется, я вижу что-то похожее на флаг. Теперь давайте разберёмся, как работает эта прога, и получим настоящий флажок.
А это и есть та самая причина, по которой он будет собираться «долго». Тут придётся не просто подождать, а выиграть в такой прикольной лотерее успеха, как 1 / 36! ≈ 1 / 3.72e41. Для понимания хочу прояснить, что даже при миллиарде перемешиваний в секунду на это уйдёт 10 в 25-й СТЕПЕНИ лет) Так что у нас один выход — решать руками))
Самое важное, что мы можем отсюда извлечь: target[i] == sin(ascii(s[i]) * π / 180), а по факту → target[i] = sin(угол_в_градусах_равный_ASCII_коду_символа). Теперь давайте посмотрим, что за target такой интересный:
Но перед нами встаёт неоднозначность: для каждого нашего значения есть два кандидата: c & 180 − c. Как же нам быть в такой ситуации? А всё очень просто, мы возвращаемся к нашей главной функции — main. Там нам дана анаграмма флага, именно по ней мы сможем корректно восстановить флаг.
i=0 target=0.9135 angle=66 B/r -> B
i=1 target=0.8910 angle=63 ?/u -> u
i=2 target=0.9744 angle=77 M/g -> g
i=3 target=0.9205 angle=67 C/q -> C
i=4 target=0.9945 angle=84 T/` -> T
i=5 target=0.9397 angle=70 F/n -> F
i=6 target=0.8387 angle=57 9/{ -> {Т. к. мы знаем начало флага, мы можем это проверить руками, как представлено выше. Либо у нас есть ещё другой вариант — автоматизировать это дело и написать скриптик прямо в терминале, который будет выглядеть следующим образом:
import math
import struct
from collections import Counter
BIN = "/home/lol/Загрузки/bogosort"
data = open(BIN, "rb").read()
targets = struct.unpack_from("<36d", data, 0x2020)
anagram = Counter("4RB1CuR_Fa1c_s}{ToNg0tg_s1cBoutl0eNg")
out = []
for i, v in enumerate(targets):
deg = int(round(math.degrees(math.asin(v))))
cands = [c for c in {deg, 180 - deg} if 32 <= c <= 126]
cands = [c for c in cands if anagram[chr(c)] > 0]
if len(cands) != 1:
raise RuntimeError(f"ambiguous at {i}: {cands}")
ch = chr(cands[0])
anagram[ch] -= 1
out.append(ch)
flag = "".join(out)
print("FLAG:", flag)
assert all(
abs(math.sin(math.radians(ord(c))) - v) <= 1e-4
for c, v in zip(flag, targets)
)
print("OK: all 36 checks passed")Радуемся, что не пришлось умирать сотни миллиардов раз ради флажка)))