Skip to main content

Матрешка: writeup

ссылка на задание http://f8tasks.ru/challenges#%D0%9C%D0%B0%D1%82%D1%80%D0%B5%D1%88%D0%BA%D0%B0-39

Матрешка

CategoryCrypto
DifficultyEasy
EncodingBase64 → Base32 → Hex
Flagflag{cryptograph}

Recon

Единственный артефакт задачи:

R1laVE9NUlhIRTNUQU5aVUdaVERNTlpYR0kzRENOWlFHWTRBPT09PQ==

Внешние признаки строки:

  • алфавит из латинских букв и цифр
  • паддинг == в конце
  • длина 60 символов — кратна 4

Это структурные маркеры Base64 — стандартного бинарно-текстового кодирования, где каждые 3 байта данных превращаются в 4 символа из алфавита A–Z a–z 0–9 + /. Само название задачи — честная подсказка: внутри одного слоя лежит следующий.


Послойное декодирование

Base64, Base32 и Hex — обратимые кодирования без ключа. Для декодирования ключ не нужен: достаточно знать формат. Каждый слой узнаётся по структуре строки.

Шаг 1. Base64

Алгоритм Base64 кодирует группами по 3 байта → 4 символа. Ручной расчёт первой группы R1la:

СимволИндекс в Base64Биты (6 бит)
R17010001
153110101
l37100101
a26011010

Склеиваем 24 бита → три байта:

01000111 01011001 01011010
  0x47     0x59     0x5A
   'G'      'Y'      'Z'

Весь результат после Base64-декодирования:

GYZTOMRXHE3TANZUGZTDMNZXGI3DCNZQGY4A====

Признаки следующего слоя: алфавит строго A–Z и 2–7, паддинг ==== — это Base32.

Шаг 2. Base32

Base32 кодирует группами по 5 байт → 8 символов. Первые три символа результата для примера (GYZ):

СимволЗначение
G6
Y24
Z25

Результат после Base32-декодирования:

63727970746f6772617068

Признаки следующего слоя: только символы 0–9 и a–f, чётная длина — это hex.

Шаг 3. Hex → ASCII

0x63 = 99 — код символа c в таблице ASCII. Первые три байта:

HexДесятичноеASCII
6399c
72114r
79121y

Полная строка: cryptograph


Decryption

ШагДействиеВход → Выход
1Base64 decodeR1laVE9N…PQ==GYZTOMRX…====
2Base32 decodeGYZTOMRX…====63727970…7068
3Hex decode63727970…7068cryptograph
4Обернуть в флагcryptographflag{cryptograph}

Automation

import base64


PAYLOAD = "R1laVE9NUlhIRTNUQU5aVUdaVERNTlpYR0kzRENOWlFHWTRBPT09PQ=="


def main() -> None:
    layer1 = base64.b64decode(PAYLOAD).decode()   # снимаем Base64 → получаем Base32-строку
    layer2 = base64.b32decode(layer1).decode()    # снимаем Base32 → получаем hex-строку
    layer3 = bytes.fromhex(layer2).decode()       # hex → ASCII-текст

    print(layer3)
    print(f"flag{{{layer3}}}")


if __name__ == "__main__":
    main()
python3 solve.py
# cryptograph
# flag{cryptograph}

Key Takeaways

  1. Кодирование vs шифрование. Base64, Base32 и Hex — обратимые кодирования без ключа, а не шифры. Они не скрывают данные, а только меняют их представление. Ключ для декодирования не нужен.

  2. Структурные маркеры форматов. Base64 опознаётся по алфавиту и паддингу =, Base32 — по алфавиту A–Z 2–7 и паддингу ====, Hex — по алфавиту 0–9a–f и чётной длине. Анализ структуры строки — первый шаг перед любым действием.

  3. Послойный анализ. После каждого декода нужно заново классифицировать результат. Остановиться после первого слоя — типичная ошибка новичка. CTF-задачи на «матрёшку» специально тренируют эту дисциплину.