/Разборы задач
31 октября 2026
Райтап на задачу «Ах#енный зум»
Разбираем Yellow Tracking Dots и восстанавливаем данные, спрятанные в сетке жёлтых точек.6
6

Crypto
Задача «Закодированный дед»
Ну, начнём.
Смотрим, что за файл прикреплён к задаче.
Видим ZIP — разархивируем.
Видим изображение в формате BMP (это интересно)
Пробуем открыть — не получается.
Открываем encrypt.py.
Видим:
import argparse
import os
def xor_encrypt_bmp_advanced(input_file, output_file, key):
try:
if not os.path.exists(input_file):
print(f"Ошибка: файл {input_file} не найден")
return False
with open(input_file, 'rb') as f:
bmp_data = bytearray(f.read())
key_bytes = key.encode('utf-8')
key_length = len(key_bytes)
start_index = 0
for i in range(start_index, len(bmp_data)):
bmp_data[i] ^= key_bytes[(i - start_index) % key_length]
with open(output_file, 'wb') as f:
f.write(bmp_data)
print(f"Успешно: {input_file} -> {output_file}")
print(f"Размер файла: {len(bmp_data)} байт")
print(f"Зашифровано байт: {len(bmp_data) - start_index}")
return True
except Exception as e:
print(f"Произошла ошибка: {e}")
return False
def main():
parser = argparse.ArgumentParser(description='Шифрование BMP изображения с помощью XOR')
parser.add_argument('input', help='Входной BMP файл')
parser.add_argument('-o', '--output', help='Выходной файл', default='encrypted.bmp')
parser.add_argument('-k', '--key', help='Ключ для XOR', default='xxxxxxxxxx')
args = parser.parse_args()
xor_encrypt_bmp_advanced(
input_file=args.input,
output_file=args.output,
key=args.key
)
# python encrypt.py image.bmp -o encrypted.bmp -k "ключ-длиной-10-байт"
if __name__ == "__main__":
main()Из кода видно, что шифрование — XOR.
Теперь нам надо восстановить ключ, когда мы знаем, каким методом у нас зашифрован BMP.
Проверим побайтово нашу картинку с помощью HxD.
Проверим, как начинается стандартная картинка в BMP, так как байты устроены так, что начало — это обозначение формата в нашем случае BM, побайтово — 42 4D возвращаемся к нашему побайтовому разбору картинки и видим, что уже не сходится у нас — 26 28, делаем выводы, что надо продолжать и мы получим заветный ключ. Далее побайтово записан размер файла, его мы тоже знаем 3 072 138 байт — переводим в шестнадцатеричный вид (младшим байтом вперёд, так как заголовок BMP) получаем — 8A E0 2E 00.
Таким образом, мы знаем первые 10 байт исходного BMP — 42 4D 8A E0 2E 00 00 00 00 00, теперь смотрим на первые 10 байт нашего изображения и видим 26 28 EB 84 4B 6E 63 6F 64 65.
Открываем калькулятор, выбираем режим «Программист» и вводим наши первые байты туда с шифрованием XOR.
Получаем 64. Делаем так со всеми байтами. Получаем — 64 65 61 64 65 6E 63 6F 64 65. Открываем CyberChef в браузере и закидываем полученные байты, выбираем рецепт From HEX — получаем — deadencode — это и есть наш ключ. Опять открываем CyberChef вставляем наш BMP в поле Input, выбираем XOR, в нём вписываем наш ключ deadencode, указываем формат ключа UTF-8.
Сохраняем новую картинку в формате BMP и открываем её.
Победа — флаг найден.