Райтап на задание Капибатл, который решили всего ТРИ команды!
@hate_it_here, спасибо! ❤️
#pwn #linux #bpf #lpe #tctf2025
Капибатл
Описание задания:
Сегодня пройдет финал битвы огромных робокапибар. Сражения идут врукопашную. Некоторые игроки прознали, что у фаворита CAPY-9000 встроена ЭМ-пушка, которая выключает соперника. Это запрещено правилами. Взломайте робота CAPY-9000, найдите пушку и выключите ее.
ssh t-battle-ux658nop.spbctf.org
Username: battle
Password: 273V7UVE6QCV2XuuYsAvCA
Исходники: capybattle_7571838.tar.gz
Нерегламентированная ЭМ-пушка выключается командой /bin/deactivate
Райтап: https://blog.nekoea.red/posts/tctf25-capybattle-writeup/
Материалы задания и решения: https://meowgit.nekoea.red/nihonium/tctf25_capybattle_writeup
Please open Telegram to view this post
VIEW IN TELEGRAM
Эй, народ! @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
little_sploit.py
4.4 KB
#pwn #kasperskyctf2025
Kaspersky{CTF} - beta-test, 478 points от @tonysdx
💡 Идея:
У нас есть приложение, где можно создавать storages, с items внутри. Также можно редактировать контент внутри items и удалять их.
В
Также у нас есть
👹 Уязвимость:
1. Use-after-free — когда storage освобождается, его указатель остаётся в массиве
2. Downcasting размера описания item — если мы вводим описание длиной 255, программа преобразует его к 0.
3. Off-by-one — если у item описание нулевого размера, программа запишет нулевой байт за пределами буфера (
4. Uninitialized variable output — если мы введём что-то некорректное в меню, программа выведет неинициализированную переменную со стека.
💉 Эксплуатация:
1. Ликаем адрес стека, введя некорректный пункт меню — например,
2. Создаём storage #0 размером с feedback control chunk —
3. После создания
4. Заполняем
5. Освобождаем item #0 — это будет 7-й chunk в
6. Аллоцируем структуру
7. С этого момента мы можем декрементировать указатель feedback, используя вторую и третью уязвимости. Также у нас появляется read/write примитив по адресу, на который указывает control chunk feedback. Однако в данный момент мы можем двигаться только назад, уменьшая на единицу указатель.
8. Начинаем декрементировать указатель, аллоцируя items с описанием длиной 255. После аллокации нужно вызвать update для этих chunks, и так как размер item'а равен 0 (из-за downcasting), нулевой байт запишется до буфера, а именно в поле индекса storage.
9. После удаления этих обновлённых нулевых по размеру chunks мы уменьшаем на единицу первые 8 байт нулевого хранилища. А это указатель на строку в feedback's control chunk.
10. Наша главная цель — декрементировать указатель feedback так, чтобы он указывал сам на себя, и тогда мы сможем переписать его на любой другой адрес.
11. В любой момент мы можем вызвать функцию
12. Для раскодирования mangled адресов используем функцию моего эксплойта
13. Наша задача сделать так, чтобы при помощи обновления item мы могли изменять поинтер строки
14. Аллоцируем ещё один storage любого размера и 1 item размером меньше 255. Считаем его адрес, используя раскодированный heap-адрес выше и смещение от начала сегмента.
15. Аллоцированный item на шаге 14 будет chunk’ом для управления указателем feedback. Переписываем адрес control chunk feedback в бинарнике на наш контролируемый chunk (не забудьте добавить смещение — первые 2 байта items очень сложно обновить). Теперь можно обновить item с 14 шага, и он перепишет указатель на строку feedback. Мы получили AR/AW!
16. Ликаем libc через
17.
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Kaspersky{CTF} - beta-test, 478 points от @tonysdx
У нас есть приложение, где можно создавать storages, с items внутри. Также можно редактировать контент внутри items и удалять их.
В
storage у нас есть счетчик items, который при достижении 0, освобождает весь storage. Также у нас есть
feedback, который аллоцируется при первом вызове функции leave_feedback. После того как он аллоцирован, мы можем только редактировать содержимое его строки, которая хранится в отдельном чанке на хипе.👹 Уязвимость:
1. Use-after-free — когда storage освобождается, его указатель остаётся в массиве
storages_arr. 2. Downcasting размера описания item — если мы вводим описание длиной 255, программа преобразует его к 0.
3. Off-by-one — если у item описание нулевого размера, программа запишет нулевой байт за пределами буфера (
size_of_buffer - 1). Именно там в структуре item хранится индекс storage.4. Uninitialized variable output — если мы введём что-то некорректное в меню, программа выведет неинициализированную переменную со стека.
💉 Эксплуатация:
1. Ликаем адрес стека, введя некорректный пункт меню — например,
something_wrong. 2. Создаём storage #0 размером с feedback control chunk —
0x10 и item с описанием того же размера. 3. После создания
storage, если ввести неверный пункт в меню, получаем leak адреса бинарника. 4. Заполняем
0x20 tcache bin, аллоцируя 2 storages с описанием storage (размер - 1 байт) и описанием item (размер - 0x10 байт). readstr2 очень быстро заполнит tcache, так как всё в задаче использует calloc, который не может переиспользовать chunk из tcache и постоянно берет новые чанки. 5. Освобождаем item #0 — это будет 7-й chunk в
0x20 tcache bin. Поскольку счётчик items в storage #0 станет равен 0, он тоже освободится, и его указатель попадёт в fastbin.6. Аллоцируем структуру
feedback — она должна взять fastbin chunk для control chunk, так что теперь у нас есть указатель на неё в storage_arr[0]. 7. С этого момента мы можем декрементировать указатель feedback, используя вторую и третью уязвимости. Также у нас появляется read/write примитив по адресу, на который указывает control chunk feedback. Однако в данный момент мы можем двигаться только назад, уменьшая на единицу указатель.
8. Начинаем декрементировать указатель, аллоцируя items с описанием длиной 255. После аллокации нужно вызвать update для этих chunks, и так как размер item'а равен 0 (из-за downcasting), нулевой байт запишется до буфера, а именно в поле индекса storage.
9. После удаления этих обновлённых нулевых по размеру chunks мы уменьшаем на единицу первые 8 байт нулевого хранилища. А это указатель на строку в feedback's control chunk.
10. Наша главная цель — декрементировать указатель feedback так, чтобы он указывал сам на себя, и тогда мы сможем переписать его на любой другой адрес.
11. В любой момент мы можем вызвать функцию
leave_feedback, и она выведет байты с текущего указателя, так что по пути собираем mangled heap key. 12. Для раскодирования mangled адресов используем функцию моего эксплойта
crack_mangle_addr.13. Наша задача сделать так, чтобы при помощи обновления item мы могли изменять поинтер строки
feedback. Для этого дойдя до control chunk нашим указателем строки, мы переписываем его же на указатель на control chunk в сегменте самого бинаря. 14. Аллоцируем ещё один storage любого размера и 1 item размером меньше 255. Считаем его адрес, используя раскодированный heap-адрес выше и смещение от начала сегмента.
15. Аллоцированный item на шаге 14 будет chunk’ом для управления указателем feedback. Переписываем адрес control chunk feedback в бинарнике на наш контролируемый chunk (не забудьте добавить смещение — первые 2 байта items очень сложно обновить). Теперь можно обновить item с 14 шага, и он перепишет указатель на строку feedback. Мы получили AR/AW!
16. Ликаем libc через
GOT-table, считаем адрес RSP при возврате из AW-функции эксплойта и кладём ROP на стек. 17.
cat flag.txtPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥12😱4 3 2
writeup_sploit.py
671 B
#pwn #kasperskyctf2025
Kaspersky{CTF} - flag-what-where, 50 points от @tonysdx
💡 Идея:
Бинарник считывает флаг на
После этого у нас есть 3 попытки прочитать произвольные байты памяти по заданному адресу, после чего программа завершается.
👹 Уязвимость:
Функция
Поэтому часть флага можно найти в heap-памяти.
Почему только часть, а не весь флаг?
Потому что
Кроме того, бинарник собран без PIE, так что вычислить необходимые смещения не представляет труда.
💉Эксплуатация:
1. Помещаем
2. Используем команду
3. Находим участок heap, где лежит часть флага, и вычисляем смещение от начала сегмента heap.
4. Получаем leak libc через
📝 Заметки:
Сначала я думал, что придётся искать первую часть флага, которая затирается, где-то еще. Но организаторы предусмотрели это: весь флаг оказался доступен в heap.
Я просто вычел 16 из изначально вычисленного смещения и получил полный флаг.
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Kaspersky{CTF} - flag-what-where, 50 points от @tonysdx
Бинарник считывает флаг на
stack через функцию fgets, а затем затирает его с помощью memset. После этого у нас есть 3 попытки прочитать произвольные байты памяти по заданному адресу, после чего программа завершается.
👹 Уязвимость:
Функция
fgets, как и многие другие функции из glibc, при чтении строки из stdin использует буферы на heap. Поэтому часть флага можно найти в heap-памяти.
Почему только часть, а не весь флаг?
Потому что
fgets освобождает буфер после завершения работы, и первые N байт затираются служебными данными. Кроме того, бинарник собран без PIE, так что вычислить необходимые смещения не представляет труда.
💉Эксплуатация:
1. Помещаем
cyclic(128) в файл flag.txt, патчим бинарник на использование тех же библиотек, что и в docker-контейнере, и запускаем в gdb. 2. Используем команду
search -t bytes "aaaa". 3. Находим участок heap, где лежит часть флага, и вычисляем смещение от начала сегмента heap.
4. Получаем leak libc через
GOT-table, leak heap из main_arena, и читаем данные по рассчитанному на шаге 3 смещению. Сначала я думал, что придётся искать первую часть флага, которая затирается, где-то еще. Но организаторы предусмотрели это: весь флаг оказался доступен в heap.
Я просто вычел 16 из изначально вычисленного смещения и получил полный флаг.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11 2🔥1
writeup_sploit.py
771 B
#pwn #kasperskyctf2025
Kaspersky{CTF} - Translator, 50 points от @tonysdx
💡 Идея задачи:
Бинарник читает 16 байт из
При этом у нас есть всего 10 попыток для ввода правильного ответа.
👹 Уязвимость:
1. В функции
2. Бинарник никогда не закрывает файловые дескрипторы, поэтому их можно открывать сколько угодно.
3. В функции
💉 Эксплуатация:
1. Сначала открываем 255 файловых дескрипторов, используя первые две уязвимости.
2. Когда бинарник откроет 256-й дескриптор, downcast превратит его индекс в
3. Теперь бинарник будет вычислять
4. Достаточно передать константную строку (например,
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Kaspersky{CTF} - Translator, 50 points от @tonysdx
Бинарник читает 16 байт из
/dev/random, вычисляет их хэш с помощью SHA512, затем XOR'ит байты флага с этим хэшем, выводит результат и предлагает угадать флаг. При этом у нас есть всего 10 попыток для ввода правильного ответа.
👹 Уязвимость:
1. В функции
main есть off-by-one уязвимость в scanf, что позволяет перезаписать счётчик попыток нулевым байтом и тем самым получить неограниченное количество попыток. 2. Бинарник никогда не закрывает файловые дескрипторы, поэтому их можно открывать сколько угодно.
3. В функции
read_file индекс файлового дескриптора приводится к типу int8. 💉 Эксплуатация:
1. Сначала открываем 255 файловых дескрипторов, используя первые две уязвимости.
2. Когда бинарник откроет 256-й дескриптор, downcast превратит его индекс в
0, и чтение произойдёт не из /dev/random, а из stdin. 3. Теперь бинарник будет вычислять
SHA512 не от случайных байтов, а от нашего ввода. 4. Достаточно передать константную строку (например,
b"A" * 16), вычислить её SHA512-хэш (или просто вынуть его из отладчика), а затем сделать XOR байтов вывода программы и байтов известного хэша — и мы получаем флаг.Please open Telegram to view this post
VIEW IN TELEGRAM
public-rock-n-rollback.tar.gz
953.6 KB
#pwn
rock-n-rollback 🪓
Теперь нет необходимости запоминать указатели и вызывать free!
Автор: @s41nt0l3xus
После получения шелла, помимо флага, можно забрать с сервера и intended решение в виде скрипта.
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
💬 Канал & Чат & Бот с тасками| 📺 RUTUBE | 📺 YouTube
rock-n-rollback 🪓
Теперь нет необходимости запоминать указатели и вызывать free!
45.12.114.80:32002
Автор: @s41nt0l3xus
После получения шелла, помимо флага, можно забрать с сервера и intended решение в виде скрипта.
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
Please open Telegram to view this post
VIEW IN TELEGRAM
public-undefined-pointer.tar.gz
952 KB
#pwn
undefined-pointer🧑💻
Один дед на курсах программирования всегда подчеркивал важность инициализации переменных при их объявлении. Думаю, ничего страшного не произойдет, если я сделаю это позже.
Автор: @s41nt0l3xus
После получения шелла, помимо флага, можно забрать с сервера и intended решение в виде скрипта.
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
💬 Канал & Чат & Бот с тасками| 📺 RUTUBE | 📺 YouTube
undefined-pointer🧑💻
Один дед на курсах программирования всегда подчеркивал важность инициализации переменных при их объявлении. Думаю, ничего страшного не произойдет, если я сделаю это позже.
45.12.114.80:32000
Автор: @s41nt0l3xus
После получения шелла, помимо флага, можно забрать с сервера и intended решение в виде скрипта.
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
Please open Telegram to view this post
VIEW IN TELEGRAM
Подборка райтапов с прошедшего AlfaCTF:
Задания кстати все еще доступны
https://alfactf.ru/tasks
🛡 Защита от спама
(https://t.me/writeup_ctf/784)
#Easy #Infra #Web
🎶 Звуки ностальгии
(https://t.me/writeup_ctf/783)
#Easy #Misc #OSINT
🌊 Цунами дедлайнов
(https://t.me/writeup_ctf/793)
#Easy #Web
🌈🎛 Кислотный ретровейв
(https://t.me/writeup_ctf/786)
#Easy #Web
🌴💰 Пальма с биткоинами
(https://t.me/writeup_ctf/785)
#Easy #Web #JS
👨💻🏖 Разработчик на пляже
(https://t.me/writeup_ctf/790)
#Medium #Infra #Dev #Pentest
🎵🌀 Вихрь рик-ролла
(https://t.me/writeup_ctf/789)
#Medium #Web #Logic
🐺🌊 Шакализация волны
(https://t.me/writeup_ctf/788)
#Medium #Web #OAuth #Client
📹🚁 Десант блогеров
(https://t.me/writeup_ctf/787)
#Medium #Web #Logic
🌇🛠 Фиксы в лучах заката
(https://t.me/writeup_ctf/792)
#Hard #Forensics #Linux #Infra #LPE
🥒😈 Дикий огурец
(https://t.me/writeup_ctf/791)
#Hard #Pwn #Python
🏍⚡️ Непослушный мотоциклист
(https://t.me/writeup_ctf/795)
#Hard #Coding #Reverse #Network
🧱🔙 Возвращение стены
(https://t.me/writeup_ctf/794)
#Hard #Web #Client
💬 Канал & Чат & Бот с тасками| 📺 RUTUBE | 📺 YouTube
🛡 Защита от спама
(https://t.me/writeup_ctf/784)
#Easy #Infra #Web
🎶 Звуки ностальгии
(https://t.me/writeup_ctf/783)
#Easy #Misc #OSINT
🌊 Цунами дедлайнов
(https://t.me/writeup_ctf/793)
#Easy #Web
🌈🎛 Кислотный ретровейв
(https://t.me/writeup_ctf/786)
#Easy #Web
🌴💰 Пальма с биткоинами
(https://t.me/writeup_ctf/785)
#Easy #Web #JS
👨💻🏖 Разработчик на пляже
(https://t.me/writeup_ctf/790)
#Medium #Infra #Dev #Pentest
🎵🌀 Вихрь рик-ролла
(https://t.me/writeup_ctf/789)
#Medium #Web #Logic
🐺🌊 Шакализация волны
(https://t.me/writeup_ctf/788)
#Medium #Web #OAuth #Client
📹🚁 Десант блогеров
(https://t.me/writeup_ctf/787)
#Medium #Web #Logic
🌇🛠 Фиксы в лучах заката
(https://t.me/writeup_ctf/792)
#Hard #Forensics #Linux #Infra #LPE
🥒😈 Дикий огурец
(https://t.me/writeup_ctf/791)
#Hard #Pwn #Python
🏍⚡️ Непослушный мотоциклист
(https://t.me/writeup_ctf/795)
#Hard #Coding #Reverse #Network
🧱🔙 Возвращение стены
(https://t.me/writeup_ctf/794)
#Hard #Web #Client
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤3 3