Райтап на задачу «Bogosort»

lol

Автор:

lol

6 ноября 2026

5

06.11.2026
Bogosort
Категория:

Rev

Задача «Bogosort»

LastTeamLead

Автор:

LastTeamLead

Первая кровь:
velvetway
Сложность:
medium
Дата публикации:
29.11.2025
Решений:
90
Рейтинг:
4.95/5
Ссылка:
Решать

Так, подождать (ничего не делая получить флажок) или вспомнить геометрию. Как по мне, выбор должен быть очевиден, вопрос — сколько придётся ждать. К сожалению, чтобы это выяснить, придётся покопаться в таске( По базе для начала проверяем файл одноимённой командой на линухе «file»:

Решение задачи «Bogosort»: иллюстрация 1

Ура, не стрипнутый, значит, самое время открывать гидру и копаться в этой проге:

Решение задачи «Bogosort»: иллюстрация 2

Понятное дело, что нам нужно открывать первым, разумеется, функцию main. О боже, мне кажется, я вижу что-то похожее на флаг. Теперь давайте разберёмся, как работает эта прога, и получим настоящий флажок.

Решение задачи «Bogosort»: иллюстрация 3

А это и есть та самая причина, по которой он будет собираться «долго». Тут придётся не просто подождать, а выиграть в такой прикольной лотерее успеха, как 1 / 36! ≈ 1 / 3.72e41. Для понимания хочу прояснить, что даже при миллиарде перемешиваний в секунду на это уйдёт 10 в 25-й СТЕПЕНИ лет) Так что у нас один выход — решать руками))

Решение задачи «Bogosort»: иллюстрация 4

Самое важное, что мы можем отсюда извлечь: target[i] == sin(ascii(s[i]) * π / 180), а по факту → target[i] = sin(угол_в_градусах_равный_ASCII_коду_символа). Теперь давайте посмотрим, что за target такой интересный:

Решение задачи «Bogosort»: иллюстрация 5

Но перед нами встаёт неоднозначность: для каждого нашего значения есть два кандидата: 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")
Решение задачи «Bogosort»: иллюстрация 6

Радуемся, что не пришлось умирать сотни миллиардов раз ради флажка)))

Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Зона риска»

/Разборы задач

Райтап на задачу «Зона риска»

Разбираем генератор ключа и обращаем шифрование в исполняемом файле, чтобы восстановить флаг.
Прочитать

6

Райтап на задачу «ЗаБАГованная башня»

/Разборы задач

Райтап на задачу «ЗаБАГованная башня»

Решаем ханойскую башню, исследуем сборку ключа и разбираем патч исполняемого файла.
Прочитать

4