Линейный XOR
Задание 1Введение
Цель: Обращать позиционное преобразование: «Линейный XOR».
Программа проверяет лицензионный ключ — это и есть флаг. Функция позиционная: data[i] = f(ord(key[i]), i). Восстановите ключ по коду, не перебирая весь ключ целиком.
Задание 2Теория и инструменты
Многие проверки ключа применяют к каждому символу обратимую операцию, зависящую от позиции: сдвиг, XOR, умножение на нечётное число, поворот битов, подстановку по таблице.
Если символ i зависит только от ord(key[i]) и i, ключ восстанавливается независимо по каждой позиции — перебором печатных символов, а не всего ключа.
Инструменты
- Python: цикл
for c in range(32, 127) - Отладчик (gdb / pdb) или просто чтение кода
- CyberChef для проверки гипотез
Больше теории — в разделе «Обучение: Реверс».
Задание 3Практика: найдите флаг
def check(key):
if len(key) != 24:
return False
data = [ord(ch) ^ ((i*13 + 0x5A) & 0xFF) for i, ch in enumerate(key)]
return data == [25, 51, 50, 250, 226, 170, 198, 134, 246, 189, 131, 145, 198, 113, 79, 110, 73, 95, 119, 53, 43, 7, 75, 248]
Пошаговый план — открывайте по одному шагу
- 1Найдите в коде массив, с которым сравнивается результат, и формулу
f(c, i)(гдеc = ord(key[i])). - 2Убедитесь, что символ на позиции i зависит только от своего кода и индекса i — функция позиционная.
- 3Для каждой позиции i переберите печатные коды 32–126 и оставьте тот, при котором
f(c, i)даёт нужный байт. - 4Соберите найденные символы по порядку — это ключ (флаг).
Подсказки — каждая до решения стоит −50 очков
Задание 4Как защититься
Проверка ключа на стороне клиента бесполезна: код доступен и обратим. Лицензии и секреты проверяйте на сервере, а код — обфусцируйте лишь как дополнительный барьер, не как защиту.
Разборы участников
Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.