Skip to main content

Mathin

Mathin

CategoryJoy
DifficultyEasy
МетодГрафическое декодирование
Flagflag{ALGEBROV}

Recon

Дан файл Math.txt с восемью пронумерованными блоками математических уравнений и областей допустимых значений. Никаких программ, серверов и шифров — только формулы. Цель — построить каждый блок на координатной плоскости и прочитать получившиеся символы.

Артефакты: Math.txt, README.txt.

Math.txt — задание целиком:

1)
y=-x^2+5x
y=3
2)
При x>=0,y>=0:
    x=0
    y=0
3)
При x<=7,5:
    (x-4)^2+(y-4)^2=16
При 6<=x<=8:
    y=2
    y=6
4)
При 0<=x<=2,0<=y<=4:
    x=0
    y=0
    y=2
    y=4
5)
При x>=0,0<=y<=4:
    (x-0)^2+(y-1)^2=1
    (x-0)^2+(y-3)^2=1
    y=0
6)
При x>=0,0<=y<=4:
    y=-x+1
    (x-0)^2+(y-2)^2=1
    y=0
7)
    (x-0)^2+(y-0)^2=3
8)
    |x|

Ключевые наблюдения:

  • Восемь независимых блоков — ровно восемь символов.
  • Каждый блок описывает прямые, параболу или окружности с ограничениями на область: условие вида «при $$x \ge 0$$» не задаёт новую кривую, а обрезает существующую.
  • Цифры, скобки, знаки _ и { в CTF-флагах не шифруются — здесь шифром является сама геометрия.

Графическое декодирование

Графическое декодирование — способ передачи сообщения, при котором каждый символ закодирован набором геометрических кривых; чтобы прочитать текст, достаточно построить эти кривые и рассмотреть изображение.

$$0 \le x \le 5$$

— это уже буква A.

Разбор по блокам

УравненияГеометрияБуква
1$$y = -x^2+5x$$; $$y = 3$$Парабола-арка с корнями $$x=0$$, $$x=5$$ + горизонтальная перекладина на $$y=3$$A
2$$x=0$$, $$y=0$$ при $$x \ge 0$$, $$y \ge 0$$Вертикальный луч вверх + горизонтальный луч вправоL
3$$(x-4)^2+(y-4)^2=16$$ при $$x \le 7{,}5$$; $$y=2$$, $$y=6$$ при $$6 \le x \le 8$$Дуга окружности (почти C) с двумя горизонтальными засечками справаG
4$$x=0$$; $$y=0$$; $$y=2$$; $$y=4$$ при $$0 \le x \le 2$$, $$0 \le y \le 4$$Вертикальная стойка + три горизонтальные перекладиныE
5$$x^2+(y-1)^2=1$$; $$x^2+(y-3)^2=1$$; $$y=0$$ при $$x \ge 0$$, $$0 \le y \le 4$$Два правых полукруга («животы») + вертикальная основа по $$x=0$$B
6$$y=-x+1$$; $$x^2+(y-2)^2=1$$; $$y=0$$ при $$x \ge 0$$, $$0 \le y \le 4$$Правый полукруг (верхний «живот») + диагональная ножка + основаR
7$$x^2+y^2=3$$Полная окружность с центром в начале координатO
8$$y=\|x\|$$Угол «галочкой» с вершиной в начале координатV
$$Ox$$

:

$$-x^2 + 5x = 0 \implies x(5-x) = 0 \implies x_1=0,\; x_2=5$$$$x = 5/2 = 2{,}5$$$$y = -(2{,}5)^2 + 5 \cdot 2{,}5 = 6{,}25$$$$y = 3$$

пересекает её в двух точках — это «перекладина» буквы A.


Decryption

ШагДействиеРезультат
1Построить 8 блоков уравнений на плоскости8 геометрических фигур
2Прочитать каждую фигуру как букву слева направоA, L, G, E, B, R, O, V
3Сложить буквы в словоALGEBROV
4Обернуть в формат флагаflag{ALGEBROV}

Слово ALGEBROV — стилизованная фамилия «Алгебров», отсылающая к слову «алгебра», что напрямую связано с типом задачи.


Automation

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 4, figsize=(16, 8))
ax = axes.flatten()

# 1) A — парабола + горизонтальная перекладина
x = np.linspace(0, 5, 400)
ax[0].plot(x, -x**2 + 5*x, "b")        # арка из условия
ax[0].hlines(3, 0, 5, colors="b")       # перекладина y = 3
ax[0].set_title("1) A"); ax[0].set_aspect("equal"); ax[0].grid(True)

# 2) L — два луча из начала координат
ax[1].plot([0, 0], [0, 4], "b")         # вертикальный луч вверх
ax[1].plot([0, 4], [0, 0], "b")         # горизонтальный луч вправо
ax[1].set_title("2) L"); ax[1].set_aspect("equal"); ax[1].grid(True)

# 3) G — дуга окружности + две засечки справа
theta_cut = np.arccos((7.5 - 4) / 4)   # граничный угол при x = 7.5
theta = np.linspace(theta_cut, 2 * np.pi - theta_cut, 800)
ax[2].plot(4 + 4 * np.cos(theta), 4 + 4 * np.sin(theta), "b")  # дуга
ax[2].hlines(2, 6, 8, colors="b")       # нижняя засечка
ax[2].hlines(6, 6, 8, colors="b")       # верхняя засечка
ax[2].set_title("3) G"); ax[2].set_aspect("equal"); ax[2].grid(True)

# 4) E — вертикальная стойка + три горизонтальные перекладины
ax[3].vlines(0, 0, 4, colors="b")       # стойка
for y_bar in [0, 2, 4]:                 # три перекладины
    ax[3].hlines(y_bar, 0, 2, colors="b")
ax[3].set_title("4) E"); ax[3].set_aspect("equal"); ax[3].grid(True)

# 5) B — два правых полукруга + нижнее основание
theta_r = np.linspace(-np.pi / 2, np.pi / 2, 200)  # правая половина (x >= 0)
ax[4].plot(np.cos(theta_r), 1 + np.sin(theta_r), "b")  # нижний полукруг
ax[4].plot(np.cos(theta_r), 3 + np.sin(theta_r), "b")  # верхний полукруг
ax[4].hlines(0, 0, 1, colors="b")       # нижнее основание
ax[4].set_title("5) B"); ax[4].set_aspect("equal"); ax[4].grid(True)

# 6) R — правый полукруг + диагональная ножка + нижнее основание
ax[5].plot(np.cos(theta_r), 2 + np.sin(theta_r), "b")  # полукруг (верхний «живот»)
x_leg = np.linspace(0, 1, 200)
ax[5].plot(x_leg, -x_leg + 1, "b")      # ножка: y = -x + 1, от (0,1) до (1,0)
ax[5].hlines(0, 0, 1, colors="b")       # нижнее основание
ax[5].set_title("6) R"); ax[5].set_aspect("equal"); ax[5].grid(True)

# 7) O — полная окружность
theta_full = np.linspace(0, 2 * np.pi, 400)
r_o = np.sqrt(3)
ax[6].plot(r_o * np.cos(theta_full), r_o * np.sin(theta_full), "b")
ax[6].set_title("7) O"); ax[6].set_aspect("equal"); ax[6].grid(True)

# 8) V — модуль, y = |x|
x = np.linspace(-3, 3, 400)
ax[7].plot(x, np.abs(x), "b")
ax[7].set_title("8) V"); ax[7].set_aspect("equal"); ax[7].grid(True)

plt.tight_layout()
plt.savefig("algebrov.png", dpi=150)
plt.show()
print("flag{ALGEBROV}")
python3 solve.py
# Открывает окно с 8 графиками, сохраняет algebrov.png
# flag{ALGEBROV}

Key Takeaways

  1. $$x^2 + y^2 = r^2$$$$x \ge 0$$

    оставляет только правый полукруг. Форма возникает не из одного уравнения, а из уравнения плюс ограничения.

  2. Математические кривые как алфавит. Прямая, парабола и окружность с нужными ограничениями достаточны, чтобы нарисовать любую букву латиницы. Постановщик задачи — по сути художник, рисующий формулами.

  3. Ловушка: искать шифр там, где его нет. Привычный CTF-рефлекс — искать алгоритм декодирования. Здесь никакого шифра нет: Math.txt напрямую «рисует» флаг. Участники, потратившие время на Base64, ROT13 и XOR уравнений, зашли не туда. Первый шаг — построить, а не декодировать.