Райтап на задачу «Закодированный дед»

syonkaio

Автор:

syonkaio

31 октября 2026

6

31.10.2026
Закодированный дед
Категория:

Crypto

Задача «Закодированный дед»

Автор:

LastTeamLead

Первая кровь:
CtREL0K
Сложность:
easy
Дата публикации:
22.11.2025
Решений:
142
Рейтинг:
4.8/5
Ссылка:
Решать

Ну, начнём.

Смотрим, что за файл прикреплён к задаче.

Видим ZIP — разархивируем.

Содержимое архива с XOR-шифрованием BMP

Видим изображение в формате 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 в 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.

XOR первых байтов в калькуляторе

Получаем 64. Делаем так со всеми байтами. Получаем — 64 65 61 64 65 6E 63 6F 64 65. Открываем CyberChef в браузере и закидываем полученные байты, выбираем рецепт From HEX — получаем — deadencode — это и есть наш ключ. Опять открываем CyberChef вставляем наш BMP в поле Input, выбираем XOR, в нём вписываем наш ключ deadencode, указываем формат ключа UTF-8.

Расшифровка изображения с ключом deadencode в CyberChef

Сохраняем новую картинку в формате BMP и открываем её.

Восстановленное BMP-изображение

Победа — флаг найден.

Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Ах#енный зум»

/Разборы задач

Райтап на задачу «Ах#енный зум»

Разбираем Yellow Tracking Dots и восстанавливаем данные, спрятанные в сетке жёлтых точек.
Прочитать

6

Райтап на задачу «Импортозамещение»

/Разборы задач

Райтап на задачу «Импортозамещение»

Преобразуем русский алфавит в символы Base64 и декодируем скрытую строку.
Прочитать

5