CTF (Capture The Flag) - соревнования по информационной безопасности, главной целью участников которых является добыча флага путем решения заданий.
Флаг представляет собой строку, как правило, определенного формата вида: CTF{S0m3_exAMp!e} - краткое название CTF, после которого в фигурных скобках следует некий осмысленный текст, некоторые символы в котором могут быть заменены на похожие.
Задания на CTF делятся на несколько категорий. Среди них есть Crypto/Cryptography/Крипта/Криптография. Встречается практически везде.
Если кратко, криптография - метод защиты конфиденциальности некоторого сообщения путем его шифрования. Например, некоторый текст с помощью какой-то магии математики преобразуется в другой текст, по которому злоумышленник не сможет восстановить оригинал, а владелец ключа справится с этим без особых проблем. Ключ - секретные данные, которые являются чем-то вроде пароля от данных.
CryptoHack
CryptoHack - одна из платформ для изучения криптографии путем чтения кратенькой теории и решения задач в формате CTF.
В форме регистрации ждет первое испытание:
- Solve this Roman emperor's cipher (Разгадайте шифр римского императора): XHFS YMFSP KNQJ INSTXFZW
В криптографии из римских императоров особенно известен Гай Юлий Цезарь с его одноименным шифром Цезаря/Caesar cipher/ROT13 (сокращение от rotate - сдвиг).
Его суть заключается в сдвиге каждого символа на несколько позиций в алфавите. Пример: если произвести сдвиг на 2 буквы в слове "Цезарь" получится "Шжйвтю". Ключом является количество символов, на которое был осуществлен сдвиг.
Получение исходного сообщения происходит путем сдвига на такое же количество символов, но в обратную сторону.
Для понимания полезно "на бумажке" попробовать зашифровать/расшифровать несколько слов, но вообще есть несколько онлайн-инструментов, автоматизирующих полный перебор всех возможных сдвигов. Например, этот.
Вводим в поле зашифрованный текст, выбираем английский алфавит и нажимаем на кнопку "рассчитать".
Ниже выводятся получившиеся сообщения. Остается найти среди них осмысленное. В данном случае подойдет SCAN THANK FILE DINOSAUR
Теперь можно приступать к прохождению курсов.
Introduction to CryptoHack
Первый курс, посвященный самым основам, необходимым для дальнейшей работы. Далее представлен разбор некоторых заданий. Правила CryptoHack разрешают публикацию решений только для заданий на 10 и менее очков (их число будет указано в скобках рядом с названием).
Finding Flags (2 pts)
В этом задании происходит знакомство с флагами. Нужно лишь скопировать его в поле для отправки ответа и готово: crypto{y0ur_f1rst_fl4g}
Great Snakes (3 pts)
В рамках этого задания необходимо скачать файл great_snakes.py и запустить его при помощи Python. Да, без программирования дальше будет трудно, так что если Python ещё не установлен, рекомендую это сделать и изучить основы.
В результате будет выведен флаг: crypto{z3n_0f_pyth0n}
ASCII (5 pts)
ASCII - кодировка, сопостовляющая символы с кодами от 0 до 127. В задании дан список чисел как раз в этом диапазоне. Необходимо получить соответствующие им символы. Для работы с ASСII в Python есть две функции: chr(), которая по числу возвращает символ, и ord(), возвращающая код символа.
Можно найти каждый символ вручную по таблице или при помощи небольшой программы.
Если сделать все правильно, получим флаг: crypto{ASCII_pr1nt4bl3}
Hex (5 pts)
Hex (hexadecimal) - шестнадцатеричная система счисления. В нее может быть переведен код ASСII каждого символа текста. В данном случае дана строка, где каждый символ закодирован двумя цифрами. Для обратного преобразования можно воспользоваться функцией bytes.fromhex().
Получаем флаг: crypto{You_will_be_working_with_hex_strings_a_lot}
Base64 (10 pts)
Base64 — стандарт кодирования двоичных данных при помощи 64 символов ASCII. В задании требуется данный текст, записанный в hex, перевести в bytes (для этого потребуется программа из прошлого задания), после чего закодировать его в base64. В Python есть модуль base64, в котором содержатся инструменты для работы с этой кодировкой.
На выходе получается следующий флаг: crypto/Base+64+Encoding+is+Web+Safe/
Формат флага может меняться произвольно. Обычно организаторы CTF сообщают об этом.
Обратите внимание, что файл с программой, где импортируется модуль base64, не может называться base64, так как программа буквально импортирует сама себя. Аналогично и для других модулей.
Bytes and Big Integers (10 pts)
Дано очень большое число. Необходимо получить исходное сообщение. Для решения задания пригодится библиотека PyCryptodome (требует установки через pip). В ней есть функция, которая как раз делает то, что нам нужно: long_to_bytes().
Флаг: crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}
XOR Starter (10 pts)
XOR - исключающее "ИЛИ". Логическая операция, результат выполнения равен 1 тогда, когда переменные, разные, и 0, когда одинаковые.
В рамках данного задания необходимо код каждого символа слова "label" перевести в двоичную систему счисления (как и число 13), после чего произвести побитовый xor каждого символа и числа 13 (т.е. применить операцию исключающее или для каждого соответствующего разряда двоичного представления символа и 13).
Библиотека для Python pwntools (требует установки через pip) предлагает готовую функцию, проделывающую весь вышеописанный алгоритм - xor(). Далее воспользуемся именно ею, но для желающих глубже разобраться в теме рекомендую попробовать реализовать этот алгоритм самостоятельно.
По заданию флаг необходимо дооформить в crypto{...}, поэтому в результате получается: crypto{aloha}
Функция map() принимает два аргумента: второй - некоторый набор элементов (в данном случае список bytes), к которому необходимо применить функцию, указанную в качестве первого аргумента (скобки у нее не указывать!).
join объединяет последовательность символов в одну строчку через разделитель, указанный в кавычках перед ним. В данном случае разделителя нет - указана пустая строка.
Заключение
В рамках этого курса осталось еще три задания, которые можете попробовать решить самостоятельно на платформе CryptoHack.
Успехов!