Главная / Блог / Кодировки в CTF: как отличить кодирование от шифрования и декодировать данные в CyberChef

14 мин.00

Кодировки в CTF: как отличить кодирование от шифрования и декодировать данные в CyberChef

Кодировки в CTF: как отличить кодирование от шифрования и декодировать данные в CyberChef

Кодировки в CTF: как отличить кодирование от шифрования и декодировать данные в CyberChef

На одном из Jeopardy-CTF я убил 40 минут на misc-задачу, которая решалась за 10 секунд. Строка выглядела как шифротекст — длинная каша из букв и цифр без пробелов. Прогнал частотный анализ, перебрал десяток ключей XOR, построил гистограмму распределения символов. Товарищ по команде молча вставил строку в CyberChef, ткнул Magic — и увидел флаг. Строка была закодирована в Base64 дважды: никакого шифрования, никакого ключа, ноль криптоанализа. Обидно? Ещё как. После этого я собрал чеклист визуальных паттернов, по которому определяю кодировку за три секунды до запуска любого инструмента. Эта статья — расширенная версия того чеклиста с готовыми рецептами CyberChef и CLI-командами.

Отличие кодирования от шифрования — ключевое правило для misc задач CTF

Путаница между кодированием и шифрованием — самая дорогая ошибка новичков в CTF по времени. Из-за неё часы уходят на задачи, которые решаются одной операцией в CyberChef. Разница укладывается в одно предложение: кодирование обратимо без ключа, шифрование — только с ключом.

Кодирование — преобразование данных из одного формата в другой. Алгоритм публичный, секрета нет. Base64 переводит бинарные данные в текстовые символы. Hex представляет каждый байт двумя шестнадцатеричными цифрами. URL encoding заменяет спецсимволы на %XX-последовательности. Любой, кто знает алгоритм (а он известен всем), может обратить преобразование. В CTF задачи на кодировки — это 10-30 секунд, если вы умеете распознавать кодировку визуально.

Шифрование — преобразование с секретным ключом. AES, RSA, XOR с длинным ключом, шифр Виженера — без ключа или без нахождения уязвимости в реализации данные не восстановить. Такие задачи в CTF относятся к категории crypto и требуют анализа алгоритма.

Критерий Кодирование Шифрование
Ключ Не нужен Обязателен
Обратимость Всегда, алгоритм известен Только с ключом
Цель Представление данных в другом формате Защита конфиденциальности
Примеры Base64, hex, Base32, URL encoding AES, RSA, XOR, Виженер
Подход в CTF Определить кодировку — декодировать Найти уязвимость или ключ — расшифровать
Время решения Секунды — минуты Минуты — часы

Это различие выходит далеко за рамки CTF. В матрице MITRE ATT&CK техника Deobfuscate/Decode Files or Information (T1140, Defense Evasion) описывает ситуацию, когда злоумышленники кодируют вредоносные файлы — например, через Base64 — чтобы обойти автоматическое детектирование. Техника Encrypted/Encoded File (T1027.013, Defense Evasion) описывает обфускацию малвари через шифрование или кодирование. Аналитик SOC, получив из лога EDR закодированную PowerShell-команду вроде powershell.exe -Enc JABXAEMAPQBOAGUAdwA... (запуск PowerShell с закодированным аргументом маппится на T1059.001 — Command and Scripting Interpreter: PowerShell), применяет ровно те же приёмы, что и CTF-игрок при решении misc-задачи: видит Base64 по визуальным признакам, декодирует и получает читаемый код. Один из типовых сценариев SOC-аналитики — разбор закодированных PowerShell-пейлоадов, где Base64 используется с флагом -Enc для скрытия команд от антивирусного детекта.

Визуальные паттерны кодировок в CTF-задачах

Прежде чем запускать какой-либо инструмент, посмотрите на строку и задайте три вопроса: какие символы используются? Есть ли характерный паддинг в конце? Какова длина строки? Ответы на эти три вопроса в большинстве случаев однозначно указывают на конкретную кодировку.

Декодирование Base64 — распознаём за три секунды

Base64 — самая частая кодировка в CTF и одновременно самая узнаваемая. Три визуальных признака, по которым она определяется мгновенно:

