Повороты битов
Прогресс комнаты
0 / 4
Задание 1Введение
Цель: Обращать цепочку битовых операций.
Ещё одна проверка ключа, на этот раз с циклическим сдвигом битов. Восстановите ключ, обратив каждую операцию.
Задание 2Теория и инструменты
Циклический сдвиг rol8(x, 3) переносит выпавшие слева биты вправо. Обратная операция — сдвиг на 5 (8 − 3).
Программа делает три шага: прибавляет позицию i, XOR с 0x5A, сдвигает биты. Обращаем в обратном порядке.
Инструменты
- Python:
<<,>>,|,& 0xFF
Больше теории — в разделе «Обучение: Реверс».
Задание 3Практика: найдите флаг
def rol8(x, r):
return ((x << r) | (x >> (8 - r))) & 0xFF
def check(key):
if len(key) != 31:
return False
out = [rol8(((ord(c) + i) & 0xFF) ^ 0x5A, 3) for i, c in enumerate(key)]
return out == [200, 120, 144, 33, 225, 99, 1, 225, 1, 27, 33, 43, 214, 35, 35, 57, 169, 192, 254, 65, 230, 144, 182, 128, 134, 182, 136, 57, 150, 80, 14]
Пошаговый план — открывайте по одному шагу
- 1Найдите эталонный список и все операции в функции.
- 2Отмените сдвиг:
rol8(x, 5). - 3Отмените XOR:
^ 0x5A. - 4Отмените сложение:
− i, затем& 0xFF. - 5Переведите числа в символы.
Подсказки — каждая до решения стоит −50 очков
Задание 4Как защититься
Как и любая клиентская проверка, обфускация лишь замедляет реверс. Секреты не должны жить в клиенте.
Разборы участников
Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.