Mathin
Mathin
| Category | Joy |
| Difficulty | Easy |
| Метод | Графическое декодирование |
| Flag | flag{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 |
:
$$-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
- $$x^2 + y^2 = r^2$$$$x \ge 0$$
оставляет только правый полукруг. Форма возникает не из одного уравнения, а из уравнения плюс ограничения.
Математические кривые как алфавит. Прямая, парабола и окружность с нужными ограничениями достаточны, чтобы нарисовать любую букву латиницы. Постановщик задачи — по сути художник, рисующий формулами.
Ловушка: искать шифр там, где его нет. Привычный CTF-рефлекс — искать алгоритм декодирования. Здесь никакого шифра нет:
Math.txtнапрямую «рисует» флаг. Участники, потратившие время на Base64, ROT13 и XOR уравнений, зашли не туда. Первый шаг — построить, а не декодировать.
