Как подойти к задачам на heap exploitation в CTF если опыт только со stack buffer overflow
Рейтинг: 43.9% · 3 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
Как подойти к задачам на heap exploitation в CTF если опыт только со stack buffer overflow
Несколько месяцев занимаюсь pwn-задачами в CTF, освоил классику на стеке: ret2win, ROP-цепочки, ret2libc с утечкой адреса. Теперь пробую задачи на heap — и полный ступор. Смотрю на задачу с malloc/free, открываю Ghidra, вижу структуры chunk'ов, но не понимаю как это превращается в эксплойт. Где правильно начинать: читать исходники glibc ptmalloc2, решать готовые варпы на how2heap, или есть более структурированный путь? Конкретно застрял на задаче с UAF (use-after-free) — понимаю концепцию, но не понимаю как её превратить в запись в произвольный адрес.
✔ Лучший ответ сформирован автоматически — asynclover
@merengue, UAF в запись в произвольный адрес конкретно: free(ptr) -> ptr всё ещё указывает на chunk -> пишешь в ptr->field нужный адрес (это fd в tcache) -> malloc(same_size) -> ещё раз malloc(same_size) -> второй вызов вернёт адрес который ты записал -> теперь у тебя указатель на произвольную память, пиши что хочешь. Классически пишут в `__free_hook` или `__malloc_hook` (в старых glibc до 2.34…
Re: Как подойти к задачам на heap exploitation в CTF если опыт только со stack buffer overflow
how2heap от shellphish — это буквально обязательная программа, там каждая техника с минимальным кодом и комментариями. Начни с fastbin_dup и tcache_poisoning, они проще всего для понимания. Суть tcache_poisoning: в tcache chunk'ы хранятся в односвязном списке через поле fd в user data. Если есть UAF, пишешь в fd нужный адрес, следующий malloc вернёт этот адрес как «чанк». Дальше пишешь что хотел. Защита в glibc 2.32+ — safe-linking (XOR fd с адресом), но это обходится если есть хотя бы один heap leak.
Re: Как подойти к задачам на heap exploitation в CTF если опыт только со stack buffer overflow
Для понимания структуры heap советую запустить pwndbg (это расширение для GDB) и пользоваться командами `heap`, `bins`, `vis_heap_chunks`. Видишь всё визуально: какие чанки allocated, какие free, в каком tcache/fastbin/unsorted bin они сидят. Без визуализации heap-эксплойты — это угадывание в темноте. `heap` — показывает все чанки. `bins` — содержимое всех списков. `telescope 0xaddress` — дампит память как указатели. Потратил неделю на изучение pwndbg и после этого heap-задачи стали решаться в разы быстрее.
- archenjoyer
- Сообщения: 8
- Зарегистрирован: 10 май 2026, 23:59
Re: Как подойти к задачам на heap exploitation в CTF если опыт только со stack buffer overflow
@merengue, По последовательности: сначала house of force (старая техника, glibc < 2.29, но даёт понимание как wilderness chunk работает), потом tcache_poisoning для новых версий, потом unsorted bin attack, потом дойдёте до более сложных house of XXX. На pwn.college есть модуль heap exploitation — очень структурированно, с нарастающей сложностью. Плюс автор объясняет не просто «делай вот так», а почему это работает на уровне кода ptmalloc2.
- asynclover
- Сообщения: 70
- Зарегистрирован: 13 май 2026, 04:35
Re: Как подойти к задачам на heap exploitation в CTF если опыт только со stack buffer overflow
✔ Лучший ответ — сформирован автоматически
@merengue, UAF в запись в произвольный адрес конкретно: free(ptr) -> ptr всё ещё указывает на chunk -> пишешь в ptr->field нужный адрес (это fd в tcache) -> malloc(same_size) -> ещё раз malloc(same_size) -> второй вызов вернёт адрес который ты записал -> теперь у тебя указатель на произвольную память, пиши что хочешь. Классически пишут в `__free_hook` или `__malloc_hook` (в старых glibc до 2.34 — они просто существуют и вызываются), в новых версиях хуки убрали, теперь цель обычно `__libc_system` через GOT или exit handlers.
Re: Как подойти к задачам на heap exploitation в CTF если опыт только со stack buffer overflow
Добавлю про safe-linking обход: если есть heap leak хотя бы одного адреса, вычисляешь ключ XOR как `key = leaked_heap_addr >> 12`, и перед записью в fd делаешь `fd_value = target_addr ^ key`. Это в glibc 2.32+. На практике heap leak часто даётся через printf на неинициализированный указатель или через чтение из освобождённого unsorted bin chunk, в котором остаётся адрес main_arena (это уже libc leak). Так что обычно цепочка: unsorted bin leak -> libc base -> safe-link key -> tcache poison -> произвольная запись.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- buffer overflow эксплойт не работает ASLR и NX как обойти для учебного CTF
8 ответов · 73 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость