Запись для HSCTF 7 2020 Николасом, Муниром, Джозефом и Смаами.

На последнем курсе у нас почти не было свободного времени, так как мы тратим его больше на собственные исследования, чтобы выполнить требования к выпускным. Мы давно не играем в CTF, а иногда и пропускаем. Итак, на этой неделе мы решили немного отдохнуть от наших исследований, поиграв в HSCTF 2020 для развлечения 🤪🤪🤪. Итак, я объясню некоторые проблемы, которые мы решили на этом конкурсе CTF.

Оглавление

Crypto: xkcd.com/2247 v2–473 балла
Crypto: Affina and the quadratics - 416 баллов
Crypto: чрезвычайно сложные задачи - 390 баллов
Crypto: Smol E - 387 баллов
Криминалистика: Evil Stego - 434 балла
Криминалистика: ограбление банка - 432 балла
Разное: Emojis - 443 балла
Разное: N-95–395 баллов
Разное: Яблочный пирог - 319 баллов

Крипто: xkcd.com/2247 v2–473 балла

Зачем выбирать странный холм, чтобы умереть, если можно выбрать мягкий холм, чтобы лечь на него?

Примечание: эта задача была изменена с новым флагом. Ранее он был отключен, и все решения для этой задачи были отменены.

Форматом флага будет flag {a_bunch_of_words_with_underscores}. Флаг скрыт внутри открытого текста и не включает флаг {}.

В этой задаче нам дали файл, содержащий ключ шифрования с набором случайных символов, а зашифрованный текст также выглядит как набор случайных символов.

Я пытаюсь проверить длину ключа шифрования и зашифрованного текста, и оба они имеют одинаковую длину, равную 1000. Прочитав описание проблемы, я интуиция подсказывала, что этот вызов связан с Hill Cipher. Читая википедию, пытаюсь реализовать метод дешифрования с помощью sagemath.

По сути, сначала нам нужно создать ключ матрицы дешифрования. Шаг состоит в том, чтобы преобразовать все случайные символы в ключе шифрования в число (A = 0, B = 1, C = 2,…, Z = 25), разделить его на 100 символов, чтобы создать матрицу 100 x 100, и инвертировать ее. по модулю 26. После создания ключа дешифрования нам просто нужно преобразовать зашифрованный текст в число, как и раньше, разделить его на 100 символов, чтобы создать вектор 100 x 1, а затем умножить наш Матрица 100 х 100 с вектором. После его умножения мы получим десятичное представление нашего флага, и нам просто нужно преобразовать его обратно в char. Расшифрованный текст будет выглядеть как набор случайных символов, но если присмотреться, в центре расшифрованного текста есть скрытый флаг.

Flag: flag{imagine_giving_the_plaintext_and_not_the_ciphertext_rip_lmao}

Crypto: Affina and the quadratics - 416 баллов

Аффина боролась с домашним заданием по построению квадратиков. Скучно, она решила схитрить, используя Десмос для построения графика данной квадратичной кривой, а затем поняла, что может использовать его для отправки сообщений своему лучшему другу, чтобы никто не заметил!

Автор: Plate_of_Sunshine

Примечание. Affina использует 26-символьную кодировку, а числа кодируются по-другому.

На этот вызов нам дали два файла. Первый файл - это изображение графика, а второй - текстовый файл, содержащий:

Affina was struggling with her graphing quadratics homework. Bored, she decided to cheat by using Desmos to graph the given quadratic, and then realized that she could use it to send messages to her best friend without anyone noticing!
She sent the following message to her friend: 7rr4p6_4e_4ph6bo8hap2?
Can you decrypt it using the image of the quadratic Affina used? Note: the flag should make relative sense.

Из этого графика мы могли вывести уравнения, потому что мы могли видеть, что на этом изображении есть три точки: (0,2), (-1, 0) и (-2, 0). С этого момента мы знаем, что уравнение имеет вид x² + 3x + 2.

Теперь, читая заголовок задачи, мы можем сделать вывод, что эта задача на самом деле связана с Аффинным шифром. Из уравнения графика мы знаем, что значения и b соответственно равны 3 и 2. Используя это значение, мы можем расшифровать зашифрованное сообщение.

Обратите внимание, что в описании задачи сказано, что число закодировано по-другому. Угадав, нам просто нужно сместить наш номер влево на 3 (циклический), и флаг у нас получился.

Flag: flag{4ff1n3_1s_1nt3re5tin9}

Crypto: Extremely Complex Challenge - 392 балла

У Эрика есть эллиптическая кривая, определенная над полем Галуа с порядком 404993569381. Точка генератора (391109997465, 167359562362) дается вместе с открытым ключом (209038982304, 168517698208). Мы также знаем, что кривая определяется как y² = x³ + ax + b (mod p), и что b равно 54575449882. Что такое закрытый ключ Эрика? Выразите ключ как целое число с основанием 10. Используйте флаг формата flag {+ private_key +}.

Автор: AC

Это задача дискретного логарифма эллиптической кривой (ECDLP). Одна из известных атак для такого рода проблем - это метод Pohlig-Hellman. Ссылаясь на эту хорошую рецензию о ECDLP, нам нужно сначала получить значение a уравнения кривой. Поскольку мы знаем точку генератора, мы можем получить значение a, изменив уравнение кривой на a = (y²-x³-b) / x mod n. Я использую мудрец.

# Curve: y^2 = x^3 + ax + b (mod p)
p = 404993569381
P = (391109997465, 167359562362)
Q = (209038982304, 168517698208)
b = 54575449882
# Retrieve a
x, y = P[0], P[1]
a = QQ(y**2 - x**3 - b)/x % p # a = 316508952642

После получения значения a мы могли построить нашу эллиптическую кривую. Теперь мы могли бы попытаться сначала проверить, пригодна ли наша эллиптическая кривая для этой атаки, проверив фактор порядка кривой.

F = FiniteField(p)
E = EllipticCurve(F,[a,b])
factor(E.order()) # 2^5 * 19 * 16829 * 39581

Фактор достаточно мал и это возможно! Вы можете прочитать упомянутую рецензию для математической концепции и деталей атаки (это хорошая рецензия, которая помогает мне понять об этой атаке). Итак, это полный сценарий решения этой проблемы.

Flag: flag{17683067357}

Crypto: Smol E - 387 баллов

У Аншула есть сообщение, которое он хочет отправить Дише с помощью RSA. Он дополнил сообщение случайным заполнением и отправил его Дише, но она не получила сообщение. Однако она смогла получить сообщение после второй попытки Аншула. Вы смогли перехватить оба шифртекста Аншула, а также получили открытый ключ RSA Аншула. Вы можете восстановить сообщение?

Автор: AC

Нам дали текстовый файл, содержащий n, e, c1 и c2.

Это классическая атака с короткими контактами Coppersmith, где мы могли бы найти значение разницы между сообщением 1 и сообщением 2, а затем выполнить атаку сообщения, связанного с Франклином-Рейтером . Существует множество скриптов, реализующих эту атаку, поэтому я повторно использую то, что нашел первым, в Google 🙂 (большое спасибо автору этого скрипта 🤙🤙🤙). Из этого сценария мы могли получить сообщение. Однако нам все еще нужно сдвинуть это полученное значение к нашему размеру заполнения. Помните, что мы не знаем размер заполнения, поэтому я просто беру его, сдвигая извлеченное сообщение по очереди, пока не нашел "flag {" в расшифрованном сообщении. Вот решатель, который я использовал.

Flag: flag{n0t_4_v3ry_sm0l_fl4g}

Криминалистика: Evil Stego - 434 балла

такое зло, много стего, вау

Автор: PMP

В этой задаче нам дали изображение, которое выглядит так:

Пытаясь выполнить zsteg на изображении, мы обнаружили ссылку на github, которая ведет к скрипту, который используется для планирования флага внутри изображения.

По сути, сценарий выбирает любое место (которое является случайным) на изображении и помещает бит флага в его LSB. Оказывается, скрипт добавляет случайное начальное число и размер флага к URL-адресу github. Поскольку мы знаем случайное начальное число, это означает, что мы можем знать позицию местоположения для каждого бита нашего флага.

Мы создаем сценарий, который будет воспроизводить расположение флага и получать его значение LSB. После получения всех бит. нам просто нужно преобразовать его в строку. Вот мой сценарий решателя.

