Матрешка: writeup
ссылка на задание http://f8tasks.ru/challenges#%D0%9C%D0%B0%D1%82%D1%80%D0%B5%D1%88%D0%BA%D0%B0-39
Матрешка
| Category | Crypto |
| Difficulty | Easy |
| Encoding | Base64 → Base32 → Hex |
| Flag | flag{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 бит) |
|---|---|---|
R | 17 | 010001 |
1 | 53 | 110101 |
l | 37 | 100101 |
a | 26 | 011010 |
Склеиваем 24 бита → три байта:
01000111 01011001 01011010
0x47 0x59 0x5A
'G' 'Y' 'Z'
Весь результат после Base64-декодирования:
GYZTOMRXHE3TANZUGZTDMNZXGI3DCNZQGY4A====
Признаки следующего слоя: алфавит строго A–Z и 2–7, паддинг ==== — это Base32.
Шаг 2. Base32
Base32 кодирует группами по 5 байт → 8 символов. Первые три символа результата для примера (GYZ):
| Символ | Значение |
|---|---|
G | 6 |
Y | 24 |
Z | 25 |
Результат после Base32-декодирования:
63727970746f6772617068
Признаки следующего слоя: только символы 0–9 и a–f, чётная длина — это hex.
Шаг 3. Hex → ASCII
0x63 = 99 — код символа c в таблице ASCII. Первые три байта:
| Hex | Десятичное | ASCII |
|---|---|---|
63 | 99 | c |
72 | 114 | r |
79 | 121 | y |
Полная строка: cryptograph
Decryption
| Шаг | Действие | Вход → Выход |
|---|---|---|
| 1 | Base64 decode | R1laVE9N…PQ== → GYZTOMRX…==== |
| 2 | Base32 decode | GYZTOMRX…==== → 63727970…7068 |
| 3 | Hex decode | 63727970…7068 → cryptograph |
| 4 | Обернуть в флаг | cryptograph → flag{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
Кодирование vs шифрование. Base64, Base32 и Hex — обратимые кодирования без ключа, а не шифры. Они не скрывают данные, а только меняют их представление. Ключ для декодирования не нужен.
Структурные маркеры форматов. Base64 опознаётся по алфавиту и паддингу
=, Base32 — по алфавитуA–Z 2–7и паддингу====, Hex — по алфавиту0–9a–fи чётной длине. Анализ структуры строки — первый шаг перед любым действием.Послойный анализ. После каждого декода нужно заново классифицировать результат. Остановиться после первого слоя — типичная ошибка новичка. CTF-задачи на «матрёшку» специально тренируют эту дисциплину.