Алфавит: только символы A-Z, a-z, 0-9, + и /. Никаких @, #, ! или других спецсимволов. Строка выглядит как «почти буквенно-цифровая» с редкими плюсами и слешами — это Base64.

Паддинг: строка заканчивается на = или ==. Это выравнивающие символы — они добавляются, когда длина исходных данных не кратна трём байтам. Одиночный или двойной = в конце — почти гарантия Base64.

Длина: всегда кратна четырём. Каждые три байта исходных данных превращаются в четыре символа Base64.

Пример из реальной задачи: строка cGljb0NURntIMHQtMW5faDNyM30= содержит только допустимые символы, заканчивается на =, длина кратна 4. Декодируем — получаем picoCTF{H0t-1n_h3r3}. Весь процесс занимает секунды.

Есть вариант Base64url, где + заменён на -, а / на _. Паддинг может отсутствовать. Если строка похожа на Base64, но содержит дефисы и подчёркивания вместо плюсов и слешей — пробуйте Base64url. CyberChef поддерживает оба варианта через операцию From Base64 с выбором алфавита в настройках.

Hex кодировка — расшифровка шестнадцатеричных строк

Hex (шестнадцатеричная кодировка) — второй по частоте формат в CTF. Распознаётся по трём признакам:

Алфавит: исключительно символы 0-9 и a-f (или A-F). Ничего больше. Если строка состоит только из этих символов — перед вами hex.

Чётная длина: каждый байт кодируется ровно двумя hex-символами. Нечётная длина строки — скорее всего, не чистый hex (или где-то пропущен символ).

Префиксы и разделители: в CTF hex-строки иногда идут с префиксами 0x или содержат разделители \x, :, пробелы между парами символов. Строка \x66\x6c\x61\x67 — тоже hex, просто с разделителями.

Пример: строка 666c61677b686578313233217d — только hex-символы, чётная длина. Каждая пара символов — один байт ASCII. Декодируем через From Hex в CyberChef или xxd -r -p в терминале: flag{hex123!}.

Частая ловушка: строка выглядит как hex, но содержит символ g, h или другие буквы за пределами a-f. Это не hex — возможно, Base32 или Base58. Всегда проверяйте алфавит прежде чем тянуть операцию в рецепт.

Base32, Base58, ROT13 и URL encoding

Помимо Base64 и hex в CTF регулярно встречаются менее популярные кодировки. У каждой — свои отчётливые визуальные маркеры.

Base32 использует алфавит A-Z и 2-7 — только заглавные буквы и пять цифр. Строка выглядит «крикливо» из-за верхнего регистра. Паддинг — символ =, причём его может быть до шести штук подряд (длина строки кратна 8). Пример: JBSWY3DPEB3W64TMMQ====== декодируется в Hello world!. Отличить Base32 от Base64 просто: нет строчных букв и цифры только из диапазона 2-7 — это Base32.

Base58 встречается в задачах с криптовалютной тематикой. Алфавит: 1-9, A-Z, a-z, но без символов 0 (ноль), O (заглавная), I (заглавная) и l (строчная). Эти четыре символа убраны намеренно — чтобы при копировании адресов не путать визуально похожие знаки. Паддинга нет. Строка похожа на Base64, но без +, /, = и перечисленных символов — стоит попробовать Base58.

ROT13 — подстановочный шифр с фиксированным сдвигом 13. В контексте CTF трактуется скорее как кодировка, потому что «ключ» всегда одинаков (и все его знают). Визуально ROT13-строка — обычный латинский текст, но бессмысленный. Длина совпадает с оригиналом, цифры и спецсимволы не меняются. Строка cvpbPGS{ebg13_vf_rnfl} — каждая буква сдвинута на 13 позиций. Результат: picoCTF{rot13_is_easy}.

URL encoding заменяет спецсимволы на конструкции %XX, где XX — hex-код символа. Характерный признак — обилие символов %. Пример: flag%7Burl%5Fencoded%7D декодируется в flag{url_encoded}. Формат часто встречается в web-категории CTF, реже — в misc.

Сводная таблица для быстрого распознавания кодировок в CTF:

