Переполнение буфера стека
Разберитесь в структуре стека и переполнении EIP/RIP, а также напишите работающий эксплойт для уязвимой программы на C.
«Переполнение буфера стека» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.
Что такое переполнение буфера
Происходит переполнение буфера, когда в буфер записывается больше данных, чем он может вместить. Избыток данных перезаписывает соседнюю область памяти, что может повредить управляющие структуры и перенаправить выполнение программы.
Схема памяти стека
Стек вызовов содержит локальные переменные (буферы), сохраненный указатель кадра (SFP) и адрес возврата (RIP/EIP) — место, с которого продолжится выполнение после возврата функции. Переполнение локального буфера может перезаписать адрес возврата.
Классическая атака переполнением стека
Если программа вызывает gets() или strcpy() без проверки длины, злоумышленник может ввести достаточно байтов, чтобы заполнить буфер и перезаписать адрес возврата адресом шеллкода или подходящего гаджета.
// Vulnerable C code:
void vuln() {
char buf[64];
gets(buf); // No bounds checking!
}Поиск смещения
Определите, сколько байтов требуется, чтобы достичь адреса возврата, используя генерацию шаблона:
# Generate a cyclic pattern:
python3 -c "from pwn import *; print(cyclic(200))" | ./vuln
# After crash, find offset:
python3 -c "from pwn import *; print(cyclic_find(0x61616166))"Защиты: стековые канарейки
Стековая канарейка — это случайное значение, размещенное между локальными переменными и сохраненным адресом возврата. Перед возвратом значение канарейки проверяется — если оно перезаписано, программа завершается. Для классической эксплуатации переполнения эту защиту необходимо обойти.
Защиты: ASLR
Рандомизация размещения адресного пространства (ASLR) изменяет базовые адреса стека, кучи и библиотек при каждом запуске. Без утечки актуального адреса угадать, куда нужно перейти, в 64-разрядных системах практически невозможно.
Защиты: NX/DEP
NX (запрет выполнения) / DEP (предотвращение выполнения данных) помечает стек как область, недоступную для выполнения. Внедрённый в буфер шелл-код нельзя выполнить напрямую. Поэтому злоумышленникам приходится использовать программирование, ориентированное на возврат (ROP).
Утечка адресов
Чтобы обойти ASLR, злоумышленникам нужна утечка информации: уязвимости строк формата, чтение данных за пределами кучи (например, Heartbleed) или доступный для чтения указатель в эксплуатируемой функции. Один утёкший адрес раскрывает смещение и позволяет вычислить другие адреса.
Создание простого эксплойта
Простое переполнение стека в 32-разрядной системе без защит:
# Python exploit skeleton (pwntools):
from pwn import *
p = process("./vuln")
offset = 76
shellcode = asm(shellcraft.sh())
payload = shellcode + b"A" * (offset - len(shellcode)) + p32(stack_addr)
p.sendline(payload)
p.interactive()Техника ret2libc
ret2libc обходит NX, выполняя возврат в функции libc (например, system()), а не в шелл-код. Злоумышленник заменяет адрес возврата адресом system и передаёт "/bin/sh" в качестве аргумента.
Инструменты для разработки эксплойтов
Основные инструменты:
- pwntools — библиотека эксплойтов для Python
- GDB + pwndbg/peda — отладчик с помощниками для разработки эксплойтов
- checksec — показывает защиты бинарного файла
- ROPgadget / ropper — поиск цепочек ROP
checksec --file=./vulnБыстрая проверка: переполнение стека
Какой механизм защиты помещает случайное значение между локальными переменными и сохранённым адресом возврата и завершает программу, если это значение перезаписано?
Итоги урока
Переполнение буфера стека перезаписывает адрес возврата, когда данные записываются за пределы буфера. К защитам относятся канарейки стека (обнаруживают перезапись), ASLR (рандомизирует адреса) и NX/DEP (делает стек недоступным для выполнения). ret2libc обходит NX. Утечки информации позволяют обойти ASLR. pwntools упрощает разработку эксплойтов.
Часто задаваемые вопросы
Урок «Переполнение буфера стека» бесплатный?
Да — полный текст урока «Переполнение буфера стека» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.
Чему я научусь в уроке «Переполнение буфера стека»?
Разберитесь в структуре стека и переполнении EIP/RIP, а также напишите работающий эксплойт для уязвимой программы на C. Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cyber Security Academy?
Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Переполнение буфера стека»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cyber Security Academy?
Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Переполнение буфера стека
- Программирование, ориентированное на возврат (ROP)
- Уязвимости форматных строк
- Эксплуатация кучи: Use-After-Free и распыление кучи