← Все комнаты Путь «Реверс» →
ЭкспертРеверс Флаг Осенний CTF

XOR с таблицей

Прогресс комнаты 0 / 4
Задание 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Практика: найдите флаг
Данные задания1417 символов
SBOX = [106, 178, 186, 37, 32, 2, 254, 154, 115, 243, 83, 27, 248, 25, 218, 122, 91, 216, 123, 105, 184, 173, 64, 200, 255, 66, 28, 219, 44, 59, 49, 247, 99, 240, 85, 96, 227, 41, 94, 251, 190, 60, 100, 81, 82, 112, 67, 168, 188, 4, 198, 39, 181, 77, 214, 239, 231, 152, 97, 3, 225, 120, 86, 176, 217, 203, 8, 197, 7, 241, 234, 13, 213, 187, 245, 224, 71, 58, 6, 156, 65, 193, 40, 196, 207, 47, 68, 159, 167, 0, 229, 128, 175, 75, 177, 1, 139, 84, 103, 102, 238, 145, 157, 133, 199, 153, 45, 53, 135, 183, 124, 110, 130, 104, 150, 113, 35, 70, 51, 226, 21, 191, 151, 237, 117, 132, 50, 179, 33, 169, 55, 206, 172, 29, 43, 90, 118, 5, 88, 98, 72, 170, 79, 192, 194, 121, 69, 233, 235, 195, 202, 189, 89, 162, 185, 201, 215, 19, 10, 164, 125, 253, 171, 42, 212, 131, 209, 249, 155, 73, 114, 87, 126, 134, 180, 221, 20, 62, 204, 63, 76, 92, 116, 220, 119, 80, 109, 136, 205, 127, 52, 158, 222, 228, 16, 182, 140, 246, 95, 48, 163, 208, 148, 26, 46, 174, 143, 78, 146, 30, 138, 36, 236, 74, 34, 142, 11, 56, 250, 252, 223, 147, 230, 244, 160, 161, 57, 31, 144, 211, 15, 108, 141, 23, 61, 17, 107, 111, 22, 9, 54, 129, 232, 14, 149, 93, 24, 137, 210, 18, 12, 166, 101, 38, 242, 165]

def check(key):
    if len(key) != 21:
        return False
    data = [ord(ch) ^ SBOX[i & 0xFF] for i, ch in enumerate(key)]
    return data == [41, 230, 252, 94, 83, 93, 156, 170, 11, 172, 43, 43, 138, 70, 169, 14, 41, 235, 79, 4, 197]
Войдите, чтобы ответить

Пошаговый план — открывайте по одному шагу

  1. 1
    Найдите в коде массив, с которым сравнивается результат, и формулу f(c, i) (где c = ord(key[i])).

Подсказки — каждая до решения стоит −100 очков

Задание 4Как защититься

Проверка ключа на стороне клиента бесполезна: код доступен и обратим. Лицензии и секреты проверяйте на сервере, а код — обфусцируйте лишь как дополнительный барьер, не как защиту.

Разборы участников

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