Кодировка Алфавит Паддинг Визуальный маркер
Base64 A-Za-z0-9+/ = или == Смешанный регистр, плюсы и слеши
Base32 A-Z2-7 = (до 6 штук) Только заглавные, цифры 2-7
Hex 0-9a-f Нет Только hex-символы, чётная длина
Base58 1-9A-Za-z без 0OIl Нет Похоже на Base64, но нет +/= и 0OIl
ROT13 A-Za-z Нет Читаемый текст, но бессмысленный
URL ASCII + %XX Нет Много символов % с парами hex-цифр

CyberChef для CTF — инструменты для decode и многослойное декодирование

CyberChef — бесплатный веб-инструмент от GCHQ (Центр правительственной связи Великобритании), выложенный в открытый доступ на GitHub. Содержит более 300 операций: от базовых преобразований Base64 и hex до сложных криптографических функций.

Для CTF у него есть одно критически важное свойство — вся обработка идёт на стороне клиента, в браузере. Данные никуда не отправляются. Это значит две вещи: вы не рискуете «слить» флаг на сторонний сервер во время соревнования, и CyberChef можно скачать и использовать офлайн — удобно, если CTF-площадка ограничивает доступ в интернет.

Требования к окружению: любой современный браузер (Chrome, Firefox, Edge). Адрес: https://gchq.github.io/CyberChef/. Никакой установки — открыли страницу и работаете.

Интерфейс разделён на четыре области: Operations (левая панель — каталог всех операций с поиском), Recipe (центральная панель — цепочка выбранных операций), Input (верхнее поле — сюда вставляете данные) и Output (нижнее поле — результат). Добавлять операции можно двойным кликом или перетаскиванием drag-and-drop из каталога в рецепт.

Операция Magic — автоопределение кодировки в CyberChef

Magic — первое, что стоит пробовать на каждой задаче с кодировками в CTF. Операция анализирует входные данные, прогоняет типичные преобразования и выдаёт список наиболее вероятных вариантов декодирования с оценкой достоверности.

Алгоритм работы простой: вставляете подозрительную строку в Input, перетаскиваете Magic из каталога в Recipe, жмёте Bake. CyberChef покажет результаты: если строка закодирована в Base64, Magic выведет декодированный текст с подписью «From Base64». Параметр Depth определяет глубину рекурсии — сколько слоёв кодирования Magic попробует раскрутить автоматически. Для задач с многослойным кодированием в CTF увеличьте Depth до 5-10.

По данным Pulsedive, Magic «особенно полезна, когда аналитик не уверен, как действовать дальше — рекомендованная операция может дать дополнительную информацию или идею для следующего шага». Для CTF это переводится так: прежде чем гадать, просто запустите Magic. В моей практике Magic закрывает примерно 60-70% задач на кодировки без дополнительных действий.

Многослойное кодирование в CTF — цепочки рецептов CyberChef

Авторы CTF-задач любят многослойное кодирование: строка кодируется в Base64, результат — в hex, затем — в Base32. Цель — заставить участника определять каждый слой вручную. Такая «матрёшка» выглядит пугающе, но раскручивается механически.

В CyberChef это решается построением цепочки операций в панели Recipe. Каждая следующая операция применяется к выходу предыдущей. Порядок важен — CyberChef выполняет операции строго сверху вниз.

Типичная цепочка для задачи с многослойным кодированием: From Base64From HexROT13. Промежуточные результаты видны на каждом шаге — можно отключить любую операцию (кнопка disable) или переставить её в цепочке. Рецепты сохраняются в JSON или шарятся ссылкой — удобно для командной работы на соревновании.

Операция Fork обрабатывает несколько строк параллельно: если у вас десять закодированных строк (каждая на отдельной строке), Fork разделит вход по переносам строк и прогонит весь рецепт на каждой независимо. Полезно, когда задача даёт список закодированных фрагментов.

Операция Subsection позволяет применить следующие операции только к части данных, выделенной регулярным выражением. По данным Pulsedive, Subsection использовалась при анализе вредоносных скриптов Balada Injector: аналитики выделяли Base64-фрагменты внутри JavaScript-кода через regex и декодировали только их, не трогая окружающий скрипт. В CTF аналогичная ситуация возникает, когда флаг спрятан внутри большого текстового файла — Subsection + From Base64 обработает только целевой фрагмент.

Декодирование base64 и hex в терминале — быстрые CLI-команды

CyberChef — идеальный base64 декодер онлайн для большинства ситуаций, но иногда быстрее работать в терминале. А на соревнованиях с ограниченным доступом в интернет CLI-утилиты — единственный вариант.

Для декодирования Base64 в Linux и macOS достаточно echo "строка" | base64 -d. В Windows через PowerShell: [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("строка")). Для hex используйте echo "hex_строка" | xxd -r -p — утилита xxd с флагами -r (reverse) и -p (plain hex dump) превращает hex обратно в бинарные данные. Учтите: xxd входит в пакет vim-common и отсутствует в минимальных окружениях (Alpine, BusyBox) — в таких случаях используйте python3 -c "print(bytes.fromhex('hex_строка').decode())" как fallback. ROT13 в терминале: echo "текст" | tr 'A-Za-z' 'N-ZA-Mn-za-m'.

# Base64 → ASCII
echo "cGljb0NURntoZXhfZGVjfQ==" | base64 -d

# Hex → ASCII
echo "666c61677b636c697d" | xxd -r -p

# ROT13 → ASCII
echo "cvpbPGS{ebg}" | tr 'A-Za-z' 'N-ZA-Mn-za-m'

# Многослойное: Base64 → затем hex → результат: flag
echo "NjY2YzYxNjc=" | base64 -d | xxd -r -p

Утилита base64 — не только инструмент для CTF. Она числится в GTFOBins как бинарь, через который можно читать произвольные файлы при повышении привилегий на Linux — если base64 получает SUID-бит или sudo-права, через неё можно вывести содержимое любого файла в Base64 и декодировать на своей стороне. Аналогично certutil.exe в Windows — бинарь из каталога LOLBAS с категориями ADS, Decode, Download и Encode, который маппится в MITRE ATT&CK на техники T1140 (Deobfuscate/Decode Files or Information), T1027.013 (Encrypted/Encoded File), T1105 (Ingress Tool Transfer) и T1564.004 (NTFS File Attributes). В реальных инцидентах злоумышленники используют certutil -decode для деобфускации загруженных пейлоадов — та же операция, что и From Base64 в CyberChef, только встроенная в Windows. T1140 и T1027.013 описывают кодирование/декодирование самого содержимого (payload), тогда как запуск powershell.exe -Enc классифицируется как T1059.001 (PowerShell).

Магические байты файлов — когда декодирование даёт бинарные данные

Не каждая задача на кодировки в CTF заканчивается текстовым флагом. Часто после декодирования Base64 или hex вы получаете не читаемый текст, а бинарные данные — изображение, архив, PDF, исполняемый файл. Флаг спрятан уже внутри этого файла.

Определить тип бинарных данных можно по магическим байтам (file signatures) — первым байтам, уникальным для каждого формата:

Формат Магические байты (hex) Текстовое представление
PNG 89 50 4E 47 .PNG
JPEG FF D8 FF нечитаемые символы
PDF 25 50 44 46 %PDF
ZIP/DOCX 50 4B 03 04 PK..
GIF 47 49 46 38 GIF8
ELF (Linux) 7F 45 4C 46 .ELF

В CyberChef после декодирования проверьте первые байты в Output. Видите 89 50 4E 47 — это PNG-изображение. Сохраняете Output с расширением .png и открываете файл. Флаг может быть нарисован на картинке, спрятан в метаданных EXIF или в младших битах пикселей (стеганография — в MITRE ATT&CK описана как T1027.003 (Steganography, тактика Defense Evasion) и T1001.002 (Steganography, тактика Command and Control)).

В терминале тип файла определяется командой file: передаёте декодированные данные через пайп — echo "base64data" | base64 -d | file -. Утилита file опознает формат по сигнатуре и выведет результат. Для более глубокого анализа — binwalk: он ищет вложенные файлы и архивы внутри бинарных данных. Команда strings вытащит все читаемые строки из бинарника — иногда флаг буквально валяется среди них в открытом виде.

