
Три строки на экране misc-таска Jeopardy-CTF: первая заканчивается на ==, вторая — сплошной поток 0-9 и a-f, третья пестрит конструкциями %2F и %3D. На прошлогоднем соревновании парень из параллельной команды перебирал онлайн-декодеры 40 минут — бросал одну и ту же строку то в Base64, то в ROT13, то обратно. За это время его соперник сдал 12 encoding-тасков. Разница не в таланте и не в инструментах — в системе. Каждый тип кодировки оставляет визуальный отпечаток, и декодирование кодировок в CTF сводится к чтению этих отпечатков по алгоритму, а не к тыканью наугад.
Прежде чем открывать CyberChef или терминал — просто посмотрите на строку. Алфавит символов — самый быстрый фильтр: один взгляд исключает 80% вариантов. По методологии InventiveHQ, анализ набора символов (character set) снимает большинство encoding-тасков за первые секунды, до запуска чего-либо. Подробнее — в нашем статье о создание ctf заданий.
Base64 — самая частая кодировка в misc-тасках CTF и криптографических челленджах начального уровня. Три визуальных признака определяют её безошибочно.
Алфавит: A-Z, a-z, 0-9, +, / — 64 символа, регистрозависимые. Видите заглавные и строчные буквы вперемешку с цифрами — Base64 в списке подозреваемых.
Паддинг: строка часто заканчивается одним или двумя символами =. Этот знак добавляется, чтобы длина закодированного результата была кратна 4 байтам. Двойное == в конце — маркер, который новички узнают быстрее всего, и он работает почти всегда. Но есть исключение: URL-safe Base64, где + заменён на -, / на _, а паддинг = убран. Этот вариант живёт в JWT-токенах и веб-приложениях — на web-тасках CTF он попадается чаще стандартного.
Длина: закодированный результат примерно на 33% длиннее оригинала (соотношение 4:3). Если примерно знаете длину флага — пересчитайте.
Base32 отличается визуально и радикально: только заглавные буквы A-Z и цифры 2-7. Нет строчных букв, нет цифр 0, 1, 8, 9. Паддинг = добавляется до длины, кратной 8, а результат на 60% длиннее оригинала. Строка MZWGCZ33MJQXGZJTGJ6Q — типичный Base32. На CTF эта кодировка встречается реже, но авторы тасков используют её прицельно — чтобы отсеять тех, кто знаком только с Base64.
Hex (Base16) — только символы 0-9 и a-f (или A-F). Длина строки всегда чётная: каждый байт — ровно два hex-символа. Нередко торчат префиксы 0x или \x. Строка 666c61677b48656c6c6f7d — типичный hex (это flag{Hello} в ASCII). Ключевой маркер: длина ровно вдвое больше ожидаемого оригинала. Hex кодировка — первое, что стоит проверять на forensics-тасках, где данные вытащены из сетевого трафика или дампа памяти.
Binary — исключительно 0 и 1. Длина кратна 8, потому что один символ ASCII = один байт = 8 бит. Строка 01100110 01101100 01100001 01100111 (с пробелами между байтами или без) — двоичное представление текста. В CTF binary часто выступает внешним «слоем-обёрткой», внутри которого лежит hex или Base64.
URL encoding — текст, нашпигованный конструкциями %XX, где XX — hex-код символа. Типичные маркеры: %20 (пробел), %3D (знак =), %2F (слэш /). Если строка выглядит как URL, но перенасыщена символами % — перед вами URL-кодированные данные. Частый гость в web-тасках CTF, где флаг зашит прямо в параметрах HTTP-запроса.
ASCII85 (Base85) — символы от ! до u по таблице ASCII (коды 33–117). Главный визуальный маркер — обрамление <~ в начале и ~> в конце. Без обрамления ASCII85 выглядит как случайный набор печатных символов и почти неотличим от шифротекста. На CTF встречается нечасто, но когда встречается — ставит в тупик большинство новичков, которые про эту кодировку вообще не слышали.
ROT13 — текст из обычных английских букв, но бессмысленный. Цифры и спецсимволы не меняются. Строка synt{ebg13} при сдвиге каждой буквы на 13 позиций превращается в flag{rot13}. Формально ROT13 — подстановочный шифр, а не кодировка, но на CTF он стоит в одном ряду с кодировками: ключ фиксирован, перебор не нужен.
Сводная таблица визуальных признаков — её стоит держать открытой во время соревнования:
| Тип | Алфавит символов | Длина vs оригинал | Маркеры |
|---|---|---|---|
| Base64 | A-Z, a-z, 0-9, +, / | ~133% | = или == в конце |
| Base32 | A-Z, 2-7 | ~160% | Только заглавные, = до кратности 8 |
| Hex | 0-9, a-f | 200% | Чётная длина, префиксы 0x / \x |
| Binary | 0, 1 | 800% | Группы по 8 символов |
| URL | ASCII + %XX | Переменная | %20, %3D, %2F |
| ASCII85 | ! до u (33–117) | ~125% | Обрамление <~ ... ~> |
| ROT13 | a-z, A-Z | 100% | Буквы без смысла, цифры не тронуты |
Подход «попробую Base64, не сработало — попробую hex» приемлем, пока задача в один слой. Но авторы тасков регулярно вкладывают три-четыре кодировки друг в друга, и хаотичный перебор превращается в потерю времени. Алгоритм из шести шагов — каждый шаг исключает целый класс вариантов.
Шаг 1. Скопировать строку, зафиксировать длину. Длина — грубый, но быстрый фильтр. Строка вдвое длиннее ожидаемого флага? Вероятен hex. На треть длиннее? Base64. В восемь раз длиннее? Binary.
Шаг 2. Определить алфавит символов. Самый мощный фильтр — за секунду исключает целые классы:
0 и 1 → binary0-9 и a-f, чётная длина → hexA-Z и 2-7 → Base32+, /, = → Base64% → URL encoding<~ в начале → ASCII85Порядок проверки критичен: сначала самые узкие алфавиты (binary, hex), потом широкие (Base64). Hex-строка deadbeef формально подходит под алфавит Base64, но hex-гипотеза приоритетнее — алфавит у́же, вероятность выше.
Шаг 3. Попробовать бесключевые декодеры. Base64, hex, binary, URL decoding не требуют ключа — декодирование стоит ноль секунд и ноль усилий. Результат осмысленный или похож на другую кодировку — вы на верном пути.
Шаг 4. Проверить формат флага. После каждого шага ищите flag{, CTF{, codeby{ или другой формат, принятый на конкретном соревновании. В терминале: grep -i flag. В CyberChef: Ctrl+F по Output.
Шаг 5. Буквенный текст без смысла → шифр подстановки. После декодирования получился текст из букв, но нечитаемый — попробуйте Caesar/ROT. Брутфорс 25 сдвигов занимает 30 секунд в CyberChef (операция ROT13 Brute Force) или на dCode.fr. Ни один сдвиг не даёт читаемого текста — это может быть Vigenère или подстановочный шифр. Тут нужен частотный анализ: Index of Coincidence около 0.067 указывает на моноалфавитную замену, около 0.038 — на полиалфавитную.
Шаг 6. Вести лог попыток. Под давлением таймера соревнования легко забыть, что hex уже проверен, и убить пять минут на повторный круг. Текстовый файл с пометками «попробовал X → результат Y» экономит эти минуты. Я на соревнованиях держу открытый notes.md рядом с терминалом — привычка, которая окупается на третьем-четвёртом таске.
Эти навыки не замыкаются на CTF. В MITRE ATT&CK деобфускация описана как Deobfuscate/Decode Files or Information (T1140, Defense Evasion). Злоумышленники кодируют пейлоады в Base64 и hex, чтобы обойти антивирусные сигнатуры — техника задокументирована как Encrypted/Encoded File (T1027.013). Конкретный пример: в Windows утилита Certutil.exe — легитимный инструмент для работы с сертификатами — используется для декодирования Base64-обёрнутых пейлоадов прямо на хосте (задокументировано в каталоге LOLBAS, категория Decode). В Linux base64 и base32 числятся в GTFOBins как бинарники для пост-эксплуатации. В SigmaHQ есть правила детектирования подозрительного использования base64 в Linux: proc_creation_lnx_base64_execution.yml срабатывает на исполнение base64-декодированных команд. SOC-аналитик распознаёт эти кодировки теми же приёмами, что и CTF-игрок на misc-таске — разница только в контексте.
CyberChef — веб-приложение от GCHQ (gchq.github.io/CyberChef), по сути швейцарский нож для работы с данными в CTF. Сотни операций в одном интерфейсе — но реально нужны три приёма, которые покрывают подавляющее большинство encoding-тасков.
Приём 1: операция Magic. Вставляете строку в поле Input, добавляете операцию Magic — CyberChef перебирает сотни возможных преобразований и ранжирует результаты по вероятности. Для однослойных задач этого хватает за глаза. Нюанс: Magic обрабатывает один слой за раз. Строка закодирована трижды — запускайте Magic повторно на каждом промежуточном результате, пока не доберётесь до флага.
Приём 2: цепочка рецептов (Recipe). CyberChef позволяет выстроить последовательность операций: From Hex → From Base64 → ROT13. Каждый шаг применяется к результату предыдущего, выход обновляется в реальном времени. Порядок операций меняется перетаскиванием — экспериментировать можно за секунды. Для encoding CTF челленджей с несколькими слоями это основной рабочий режим.
Приём 3: XOR Brute Force. Строка не поддаётся стандартным декодерам? Операция XOR Brute Force с длиной ключа 1 байт перебирает 256 вариантов и показывает результат каждого. Один из них содержит читаемый текст или формат флага — ключ найден. Работает, когда авторы таска наложили однобайтовый XOR поверх стандартной кодировки — распространённая комбинация на CTF начального и среднего уровня.
Помимо CyberChef, для распознавания кодировок онлайн полезен dCode.fr — десятки автоматических солверов для классических шифров (Caesar, Vigenère, Playfair, подстановочные) и инструменты частотного анализа. Для разовой операции base64 декодирования хватит base64decode.org, но CyberChef выигрывает за счёт цепочек и возможности сохранять рецепты для повторного использования.
Когда CyberChef не под рукой (слабый интернет на площадке, оффлайн-формат) или нужна скорость — терминал решает не хуже. Минимальный набор команд:
echo "aGVsbG8=" | base64 -d # Base64 → текст (macOS: base64 -D)
echo "68656c6c6f" | xxd -r -p # Hex → текст
python3 -c "import base64; print(base64.b32decode('NBSWY3DP').decode())" # Base32
echo -e '\x66\x6c\x61\x67' # Hex-escape последовательности → текст
base64 -d декодирует Base64 из stdin. xxd -r -p преобразует plain hex-строку обратно в байты — флаг -p означает plain dump без адресов. Для Base32 и ASCII85 встроенных утилит в Linux нет, но стандартный Python-модуль base64 содержит b32decode() и b85decode().
Конвейер для многослойных задач: cat encoded.txt | base64 -d | xxd -r -p — снимает два слоя за одну команду, если строка сначала hex-кодирована, потом обёрнута в Base64.
Утилита file критически важна, когда результат декодирования — не текст, а бинарные данные. Сохраните вывод в файл (base64 -d < input.txt > output.bin) и запустите file output.bin. Она покажет тип данных: PNG, ZIP, gzip, ELF-бинарник. Это подсказка к следующему шагу: gunzip, unzip или strings output.bin | grep -i flag.
Когда encoding-тасков много (на хороших CTF бывает 10–15 за соревнование), ручная проверка тормозит. Короткий Python-скрипт определяет тип кодировки по паттернам:
import re
def detect(s):
s = s.strip()
if re.fullmatch(r'[01\s]+', s): return 'binary'
if re.fullmatch(r'[0-9a-fA-F]+', s) and len(s) % 2 == 0: return 'hex'
if re.fullmatch(r'[A-Z2-7=]+', s): return 'base32'
if re.fullmatch(r'[A-Za-z0-9+/=]+', s) and len(s) % 4 == 0: return 'base64'
if '%' in s and re.search(r'%[0-9A-Fa-f]{2}', s): return 'url'
return 'unknown'
Порядок проверок повторяет алгоритм из предыдущего раздела: сначала узкие алфавиты (binary, hex), потом широкие (Base64). Функцию можно расширить рекурсивным вызовом: декодировать первый слой и вызвать detect() на результате, пока не всплывёт формат флага. BaseCrack (упоминался на r/securityCTF) автоматизирует именно это — многослойное декодирование Base-кодировок без ложных срабатываний.
Для работы с байтовыми данными в Python полезны стандартные модули: binascii даёт hexlify() / unhexlify() для преобразования байтов в hex и обратно, а base64 содержит b64decode(), b32decode(), b85decode() — по функции на каждую кодировку.
Авторы misc-тасков CTF любят вкладывать кодировки друг в друга — по типу матрёшки. Классическая цепочка: оригинал → Base64 → Hex → снова Base64. Разберём методику пошагово.
Дано: длинная строка, состоящая целиком из символов 0-9 и a-f.
Шаг 1. Алфавит — только hex-символы. Длина чётная. Гипотеза: hex-кодирование. Применяем xxd -r -p или CyberChef → From Hex.
Шаг 2. Результат: строка вида NTYyNj...383d, содержащая A-Z, a-z, 0-9 и заканчивающаяся на =. Визуальные признаки Base64. Применяем base64 -d или CyberChef → From Base64.
Шаг 3. Результат: снова hex-строка. Повторяем декодирование hex.
Шаг 4. Результат: flag{...}. Задача решена за четыре действия.
Каждый шаг — один и тот же цикл: определить алфавит → выбрать декодер → проверить результат на читаемость и формат флага. В CyberChef вся цепочка собирается перетаскиванием трёх операций (From Hex → From Base64 → From Hex) и выполняется мгновенно.
Теперь про типичные ловушки многослойных задач — на них спотыкаются чаще, чем хотелось бы.
Двойной Base64. Результат первого base64 декодирования снова похож на Base64 — есть = в конце, смешанный алфавит. Просто декодируйте повторно. Авторы тасков закладывают 3–5 слоёв Base64 подряд, рассчитывая, что участник остановится после одного. Не останавливайтесь.
ROT13 поверх Base64. Строка визуально похожа на Base64, но декодирование даёт нечитаемый мусор. Причина: авторы сначала закодировали в Base64, потом применили ROT13 к результату. Буквы сдвинулись, и Base64-декодер ломается. Решение: сначала ROT13, потом Base64.
Gzip внутри Base64. После base64 декодирования получаются бинарные данные, а не текст. Сохраните в файл, запустите file — если покажет «gzip compressed data», применяйте gunzip. Внутри архива может быть ещё один слой кодировки.
Нестандартный Base64-алфавит. Некоторые таски используют модифицированный набор символов: - и _ вместо + и / (URL-safe Base64). CyberChef поддерживает кастомный алфавит в настройках операции From Base64 — достаточно указать замену.
Base85 вместо Base64. Строка содержит необычные спецсимволы (!, @, #, $) и не декодируется как Base64 — попробуйте ASCII85. Операция From Base85 в CyberChef или base64.b85decode() в Python.
Весь декодер base64 hex и прочие утилиты — лишь часть инструментария. Для misc-тасков на CTF нужен компактный набор, покрывающий 90% задач:
| Задача | Инструмент | Когда применять |
|---|---|---|
| Автоопределение кодировки | CyberChef Magic | Первый шаг на любом encoding-таске |
| Base64/32/16 декодирование | base64 -d, Python, CyberChef |
После определения типа |
| Hex-конвертация | xxd -r -p, CyberChef From Hex |
Строки из 0-9, a-f |
| Классические шифры | dCode.fr | Caesar, Vigenère, подстановка |
| XOR-перебор | CyberChef XOR Brute Force | Нечитаемый бинарный вывод |
| Тип файла после декодирования | file, binwalk |
Бинарные данные на выходе |
| Поиск текста в бинарнике | strings |
Первая проверка любого файла |
| Многослойная автоматизация | BaseCrack, Python-скрипт | 5+ слоёв кодировки |
Отдельно про strings: эту команду стоит запускать на каждом файле в CTF до глубокого анализа. strings output.bin | grep -i flag занимает секунду — и удивительно часто флаг обнаруживается в открытом виде внутри бинарных данных, без необходимости реверсить или декодировать что-либо. Я на нескольких соревнованиях вытаскивал флаги из PNG-файлов одним strings — авторы прятали текст в метаданных.
Инструментов для CTF misc существует много, но на первых соревнованиях важнее отточить рабочий процесс на трёх-четырёх основных, чем поставить два десятка и не уметь быстро переключаться. CyberChef + терминальные команды + Python-скрипт покрывают практически любой encoding-таск.
Encoding-таски часто называют «разминкой» — и именно на этой разминке теряют больше всего времени те, кто не выстроил систему. Парадокс: задача, которая решается за минуту при алгоритмическом подходе, съедает полчаса у человека, знающего инструменты, но не знающего паттерны. За сотни решённых тасков я видел десятки участников, которые открывали CyberChef, перебирали операции одну за другой и надеялись на удачу — вместо того чтобы потратить пять секунд на чтение алфавита строки.
Мнение, что misc — «несерьёзная» категория по сравнению с pwn и reverse — распространённая ошибка. Навык мгновенного распознавания кодировок — тот же навык, который использует SOC-аналитик при разборе вредоносного PowerShell-скрипта с тремя слоями Base64-обфускации. На CTF ищете флаг, в проде — индикатор компрометации. Техника одна, инструменты одни, скорость решает одинаково. И в отличие от pwn, где нужны месяцы на ассемблер и понимание работы стека, encoding-навыки ставятся за два-три вечера и сразу приносят флаги. На IB Basics эта прогрессия выстроена в понятную последовательность от первых команд до уверенного уровня — без академического тона и без «вы должны знать Linux на уровне X» на входе.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...