Flag: flag{4b50lu73ly_b4rb4r1c_1403379d}

Криминалистика: ограбление банка - 432 балла

не делай этого не делай этого не грабь банк

Автор: AC

Нам дали файл под названием BankRobbing. Проверив шестнадцатеричный дамп, мы обнаружили на нем интересный заголовок.

Немного погуглив, мы попадаем на форум, который дает нам понять, что это файл банка. Основываясь на ветке на форуме сообщества steam, мы могли извлечь этот файл, чтобы получить файл .fsb, а затем извлечь файл fsb, чтобы получить аудиофайл. Нам просто нужно сделать именно то, что сказано в потоке, и мы получим аудиофайл. Прослушивая файл о дерзости, мы могли услышать, что автор этого задания произносит флаги.

Flag: flag{sh4m3_0n_y0u_4_r0bbing_th15_b4nk}

Разное: Emojis - 443 балла

Эсоланг задним ходом!

Автор: JC01010

У нас есть файл, в котором много смайлов.

Немного погуглив, мы попали в эсоланг под названием Emoji-gramming. Читая документацию, мы могли бы использовать помощь sagemath для решения этой проблемы, преобразовывая инструкции смайликов одну за другой, чтобы создать систему линейных уравнений. Вот полный сценарий.

Отказ от ответственности: оказывается, это неработающий вызов, где разбит флаг. Итак, после использования sage для решения наших линейных уравнений нам нужно предоставить результат нашего решения администратору, и администратор выдаст нам реальный флаг, если наш флаг решателя достаточно близок к реальным флагам 🙈

Flag: flag{tr3v0r_pAck3r}

Разное: N-95 - 395 баллов

QR-коды носят маски, и вы тоже должны.

Автор: AC

В этой задаче нам был предоставлен файл png, который представляет собой замаскированный QR-код. Наша задача реконструировать его, пока он не даст нам флаг. Вот данный QRCode.

Итак, сначала нам нужно сделать простую реконструкцию с помощью Photoshop, чтобы поместить QRCode Finder и дать ему некоторую окраску для какого-то черного пикселя, который был замаскирован красным, зеленым или синим цветом. Вот мой первый восстановленный QR-код с помощью фотошопа.

После этого я нашел замечательный веб-сайт под названием qrazybox, который представляет собой онлайн-сеть, которая может помочь нам восстановить любой поврежденный QR-код. Мы импортируем созданное нами изображение на этот веб-сайт.

Поскольку это QR-код 25 x 25, это означает, что это QRCode версии 2. Нашим следующим шагом будет попытка восстановить шаблон информации о формате. Я подбираю шаблон информации о формате, проверяя его один за другим и пытаюсь извлечь информацию QRCode. Оказывается, когда я использую уровень коррекции ошибок M и шаблон маски 3, информация содержит наш флаг, но последние два символа неверны. Активируя функцию анализа последовательности данных, мы могли бы попытаться найти наш блок QRCode, который содержит неправильные данные, и попытаться побитно исправить этот блок, чтобы два последних символа имели смысл в нашем флаге.

Flag: flag{60_dozen_quartz_jars}

Разное: яблочный пирог - 319 баллов

Мой друг дал мне эту программу, но я не понимаю, что это значит.

Примечание: ваш вывод должен быть проанализирован на десятичные представления символов ASCII.

Автор: AC

В этой задаче нам дали файл с расширением .pie, который содержит что-то вроде языка esolang. Погуглив немного, мы выяснили, что это файл Apple Pie Esolang Language. Нам просто нужно следовать команде, чтобы воспроизвести, как работает скрипт. Я использую старые способы, чтобы вручную воспроизвести его на бумаге 😂. Результатом этого файла будет это число:

051112116119048110052

Разделив текст на 3 части, мы можем преобразовать десятичное число в представление типа char.

flag: flag{3ptw0n4}

Слова от автора

HSCTF - это весело и помогает нам снять стресс! Престижность моему товарищу по команде, так как нам удалось решить множество задач, хотя мы не играли в CTF какое-то время. Спасибо HSCTF за участие в соревнованиях CTF ☺️!