
Строка Gur synt vf cvpbPGS{abg_gbb_onq_bs_n_ceboyrz} — ROT13. Один клик в CyberChef — и ответ: The flag is picoCTF{not_too_bad_of_a_problem}. Тридцать секунд для того, кто узнал паттерн. Часы впустую — для того, кто полез в RSA-калькуляторы.
Crypto-категория в CTF устроена парадоксально: большинство задач начального уровня не требуют высшей математики — только умение распознать, с чем имеешь дело. Самая сложная часть — не взлом шифра, а определение его типа. Звучит банально, пока не просидишь полчаса над hex-строкой, которая оказалась тупо base64 без паддинга.
Дальше — практический гайд по трём базовым элементам криптоанализа: base-кодировки, шифр Цезаря и XOR. От визуальных маркеров до автоматических солверов на Python.
В формате Jeopardy — самом распространённом формате CTF-соревнований — задания раскиданы по категориям: Web, PWN, Reverse, Forensics, Crypto и другим. Crypto (криптография) — одна из основных, и задания внутри делятся на несколько уровней:
Статья покрывает первые три уровня — всё, что встречается в подавляющем большинстве crypto CTF заданий для начинающих. И навыки эти работают далеко за пределами соревнований: в реальных атаках base64 и XOR используют для обфускации payload'ов. В MITRE ATT&CK это описано как Data Encoding (T1132) для C2-коммуникаций и Obfuscated Files or Information (T1027) для маскировки вредоносных файлов. Те же приёмы, что и в CTF, только ставки выше.
Требования к окружению для практических разделов:
pip install xortool для автоматизации анализа многобайтового XORbase64 и base32 доступны из коробкиПервое, с чем сталкивается новичок в crypto CTF — строка непонятных символов. Прежде чем что-то расшифровывать, нужно понять: это шифр или просто кодировка? Разница принципиальная — кодировка обратима без ключа, шифр — нет. Согласно RFC 4648, каждая base-кодировка использует фиксированный алфавит, и по нему тип определяется за секунды.
| Кодировка | Алфавит | Паддинг = |
Пример |
|---|---|---|---|
| Base16 (hex) | 0-9, A-F |
Нет | 48656C6C6F |
| Base32 | A-Z, 2-7 |
Да, до 6 символов | JBSWY3DPEBLW64TMMQ====== |
| Base64 | A-Z, a-z, 0-9, +, / |
Да, 1-2 символа | SGVsbG8gV29ybGQ= |
| Base58 | A-Z, a-z, 0-9 без 0OIl |
Нет | 2NEpo7TZRRrLZSi2U |
| Base85 (ASCII85) | Печатные ASCII !-u |
Обрамление <~ ~> |
<~87cURD]j~> |
Работает если: строка содержит только символы из алфавита соответствующей кодировки. Не работает если: данные дополнительно зашифрованы после кодирования — тогда base64 декодирование даст бинарный мусор, а не читаемый текст.
Три правила быстрой идентификации:
== в конце и строчные буквы — скорее всего base64. Самая частая кодировка и в CTF, и в жизни: JWT-токены, cookie, API-параметры.= в конце, только заглавные буквы и цифры 2-7 — base32. Встречается реже, но если работали с Google Authenticator — видели TOTP-секреты именно в base32.0-9, A-F, длина кратна двум — base16 (hex). Классика жанра: данные якобы «зашифрованы», а на деле просто закодированы.Для base58 характерный признак — отсутствие визуально неоднозначных символов 0, O, I, l. Если строка похожа на Bitcoin-адрес — стоит попробовать base58 декодирование.
Частая ловушка в CTF — вложенные кодировки: base64 внутри base32 внутри hex. Матрёшка. Разматывать вручную — потеря времени. В CyberChef для CTF есть функция Magic (иконка волшебной палочки): она автоматически определяет тип кодировки и предлагает цепочку операций для снятия всех слоёв.
Ручной алгоритм для случаев, когда Magic не справляется:
В терминологии MITRE ATT&CK множественные слои кодирования — стандартная практика обфускации. Техника Deobfuscate/Decode Files or Information (T1140) описывает именно процесс последовательного снятия слоёв при анализе вредоносного ПО. Те же навыки, что для CTF, — при реальном incident response.
Шифр Цезаря — подстановочный шифр, где каждая буква сдвигается на фиксированное число позиций в алфавите. Сдвиг 3: A→D, B→E, C→F. ROT13 — частный случай со сдвигом 13, популярный потому что двойное применение возвращает исходный текст (13+13=26, полный оборот алфавита). По сути — шифр, который расшифровывает сам себя.
Как распознать шифр Цезаря в задании:
cvpbPGS{ — каждая буква сдвинута от picoCTF{), это стопроцентный маркер Цезаря. Дальше можно не гадать.Работает если: алфавит стандартный (латиница A-Z), сдвиг единый для всех символов. Не работает если: используется кириллица с нестандартным алфавитом, полиалфавитная подстановка (шифр Виженера), или автор задачи перемешал алфавит произвольно (общий моноалфавитный шифр).
Всего 25 возможных сдвигов, не считая нулевого. Перебрать все — тривиальная задача:
def caesar_brute(ciphertext):
for shift in range(1, 26):
result = ""
for ch in ciphertext:
if ch.isalpha():
base = ord('A') if ch.isupper() else ord('a')
result += chr((ord(ch) - base - shift) % 26 + base)
else:
result += ch
print(f"Сдвиг {shift:2d}: {result}")
caesar_brute("Gur synt vf cvpbPGS{abg_gbb_onq_bs_n_ceboyrz}")
Скрипт выведет 25 строк. Нужный вариант — тот, где текст читается. При сдвиге 13 получаем: The flag is picoCTF{not_too_bad_of_a_problem}. Для CTF хватает глаз — 25 строк просматриваются за секунды. В CyberChef тот же результат даёт операция ROT13 или Caesar Cipher Decode с перебором значения key.
Нюанс, на котором спотыкаются: если после ROT13 текст всё ещё нечитаем, но знаки препинания выглядят странно — пробуйте ROT47. Он сдвигает весь диапазон печатных ASCII от ! до ~, захватывая цифры и спецсимволы.
Для коротких строк brute force эффективнее — 25 вариантов просматриваются мгновенно. Но если шифротекст — целый абзац или страница, частотный анализ позволяет определить сдвиг без перебора.
Принцип: в английском тексте самая частая буква — E (примерно 12.7% появлений), затем T (около 9.1%), A (около 8.2%). Если в шифротексте самая частая буква — R, то вероятный сдвиг = позиция R минус позиция E = 13. Проверяете гипотезу дешифровкой — и в подавляющем большинстве случаев она подтверждается.
Принцип работает для любого моноалфавитного подстановочного шифра, не только для Цезаря. На dCode (dcode.fr) частотный анализ шифров выполняется автоматически — сервис показывает распределение букв в виде гистограммы. Для русскоязычных текстов самая частая буква — О, за ней Е и А.
XOR (eXclusive OR) — побитовая операция, фундамент простейшего шифрования. Каждый бит данных XOR'ится с соответствующим битом ключа. Главное свойство: A XOR K XOR K = A — двойное применение одного ключа возвращает исходные данные. Одна и та же операция шифрует и расшифровывает. Красиво и просто — поэтому XOR так любят авторы малвари.
В реальных атаках XOR используют повсеместно. MITRE ATT&CK техника Obfuscated Files or Information (T1027) включает XOR-обфускацию как один из самых распространённых методов маскировки payload'ов. Навык расшифровки XOR — прямая подготовка к работе с реальными инцидентами.
Как распознать XOR-шифрование в задании:
\x00) появляются в позициях, где символ открытого текста совпал с ключом.Работает если: ключ — один байт (256 вариантов) или короткий многобайтовый ключ до 32 байт. Не работает если: ключ равен длине данных (one-time pad — математически невзламываемый) или данные были сжаты перед XOR-шифрованием.
Однобайтовый XOR — самый частый вариант в crypto CTF заданиях для начинающих. Ключ — одно число от 0 до 255. Перебираем все варианты и фильтруем по читаемости:
def xor_single_byte_brute(data_hex):
data = bytes.fromhex(data_hex)
for key in range(256):
result = bytes([b ^ key for b in data])
if all(32 <= b < 127 for b in result):
print(f"Key 0x{key:02x}: {result.decode('ascii')}")
# пример для демонстрации концепции
xor_single_byte_brute("4f626b6b68275078756b63")
Скрипт фильтрует результаты по критерию «все байты — печатные ASCII». Для коротких строк может подойти несколько ключей, но нужный — тот, где текст осмысленный. Для повышения точности добавляют подсчёт частоты пробелов и букв e, t, a — чем больше «английских» паттернов, тем вероятнее правильный ключ.
В CyberChef аналогичный результат даёт операция XOR Brute Force — выводит все 256 вариантов с подсветкой наиболее вероятных.
Если ключ длиннее одного байта, прямой перебор дорожает экспоненциально: для двухбайтового — 65 536 вариантов, для четырёхбайтового — свыше 4 миллиардов. Но в CTF есть козырь — известный открытый текст.
Формат флага обычно объявляется заранее: picoCTF{, flag{, HTB{. Если шифротекст содержит зашифрованный флаг, достаточно XOR'ить начало шифротекста с известным началом — результат даст ключ или его фрагмент. Принцип: если ciphertext = plaintext XOR key, то key = ciphertext XOR plaintext.
# известное начало флага "flag{"
cipher_start = bytes.fromhex("0b150a0202")
known_plaintext = b"flag{"
key = bytes([c ^ p for c, p in zip(cipher_start, known_plaintext)])
print(f"Ключ: {key}") # выведет b'mykey'
Получив фрагмент ключа, определяем его длину. Если ключ применяется циклически (а это стандартная схема repeating-key XOR), паттерн повторится через каждые N байт. Восстановив полный ключ, расшифровываем весь текст.
Для автоматизации есть утилита xortool. Установка: pip install xortool. Запуск: xortool -l <длина_ключа> -c 20 файл — параметр -c 20 указывает, что наиболее частый символ открытого текста — пробел (0x20, что верно для английского текста). Утилита сама вычисляет вероятную длину ключа по индексу совпадений и подбирает значение.
CyberChef (gchq.github.io/CyberChef) — первый инструмент, который стоит открыть на любом crypto-задании. Разработан GCHQ (британская спецслужба), работает в браузере без установки. Для задач начального и среднего уровня его хватает за глаза.
Операции, которые нужны чаще всего:
From Base64 / From Base32 / From Hex — декодирование кодировок в один клик.Magic — автоматическое распознавание вложенных кодировок и снятие всех слоёв.ROT13 / Caesar Cipher Decode — взлом шифра Цезаря перебором сдвигов.XOR / XOR Brute Force — применение XOR с заданным ключом или перебор однобайтовых ключей.Сила CyberChef — в цепочках операций (recipes). Пример: From Hex → XOR (ключ 0x42) → From Base64 — три слоя обфускации снимаются за одну загрузку. Рецепты можно сохранять и делиться ссылками с командой.
| Инструмент | Назначение | Когда использовать |
|---|---|---|
| CyberChef | Универсальный декодер и шифровальщик | Первый инструмент для любого задания |
| dCode (dcode.fr) | Идентификация и автоматический взлом шифров | Если тип шифра неизвестен — Cipher Identifier попробует определить |
| xortool | Анализ многобайтового XOR | Когда ключ длиннее 1 байта и brute force нереален |
| CryptoPals | Набор обучающих заданий по криптографии | Для системного изучения после освоения базовых CTF-задач |
| CryptoHack | Интерактивные криптографические задачи | Для перехода от классических шифров к RSA и AES |
| Practical Cryptography | Справочник по шифрам и кодам | Для опознания неизвестного шифра по характеристикам |
На dCode особенно полезна функция Cipher Identifier — вставляете шифротекст, сервис предлагает возможные типы шифров с оценкой вероятности. Экономит время, когда визуального распознавания недостаточно и глазами не получается.
Для решения crypto CTF заданий нужна не интуиция, а методичный алгоритм. Вот схема, которая работает для задач начального и среднего уровня:
Шаг 1. Определить тип данных. Смотрим на алфавит строки. Только hex-символы? Есть == в конце? Только заглавные буквы плюс цифры 2-7? Сверяемся с таблицей визуальных маркеров base-кодировок. Бинарные данные — скорее всего XOR или блочный шифр.
Шаг 2. Проверить кодировки. Пробуем From Base64, From Hex, From Base32 в CyberChef. Если результат — читаемый текст или другая кодировка, это не шифр. Разматываем слои до конца. Magic делает это автоматически.
Шаг 3. Проверить классические шифры. Если текст «почти читается» — вероятно подстановочный шифр. Brute force шифра Цезаря (25 сдвигов) — первое, что стоит попробовать. Не помогло — Виженер (подсказка ключа часто есть в условии задачи). Для неопознанных шифров — dCode Cipher Identifier.
Шаг 4. Проверить XOR. Бинарные данные без паттернов кодировок — XOR Brute Force в CyberChef для однобайтового ключа. Для многобайтового — атака известным открытым текстом через формат флага.
Шаг 5. Проверить формат флага. После каждого шага искать формат флага в результате: flag{, picoCTF{, HTB{, ctf{. Поиск по подстроке — быстрее, чем вычитывать глазами.
Шаг 6. Вложенные слои. Если после одного раунда декодирования получилась новая каша — возвращаемся к шагу 1. Вложенные кодировки — стандартный приём авторов CTF-задач.
Паттерны, на которых стабильно теряют время новички:
Hex без префикса 0x. Строка 48656c6c6f — не шифр, а hex-кодированное Hello. Видите только символы 0-9 и a-f с чётной длиной строки — первым делом From Hex.
Base64 без паддинга. Некоторые реализации убирают = из конца base64-строки. Если строка содержит верхний и нижний регистр плюс цифры, но без = — это всё ещё может быть base64. CyberChef декодирует и без паддинга.
Двойной base64. Результат первого декодирования base64 снова выглядит как base64 — заглавные, строчные, цифры, =. Применяйте From Base64 повторно, пока не получите читаемый текст или бинарные данные. Не ленитесь — авторы задач тоже не ленились, когда заворачивали.
ROT47 вместо ROT13. ROT13 работает только с буквами. ROT47 сдвигает весь диапазон печатных ASCII от ! до ~ — цифры и спецсимволы тоже меняются. Если после ROT13 текст нечитаем и знаки препинания выглядят странно — ROT47 в CyberChef.
ASCII-коды вместо текста. Строка 72 101 108 108 111 — десятичные ASCII-коды букв Hello. Бывают варианты в восьмеричной (110 145 154 154 157) или двоичной системе (01001000 01100101 01101100 01101100 01101111). CyberChef операция From Decimal / From Octal / From Binary решает задачу мгновенно.
Ни одна из этих ловушек не требует глубоких знаний криптографии. Нужна только методичность и набитый глаз на визуальные паттерны. Именно поэтому решение crypto-задач начального уровня — идеальная точка входа в криптоанализ: барьер входа минимальный, а навык распознавания паттернов универсален.
Я наблюдал это не раз: участники, которые выучили математику RSA и могут объяснить протокол Диффи-Хеллмана на доске, проваливаются на задачах уровня base64-в-base32-в-hex. Проблема не в интеллекте — распознавание паттернов и знание теории живут в разных навыковых плоскостях. Паттерн-матчинг тренируется только решением десятков задач подряд, ни одна книга этого не даёт.
Рискну дать прогноз: в ближайшие год-два crypto-задачи начального уровня на CTF усложнятся не по математике, а по количеству вложенных слоёв и нестандартных кодировок. CyberChef Magic уже справляется с простыми случаями, и авторы задач вынуждены использовать кастомные алфавиты и комбинации XOR с многослойным кодированием, которые автоматика не берёт. Единственный способ не застрять — писать свои солверы хотя бы на уровне десятистрочного скрипта.
Самое ценное, что дают crypto-задачи, — привычка декомпозировать проблему. Видишь base64-строку в cookie — декодируешь — внутри JSON с ещё одним слоем кодирования. Тот же навык нужен при анализе JWT-токенов в реальном веб-приложении или реверсе обфусцированного payload'а. Если хочешь не только разбирать writeups, а выстроить навык с прогрессией от задачи к задаче — на WAPT это реализовано через лабы с ментором в чате.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...