Типичная цепочка в CTF: получили Base64-строку → декодировали → получили ZIP-архив → распаковали → внутри PNG → в EXIF-метаданных или LSB-битах спрятан флаг. Каждый шаг — отдельная операция в CyberChef или отдельная команда в терминале.

Практика — решаем misc задачу CTF от строки до флага

Разберём типичную задачу на многослойное кодирование CTF по шагам. Формат — «делай раз, делай два, делай три».

Требования к окружению: браузер с CyberChef (https://gchq.github.io/CyberChef/) или терминал Linux/macOS с утилитами base64, xxd, tr.

Сценарий: вы открыли misc-задачу и получили строку из условия. На первый взгляд — бессмысленный набор символов.

Шаг 1. Визуальная оценка. Смотрите на строку: какие символы? A-Za-z0-9+/ с = на конце — Base64. Только 0-9a-f — hex. Только заглавные с цифрами 2-7 — Base32. Определили первый слой.

Шаг 2. Первое декодирование. Вставляете строку в CyberChef Input, добавляете соответствующую операцию (From Base64, From Hex, From Base32). Смотрите на Output. Видите читаемый текст в формате flag{...} или picoCTF{...} — готово, сдаёте флаг.

Шаг 3. Определяем следующий слой. Если Output — снова закодированная строка, повторяете шаг 1 для результата. Видите hex — добавляете From Hex в рецепт. Видите Base64 — добавляете From Base64. Каждая новая операция добавляется ниже предыдущей в панели Recipe.

Шаг 4. Проверяем бинарные данные. Если после декодирования в Output появились нечитаемые символы — проверьте магические байты. Начинается с PK — ZIP. Начинается с .PNG — изображение. Сохраните Output как файл с правильным расширением.

Шаг 5. Ленивый путь. Не хочется определять слои вручную — используйте Magic с Depth=10. CyberChef попробует раскрутить цепочку автоматически. В большинстве CTF-задач начального и среднего уровня Magic справляется полностью. (Я сам так делаю на первые 30 секунд, и только если Magic не справился — переключаюсь на ручной разбор.)

Чеклист для быстрой проверки: после каждого шага декодирования ищите подстроку flag, ctf, picoCTF, HTB — большинство CTF-платформ используют фиксированный формат флага. В CyberChef для этого добавьте операцию Regular expression с паттерном flag\{.*?\} в конец рецепта — она подсветит флаг в Output, даже если он спрятан среди другого текста.

Рецепт CyberChef для типичной 3-слойной задачи:
[1] From Base64 (Alphabet: Standard)
[2] From Hex (Delimiter: Auto)
[3] ROT13 (Amount: 13)

Этот рецепт раскрывает цепочку Base64 → hex → ROT13 за одно нажатие Bake. Порядок операций зеркально обратный порядку кодирования: если автор задачи сначала применил ROT13, потом hex, потом Base64, то для декодирования ставите From Base64 первым, From Hex вторым, ROT13 третьим.


Наблюдение, которое сформировалось за два года решения forensics и misc задач: большинство новичков застревает не потому, что не знает инструменты, а потому что не умеет смотреть на данные. CyberChef, xxd, base64 — всё это осваивается за вечер. А вот навык мгновенного распознавания кодировки по визуальным паттернам строится только через объём решённых задач.

Ни одна статья (включая эту) не заменит практику: откройте 20-30 misc-задач уровня easy на picoCTF или аналогичной площадке и прогоните каждую через описанный чеклист. К тридцатой задаче глаз начинает цепляться за == на конце строки или за отсутствие символов за пределами 0-9a-f автоматически — без осознанного анализа.

И ещё одна вещь, которая редко проговаривается: навык декодирования из CTF переносится в работу напрямую. Каждый PowerShell-пейлоад с -Enc, каждый обфусцированный JavaScript-дроппер, каждый C2-бикон с Base64-конфигом — это та же самая задача «определи кодировку, сними слой, посмотри что внутри». Разница только в том, что в CTF флаг — строка в фигурных скобках, а в инциденте — IP-адрес командного сервера. Если хочется выстроить эту базу системно — на Codeby School есть IB Basics, который ведёт от нуля до первых рабочих навыков без академического тона.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...