TGViewer
Райтапы по CTF{2026} Райтапы по CTF{2026} @writeup_ctf · 4.53K subscribers
Post #770 1.54K
little_sploit.py4.4 KB
#pwn #kasperskyctf2025
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.txt

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
  • 🔥 12
  • 😱 5
More from @writeup_ctf
  1. Oct 1, 2026🎃 ИБЭЛЛУИН – костюмированная вечеринка от по ибэ 🦇 Суббота, 31 октября, 20:00 Мы преврат…
  2. Sep 29, 2026Айтишник так хотел сдать ИБ-тест, что настроил удалённый доступ к ноутбуку с 18 тысячами с…
  3. Sep 25, 2026Друзья! Ищу инфорпартнеров, которые поддержат самый жаркий CTF этой осени! Пишите @freenam…
  4. Sep 24, 2026Друзья, уже второй раз еду на «НеоКВЕСТ» проводить мастер-класс по локпику. И вас приглаша…
  5. Sep 21, 2026Регистрация на SolarCTF открыта ☀️ Первые студенческие соревнования по кибербезопасности о…
  6. Sep 10, 2026Следующая остановка — VolgaCTF 🚘 Standoff 365 уже на низком старте: с 16 по 18 сентября б…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →