#pwn #re #reverse #stack #ctf #writeup #codeby от @swimming_bear
Таск PWN с Киберколизея Codeby "Вход не для всех"
https://telegra.ph/Kiberkolizej-CODEBY-04-2024-PWN-1-05-01
Таск PWN с Киберколизея Codeby "Купи слона"
https://telegra.ph/Kiberkolizej-CODEBY-04-2024-Writeup-PWN-2-05-01
Последний легкий таск PWN с Киберколизея Codeby (название сейчас уже не помню)
https://telegra.ph/Kiberkolizej-CODEBY-04-2024-Writeup-PWN-3-05-01
🚩 https://codeby.games
#codebygames
Таск PWN с Киберколизея Codeby "Вход не для всех"
https://telegra.ph/Kiberkolizej-CODEBY-04-2024-PWN-1-05-01
Таск PWN с Киберколизея Codeby "Купи слона"
https://telegra.ph/Kiberkolizej-CODEBY-04-2024-Writeup-PWN-2-05-01
Последний легкий таск PWN с Киберколизея Codeby (название сейчас уже не помню)
https://telegra.ph/Kiberkolizej-CODEBY-04-2024-Writeup-PWN-3-05-01
#codebygames
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegraph
Киберколизей CODEBY 04-2024. Writeup PWN #1
Полезная информации по ИБ и разборы задачек CTF. Киберколизей CODEBY 04-2024. Writeup PWN #2 Киберколизей CODEBY 04-2024. Writeup PWN #3 "Вход не для всех" При запуске у нас запрашивается сначала логин, после ввода "admin" нам предлагается ввести пароль,…
❤6
#writeup #misc
Discard от @Max_RSC
Дан шестнадцатеричный дамп. Назовем его stegofile и обратим:
Посмотрим, что мы получили:
Эта непонятная последовательность символов представляет собой примитивный шифр ROT-47. Чтобы перевести ROT-47 в ASCII, воспользуемся замечательным сервисом dCode:
Мы получили ссылку. Нетрудно догадаться, куда она ведет. Переходим.
Мы пришли на Discord-сервер, который называется CTF. Похоже, что здесь множество чатов. Неужели нужно идти в каждый? Нет. Организаторы оставили подсказку: "25". Вспомним другую подсказку: "Го в войс". Может быть, в 25-м по счету чате войса находится скрытое послание? На сервере два войса, поэтому мне пришлось проверить 25-е чаты в обоих. В первом чате не оказалось ничего, зато во втором было прикреплено вложение – архив WoW.zip.
Скачиваем и распаковываем архив. Мы получили файл WoW.img. На первый взгляд дан файл образа диска, но выполнив:
...мы поймем, что на самом деле это картинка с расширением .png. Утилита binwalk сообщает, что в картинкe спрятан архив. Достаем егo:
В архиве находится текстовый документ, который начинается со слов "Snow may be the only thing...". Слово "snow" наводит на мысль, что мы имеем дело со стеганографией и нужно использовать инструмент stegsnow.
Выполняем эту команду и получаем флаг.
#HackOsint2024
Discard от @Max_RSC
Дан шестнадцатеричный дамп. Назовем его stegofile и обратим:
xxd -r stegofile > res
Посмотрим, что мы получили:
cat res
Эта непонятная последовательность символов представляет собой примитивный шифр ROT-47. Чтобы перевести ROT-47 в ASCII, воспользуемся замечательным сервисом dCode:
https://www.dcode.fr/rot-47-cipher
Мы получили ссылку. Нетрудно догадаться, куда она ведет. Переходим.
Мы пришли на Discord-сервер, который называется CTF. Похоже, что здесь множество чатов. Неужели нужно идти в каждый? Нет. Организаторы оставили подсказку: "25". Вспомним другую подсказку: "Го в войс". Может быть, в 25-м по счету чате войса находится скрытое послание? На сервере два войса, поэтому мне пришлось проверить 25-е чаты в обоих. В первом чате не оказалось ничего, зато во втором было прикреплено вложение – архив WoW.zip.
Скачиваем и распаковываем архив. Мы получили файл WoW.img. На первый взгляд дан файл образа диска, но выполнив:
file WoW.img
...мы поймем, что на самом деле это картинка с расширением .png. Утилита binwalk сообщает, что в картинкe спрятан архив. Достаем егo:
binwalk --dd='.*' WoW.img
В архиве находится текстовый документ, который начинается со слов "Snow may be the only thing...". Слово "snow" наводит на мысль, что мы имеем дело со стеганографией и нужно использовать инструмент stegsnow.
stegsnow -C WhatLiesInside.txt
Выполняем эту команду и получаем флаг.
#HackOsint2024
❤12
Forwarded from TaipanByte CTF
Всем привет! 😎
Мы добавили несколько райтапов на таски Codeby.games:
🗂 Архиватор
#web #easy
🔐 Доступ запрещен
#web #medium
💸 Базовая авторизация 2
#web #medium
🦖Мистер Дино
#web #easy
🍯Ханипот
#web #easy
👩👩👦Семья
#crypto #easy
㊙️Руны, руны, и ещё раз руны
#crypto #medium
🪆Матрешка
#forensic #easy
#codeby #writeup
Мы добавили несколько райтапов на таски Codeby.games:
#web #easy
#web #medium
#web #medium
🦖Мистер Дино
#web #easy
🍯Ханипот
#web #easy
👩👩👦Семья
#crypto #easy
㊙️Руны, руны, и ещё раз руны
#crypto #medium
🪆Матрешка
#forensic #easy
#codeby #writeup
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4👍2
#crypto #codebygames #writeup
Pайтап по таску Sophie German c Codeby Games от @Max_RSC (ТОП-10 на платформе) 🚩
В описании намекается, что криптограф допустил какую-то серьезную ошибку. Ошибка, о которой идет речь, заключается в том, что он забыл проверить наличие значения n в публичной базе FactorDB. Это означает, что факторы (p и q), произведение которых дало n, уже известны, поэтому решение становится простейшим:
1. Идем на caйт https://dcode.fr/rsa-cipher и вводим значения n, c, e в соответствующие поля.
2. Нажимаем кнопку "CALCULATE/DECRYPT".
После выполнения этих шагов мы получим флаг.
Pайтап по таску Sophie German c Codeby Games от @Max_RSC (ТОП-10 на платформе) 🚩
В описании намекается, что криптограф допустил какую-то серьезную ошибку. Ошибка, о которой идет речь, заключается в том, что он забыл проверить наличие значения n в публичной базе FactorDB. Это означает, что факторы (p и q), произведение которых дало n, уже известны, поэтому решение становится простейшим:
1. Идем на caйт https://dcode.fr/rsa-cipher и вводим значения n, c, e в соответствующие поля.
2. Нажимаем кнопку "CALCULATE/DECRYPT".
После выполнения этих шагов мы получим флаг.
❤10
#googlectf #writeup #crypto
Redacted RSA 1 от @Max_RSC
Всем привет! Я планирую написать серию разборов задач по криптографии от Google CTF. Вкратце, суть заключается в том, что в каждой последующей задачке приватный ключ становится все более поврежденным. В Redacted RSA 1 нам предоставляется значение d, тогда как в Redacted RSA 2 извлечь d становится невозможно из-за сильного повреждения ключа. Тем не менее, значение d все еще можно рассчитать. Но давайте вернемся к первой, самой простой задачке этой серии.
В первом случае у нас есть часть приватного ключа, которая содержит не только значения открытого ключа (n и e), но и значение приватной экспоненты (d), то есть все необходимые данные для расшифровки. Основная сложность, с которой сталкиваются новички, заключается в том, что они не знают, как извлечь эти значения. Простым и доступным способом решения этой проблемы является использование онлайн-сервиса, такого как:
https://lapo.it/asn1js
Однако, чтобы ключ был правильно прочитан этим сервисом, необходимо выполнить несколько шагов. Во-первых, откройте приватный ключ в любом текстовом редакторе и замените все звездочки (*) на символы, допустимые в base64 (например, на «A»). После этого файл можно загрузить на сервис, который корректно интерпретирует данные. Если при попытке загрузить ключ на сервис возникла ошибка с сообщением наподобие "Error: Content size is not correct for container at offset 6", это означает, что вы что-то сделали не так.
В результате, загрузив наш поврежденный приватный ключ на сервис, мы увидели, что он все еще достаточно целостен, чтобы расшифровать шифртекст: значения n и d сохранились в полном объеме!
Я сделаю небольшое пояснение для новичков о значениях, которые мы рассматриваем:
• modulus (n) – это модуль. Обычно в задачах на RSA значение n предоставляется. В данном случае n представляет собой длинную строку, начинающуюся с 641646.
• publicExponent (e) – это публичная экспонента. В большинстве случаев она равна 65537, что является стандартом. Пара значений n и e в их совокупности образует открытый ключ.
• privateExponent (d) – это приватная экспонента. Закрытый (приватный) ключ формируется из пары значений d и n. Именно закрытый ключ используется для расшифровки зашифрованного текста. В большинстве задач по RSA необходимо рассчитать или каким-то образом получить значение d. В Redacted RSA 1 d уже известно.
• prime1 (p) – это первый фактор. В этой задачке значение p невозможно извлечь из-за повреждения приватного ключа, но нам это не нужно, так как у нас есть d.
• prime2 (q) – это второй фактор. Произведение первого и второго факторов дает значение n. Аналогично, значение q невозможно извлечь, но это нам не нужно, так как у нас есть d.
Чтобы скопировать конкретное значение с данного сервиса, необходимо щелкнуть по нему левой кнопкой мыши и выбрать опцию "Сopy value".
Еще одной распространенной проблемой, с которой сталкиваются новички, является то, что они не знают, как перевести шифртекст в десятичный формат (base10). В контексте RSA мы обычно работаем с целыми числами. На мой взгляд, наиболее быстрым и доступным способом будет использование языков программирования, например, Python:
Теперь остается только расшифровать флаг. Авторы задачки предлагают использовать команду OpenSSL, однако у новичков это может вызвать трудности. На соревнованиях имеет смысл потратить время более эффективно, вместо того чтобы вспоминать, какая именно команда нужна для расшифровки. Поэтому проще воспользоваться сервисом dCode:
1. Идем на https://dcode.fr/rsa-cipher и вводим значения n, c, e, d в соответствующие поля.
2. Нажимаем кнопку "CALCULATE/DECRYPT" для выполнения расшифровки.
Хотел бы добавить, что задачка по-прежнему доступна для решения, и вы можете повторить описанные шаги.
Redacted RSA 1 от @Max_RSC
Всем привет! Я планирую написать серию разборов задач по криптографии от Google CTF. Вкратце, суть заключается в том, что в каждой последующей задачке приватный ключ становится все более поврежденным. В Redacted RSA 1 нам предоставляется значение d, тогда как в Redacted RSA 2 извлечь d становится невозможно из-за сильного повреждения ключа. Тем не менее, значение d все еще можно рассчитать. Но давайте вернемся к первой, самой простой задачке этой серии.
В первом случае у нас есть часть приватного ключа, которая содержит не только значения открытого ключа (n и e), но и значение приватной экспоненты (d), то есть все необходимые данные для расшифровки. Основная сложность, с которой сталкиваются новички, заключается в том, что они не знают, как извлечь эти значения. Простым и доступным способом решения этой проблемы является использование онлайн-сервиса, такого как:
https://lapo.it/asn1js
Однако, чтобы ключ был правильно прочитан этим сервисом, необходимо выполнить несколько шагов. Во-первых, откройте приватный ключ в любом текстовом редакторе и замените все звездочки (*) на символы, допустимые в base64 (например, на «A»). После этого файл можно загрузить на сервис, который корректно интерпретирует данные. Если при попытке загрузить ключ на сервис возникла ошибка с сообщением наподобие "Error: Content size is not correct for container at offset 6", это означает, что вы что-то сделали не так.
В результате, загрузив наш поврежденный приватный ключ на сервис, мы увидели, что он все еще достаточно целостен, чтобы расшифровать шифртекст: значения n и d сохранились в полном объеме!
Я сделаю небольшое пояснение для новичков о значениях, которые мы рассматриваем:
• modulus (n) – это модуль. Обычно в задачах на RSA значение n предоставляется. В данном случае n представляет собой длинную строку, начинающуюся с 641646.
• publicExponent (e) – это публичная экспонента. В большинстве случаев она равна 65537, что является стандартом. Пара значений n и e в их совокупности образует открытый ключ.
• privateExponent (d) – это приватная экспонента. Закрытый (приватный) ключ формируется из пары значений d и n. Именно закрытый ключ используется для расшифровки зашифрованного текста. В большинстве задач по RSA необходимо рассчитать или каким-то образом получить значение d. В Redacted RSA 1 d уже известно.
• prime1 (p) – это первый фактор. В этой задачке значение p невозможно извлечь из-за повреждения приватного ключа, но нам это не нужно, так как у нас есть d.
• prime2 (q) – это второй фактор. Произведение первого и второго факторов дает значение n. Аналогично, значение q невозможно извлечь, но это нам не нужно, так как у нас есть d.
Чтобы скопировать конкретное значение с данного сервиса, необходимо щелкнуть по нему левой кнопкой мыши и выбрать опцию "Сopy value".
Еще одной распространенной проблемой, с которой сталкиваются новички, является то, что они не знают, как перевести шифртекст в десятичный формат (base10). В контексте RSA мы обычно работаем с целыми числами. На мой взгляд, наиболее быстрым и доступным способом будет использование языков программирования, например, Python:
# Открываем файл
with open('encrypted.txt', 'rb') as file:
byte_data = file.read() # Читаем содержимое файла как байты
# Преобразуем байты в base10
encoded = int.from_bytes(byte_data, 'big')
# Выводим результат
print(encoded)
Теперь остается только расшифровать флаг. Авторы задачки предлагают использовать команду OpenSSL, однако у новичков это может вызвать трудности. На соревнованиях имеет смысл потратить время более эффективно, вместо того чтобы вспоминать, какая именно команда нужна для расшифровки. Поэтому проще воспользоваться сервисом dCode:
1. Идем на https://dcode.fr/rsa-cipher и вводим значения n, c, e, d в соответствующие поля.
2. Нажимаем кнопку "CALCULATE/DECRYPT" для выполнения расшифровки.
Хотел бы добавить, что задачка по-прежнему доступна для решения, и вы можете повторить описанные шаги.
2👍12❤8🔥4🐳1
Where is my Pony? NullByte Eternal Games Writeup от @Max_RSC
Без лишних предисловий перейдем к делу.
Нам дали какой-то flashdrive. На всякий случай сделаем strings: вдруг флаг лежит в открытом виде?
Фейк! Почему я не удивлен :D
Кидаем в file, чтобы понять, что представляет собой этот файл:
Окей, это образ флешки. FAT32, куча секторов, скрытых разделов — в общем, все как обычно: у @CyberFazaN легко не бывает.
Чтобы посмотреть, что на флешке, воспользуемся утилиткой fls из пакета sleuthkit:
Берем icat из пакета sleuthkit и начинаем вытаскивать все подряд:
Файл LOOOOOOOVEEEEEEEE.txt выглядит как текстовый, но...
Оказывается, это JPEG. Переименовываем:
Открываем картинку:
Видим флаг.
Ссылка на задание
#forensics #NullByte #NBGames #writeup
Без лишних предисловий перейдем к делу.
Нам дали какой-то flashdrive. На всякий случай сделаем strings: вдруг флаг лежит в открытом виде?
strings flashdrive | grep -i X0G4M3
# Вывод:
X0G4M3{Th1s_1S_N0t_MY_B3l0v3D_P0nY}
Фейк! Почему я не удивлен :D
Кидаем в file, чтобы понять, что представляет собой этот файл:
file flashdrive
# Вывод:
flashdrive: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 8, Media descriptor 0xf8, sectors/track 32, heads 64, hidden sectors 26116096, sectors 4192256 (volumes > 32 MB), FAT (32 bit), sectors/FAT 4088, reserved 0x1, serial number 0xd873f71c, unlabeled
Окей, это образ флешки. FAT32, куча секторов, скрытых разделов — в общем, все как обычно: у @CyberFazaN легко не бывает.
Чтобы посмотреть, что на флешке, воспользуемся утилиткой fls из пакета sleuthkit:
fls -r -f fat32 -o 0 flashdrive
# Вывод:
DO_NOT_OPEN/ # ну конечно, сразу хочется туда залезть!
MyBelovedVideo.mp4 # подозрительно милое название...
wallpaper.png # вряд ли это интересно
.hidden # о, папочка с секретиками!
.NotThat.jpg # классика: "это не то, что ты ищешь" (скорее всего, как раз именно то)
______~1.PNG # похоже на битую картинку
LOOOOOOOVEEEEEEEE.txt # это явно не просто текстовик...
Берем icat из пакета sleuthkit и начинаем вытаскивать все подряд:
icat -o 0 flashdrive 135 > MyBelovedVideo.mp4
icat -o 0 flashdrive 6 > wallpaper.png
# и так далее...
Файл LOOOOOOOVEEEEEEEE.txt выглядит как текстовый, но...
file LOOOOOOOVEEEEEEEE.txt
# Вывод:
LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.txt: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, comment: "Nice", progressive, precision 8, 720x850, components 3
Оказывается, это JPEG. Переименовываем:
mv LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.txt LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.jpg
Открываем картинку:
eog LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.jpg
Видим флаг.
Ссылка на задание
#forensics #NullByte #NBGames #writeup
❤22
Эй, народ! @s41nt0l3xus поделился с нами крутым райтапом на интересный hard pwn, который был на недавнем SAS CTF 2025 Quals! Речь про таск Broken Trust! Райтап большой, поэтому автор залил его на гитхаб. Обязательно загляните, будет интересно!
#pwn #writeup #sasctf2025
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
#pwn #writeup #sasctf2025
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍3🤯3
@s41nt0l3xus снова делится с нами райтапом на hard pwn с SAS CTF 2025 Quals — на этот раз разбирает таску Trust Issues. Райтап большой, поэтому автор залил его на гитхаб.
Кстати, райтап на Broken Trust мы выкладывали вот здесь.
#pwn #writeup #sasctf2025
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Кстати, райтап на Broken Trust мы выкладывали вот здесь.
#pwn #writeup #sasctf2025
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
CTF-writeups/sasctf-quals-2025/trust-issues at master · s41nt0l3xus/CTF-writeups
CTF writeups. Contribute to s41nt0l3xus/CTF-writeups development by creating an account on GitHub.
👍10🔥5
FreeHackQuest - admin_vol.1. Writeup от @Max_RSC
Задача — имея образ виртуального диска Mik.vdi, найти информацию о злоумышленнике, про которого известно, что он очень любит "Матрицу" и "Алису в стране чудес".
Подключаем диск Mik.vdi к виртуалке с Kali Linux и загружаемся. После старта в /media/kali видим два смонтированных раздела: system и system1.
Раз есть "Матрица", значит, наверняка есть Нео. Предположим, что n30 – один из пользователей этой системы. Пробуем поискать информацию по ключевому слову n30:
Ничего интересного. Хорошо, теперь поищем в system1:
Получаем зацепку и начинаем копать более прицельно:
Ключик -a заставляет grep рассматривать файл как текстовый, даже если это бинарный файл.
В результате натыкаемся на пользователя whiterabbit, а рядом — флаг.
"whiterabbit" — это явная отсылка одновременно и к "Алисе" и к "Матрице", так что можно было сразу грепать и по "white", и по "rabbit". Разумеется, при условии, что кибератлет достаточно эрудирован и уловил отсылку из условия задачи.
#admin #forensics #fhq #writeup
Задача — имея образ виртуального диска Mik.vdi, найти информацию о злоумышленнике, про которого известно, что он очень любит "Матрицу" и "Алису в стране чудес".
Подключаем диск Mik.vdi к виртуалке с Kali Linux и загружаемся. После старта в /media/kali видим два смонтированных раздела: system и system1.
Раз есть "Матрица", значит, наверняка есть Нео. Предположим, что n30 – один из пользователей этой системы. Пробуем поискать информацию по ключевому слову n30:
grep -i n30 -r /media/kali/system
Ничего интересного. Хорошо, теперь поищем в system1:
grep -i n30 -r /media/kali/system1
Получаем зацепку и начинаем копать более прицельно:
grep -ai n30 -r /media/kali/system1/rw/store/user.dat
Ключик -a заставляет grep рассматривать файл как текстовый, даже если это бинарный файл.
В результате натыкаемся на пользователя whiterabbit, а рядом — флаг.
"whiterabbit" — это явная отсылка одновременно и к "Алисе" и к "Матрице", так что можно было сразу грепать и по "white", и по "rabbit". Разумеется, при условии, что кибератлет достаточно эрудирован и уловил отсылку из условия задачи.
#admin #forensics #fhq #writeup
❤12
Всем привет! 🕵🏻
Накидал коротенький райтап по осинт таску с прошедших киберучений CyberCamp
Помог вернуть несчастному горе-коту Компоту крипту
➡️ Ссылка на райтап
#writeup #osint #cybercamp2025
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Накидал коротенький райтап по осинт таску с прошедших киберучений CyberCamp
Помог вернуть несчастному горе-коту Компоту крипту
#writeup #osint #cybercamp2025
Please open Telegram to view this post
VIEW IN TELEGRAM
Teletype
!writeup Киберучения Митап по киберразведке [18 июля] | !task Всегда найдется рыба покрупнее
Подписывайтесь на https://t.me/writeup_ctf
🔥10
Райтапы по CTF{2025}
Всем привет! 🕵🏻 Накидал коротенький райтап по осинт таску с прошедших киберучений CyberCamp Помог вернуть несчастному горе-коту Компоту крипту ➡️ Ссылка на райтап #writeup #osint #cybercamp2025 💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Разобранные таски:
- Всегда найдется рыба покрупнее
- Собери ловушку для фишинга
- Операция “meow”
Автор: @red_baron17
#writeup #osint #cybercamp2025
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - AronHopeless/CyberCamp2025_guide: The CyberCamp2025 tasks solution
The CyberCamp2025 tasks solution. Contribute to AronHopeless/CyberCamp2025_guide development by creating an account on GitHub.
#crypto #medium #writeup
Kuban CTF – "Двойная проблема" от @Max_RSC (ТОП-10 на HackerLab)
Перед нами очередная задачка из мира CTF, где дают слегка кривую (точнее — уязвимую) реализацию RSA. В этот раз на входе у нас два модуля n1 и n2, одинаковая публичная экспонента e, и одно зашифрованное сообщение c. Все необходимые данные приведены непосредственно в тексте поста, поэтому отдельный файл не прикладывается.
Ключевой момент: когда дают сразу два разных n, у них может оказаться общий делитель. Если так, то мы фактически получаем одно из простых чисел, из которых складывается модуль n. Безопасность RSA держится на сложности факторизации, и как только мы каким-то образом обошли эту сложность, остальное — детская арифметика. То есть задача опирается на тот факт, что RSA небезопасен, если модули разделяют хотя бы один множитель. Если мы найдем один из множителей, например, p, то после этого сможем легко посчитать функцию Эйлера, найти приватную экспоненту d и расшифровать флаг.
Чтобы найти p, подтягиваем функцию gcd из библиотеки math:
Подставляем числа, которые даны по условию:
Вычисляем общий делитель:
Теперь у нас на выбор два пути: либо закинуть все это добро в онлайн‑сервис (вроде dcode.fr) и быстро получить результат, либо честно проделать руками в Python — ради спортивного интереса займемся вторым (хотя на соревнованиях я выбираю первое :D)
Находим второй множитель для n1. Про n2 в данном случае можно смело забыть — он уже отработал свое:
Считаем значение функции Эйлера, то есть phi от n1:
Далее вычисляем приватную экспоненту:
Ну и кульминация: расшифровываем сообщение:
Остался финальный штрих — превратить число в строку. Новичков может сбить с толку момент с bytes.fromhex(...). Дело в том, что функция ждет строку из шестнадцатеричных символов. Когда мы пишем hex(m), то получаем строку вида '0x...'. Поэтому [2:] аккуратно обрезает приставку '0x', и тогда все работает без ошибок:
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Kuban CTF – "Двойная проблема" от @Max_RSC (ТОП-10 на HackerLab)
Перед нами очередная задачка из мира CTF, где дают слегка кривую (точнее — уязвимую) реализацию RSA. В этот раз на входе у нас два модуля n1 и n2, одинаковая публичная экспонента e, и одно зашифрованное сообщение c. Все необходимые данные приведены непосредственно в тексте поста, поэтому отдельный файл не прикладывается.
Ключевой момент: когда дают сразу два разных n, у них может оказаться общий делитель. Если так, то мы фактически получаем одно из простых чисел, из которых складывается модуль n. Безопасность RSA держится на сложности факторизации, и как только мы каким-то образом обошли эту сложность, остальное — детская арифметика. То есть задача опирается на тот факт, что RSA небезопасен, если модули разделяют хотя бы один множитель. Если мы найдем один из множителей, например, p, то после этого сможем легко посчитать функцию Эйлера, найти приватную экспоненту d и расшифровать флаг.
Чтобы найти p, подтягиваем функцию gcd из библиотеки math:
from math import gcd
Подставляем числа, которые даны по условию:
n1 = 85301229878846970301323107702818609695755812591124862399151849850592748938587788039100822431199468780483863005508930154818093365993106028516482945027104435477220021520315775763582770886230113033749748971338316409196598045001663482949869374010947883957820793242137793210215930782186351794325806945717508347881
n2 = 109513893064865824312887126037695992618837379743053225051510712684706298394844250173030307725980622229363463153247419002611731684061578669993893758240971054995662819118490841792391822485215186261857628830400956404892168386609596159676364114308057445982469895464743365411603666960249026127185036946732158072467
e = 65537
c = 80523060741828874775927939583674208314359823391190778967023421748976347340246911181413681174368696929906966394615901583879335335760357963720615301569603850444832668348817460953008596314270793433890476685628856002996942980704863201169642782967237984763737464120837902881702995220342897353879003315047260081532
Вычисляем общий делитель:
p = gcd(n1, n2)
Теперь у нас на выбор два пути: либо закинуть все это добро в онлайн‑сервис (вроде dcode.fr) и быстро получить результат, либо честно проделать руками в Python — ради спортивного интереса займемся вторым (хотя на соревнованиях я выбираю первое :D)
Находим второй множитель для n1. Про n2 в данном случае можно смело забыть — он уже отработал свое:
q = n1 // p
Считаем значение функции Эйлера, то есть phi от n1:
phi_n1 = (p - 1) * (q - 1)
Далее вычисляем приватную экспоненту:
d = pow(e, -1, phi_n1)
Ну и кульминация: расшифровываем сообщение:
m = pow(c, d, n1)
Остался финальный штрих — превратить число в строку. Новичков может сбить с толку момент с bytes.fromhex(...). Дело в том, что функция ждет строку из шестнадцатеричных символов. Когда мы пишем hex(m), то получаем строку вида '0x...'. Поэтому [2:] аккуратно обрезает приставку '0x', и тогда все работает без ошибок:
flag = bytes.fromhex(hex(m)[2:])
print(flag)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤30🔥7 2