Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
windows-x86-shellcode-poc — Windows x86 PoC: стековое переполнение буфера с пользовательским шеллкодом на устаревшей 32-битной Windows. | Kitploit
Инструменты/GitHubGitHub/nataliadiak/windows-x86-shellcode-poc
Анализ уязвимостейОбратная инженерияШелл-кодОбучение и ОбразованиеРазработка Полезной НагрузкиЭксплуатация Бинарных Файлов
GitHubnataliadiak/windows-x86-shellcode-poc

windows-x86-shellcode-poc

Windows x86 PoC: стековое переполнение буфера с пользовательским шеллкодом на устаревшей 32-битной Windows.

Репозиторий
82134 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Windows x86 Buffer Overflow PoC для начинающих

Это простой, самодостаточный учебник по эксплойтам переполнения буфера на стеке для 32-битных Windows. Внешние руководства не требуются — всё необходимое находится здесь.

Что содержит этот репозиторий?

  • vulnerable.c: Простая программа с небезопасной функцией gets().
  • messageBox.asm: Небольшая ассемблерная полезная нагрузка, которая выполняется после переполнения.
  • exploit.c: Пример того, как может быть вызвано переполнение.

Этот проект учит одной основной идее: небезопасное чтение ввода может позволить злоумышленнику перезаписать адрес возврата и перенаправить выполнение.

Уязвимость: gets() не имеет ограничения по размеру

В vulnerable.c программа делает следующее:

char buffer[32];
gets(buffer);

Программа резервирует 32 байта для buffer, а затем вызывает gets() для чтения ввода. Проблема: gets() не проверяет размер буфера. Он продолжает читать символы, пока не встретит символ новой строки. Если пользователь вводит 40 или 50 символов, лишние символы переполняют 32-байтовый буфер.

Как память размещается на стеке

Когда выполняется функция на C, стек (область памяти) хранит:

  1. Локальные переменные (например, buffer)
  2. Сохранённый EBP (базовый указатель вызывающей функции)
  3. Сохранённый адрес возврата (куда процессор должен перейти при возврате из функции)

Выглядит это так:

Lower addresses (top of stack as drawn)
[  buffer (32 bytes)  ]
[    saved EBP (4 bytes)     ]
[  return address (4 bytes)  ]
Higher addresses (bottom)

Когда gets() переполняет buffer слишком большим вводом, лишние байты перезаписывают сохранённый EBP, а затем и адрес возврата.

Если аккуратно сформировать переполнение так, чтобы в поле адреса возврата оказался конкретный адрес, процессор перейдёт по этому адресу, когда функция попытается вернуться.

Как работает эксплойт: пошагово

  1. Программа запускается и выделяет buffer[32] на стеке.
  2. Она вызывает gets(buffer) для чтения строки пользовательского ввода.
  3. Мы отправляем строку длиннее 32 байт (скажем, 50 байт).
  4. gets() не проверяет размер, поэтому записывает все 50 байт в буфер.
  5. Лишние 18 байт переполняют buffer и перезаписывают сохранённый EBP и адрес возврата.
  6. Мы тщательно конструируем переполнение так, чтобы адрес возврата указывал на шелл-код на стеке.
  7. Когда функция возвращается, процессор читает перезаписанный адрес возврата.
  8. Процессор переходит к шелл-коду.
  9. Шелл-код выполняется с правами программы.

Это простейшая форма выполнения кода через переполнение буфера.

Что происходит в шелл-коде: полезная нагрузка

messageBox.asm — это небольшой фрагмент кода, предназначенный для выполнения после переполнения.

Он делает следующее:

  1. Загружает USER32.DLL: Вызывает LoadLibraryA со строкой "USER32.DLL", чтобы гарантировать, что библиотека находится в памяти.
  2. Подготавливает аргументы для MessageBoxA: Помещает четыре аргумента в стек (дескриптор окна, текст сообщения, заголовок, тип кнопки).
  3. Вызывает MessageBoxA: Вызывает функцию Windows API для отображения окна сообщения с текстом "CAN I HACK THE PC?".
  4. Корректно завершает работу: Вызывает ExitProcess для безопасного завершения программы.

Ключевой момент: это исполняемый код, который запускается после того, как переполнение перенаправляет выполнение на него. Когда на экране появляется окно сообщения, это доказывает три вещи:

  1. Переполнение буфера сработало и перезаписало адрес возврата.
  2. Выполнение перешло на шелл-код на стеке.
  3. Шелл-код успешно выполнился и вызвал API Windows.

В реальной атаке эта полезная нагрузка могла бы делать что угодно: красть данные, создавать пользователя, загружать вредоносное ПО и т.д. Окно сообщения — это просто видимый, безопасный способ показать, что произошло выполнение произвольного кода.

Эта конкретная полезная нагрузка использует жёстко заданные адреса памяти для MessageBoxA (0x751D8830) и ExitProcess (0x7437ADB0). Эти адреса специфичны для одной системы. Полезная нагрузка потребует корректировки для другой версии Windows или системы.

MessageBoxA

Как собрать и запустить демо

Шаг 1: Отключить защиту

Современные Windows имеют несколько функций безопасности, которые предотвращают этот эксплойт:

  • Стековые канарейки (флаг GS): обнаруживают перезапись стека.
  • ASLR (DYNAMICBASE): рандомизирует адреса памяти, поэтому жёстко заданные адреса не работают.
  • DEP/NX (NXCOMPAT): помечает стек как неисполняемый, чтобы предотвратить выполнение кода там.

Для этого учебного примера мы отключаем их все.

Шаг 2: Скомпилировать на Windows

Используйте MSVC (Microsoft Visual C++) со специальными флагами:

cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe

Значения флагов:

  • /GS- отключает защиту от переполнения буфера стека.
  • /DYNAMICBASE:NO отключает Address Space Layout Randomization (ASLR).
  • /NXCOMPAT:NO отключает DEP, позволяя выполнять код на стеке.

Если исполняемый файл уже существует, можно отключить защиту с помощью editbin:

editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe

Шаг 3: Запустить

  1. Запустите vulnerable.exe.
  2. Когда будет предложено, введите длинную строку (более 32 символов).
  3. Если переполнение сработает, сохранённый адрес возврата будет перезаписан.
  4. Программа может аварийно завершиться, перейти в случайную память или (в реальном эксплойте с правильным шелл-кодом) выполнить полезную нагрузку.

Почему этот README полон

В этом README объясняется:

  1. Что такое gets() и почему он небезопасен (нет ограничения по размеру).
  2. Как стек хранит локальные переменные, сохранённые регистры и адреса возврата.
  3. Как переполнение может перезаписать адрес возврата.
  4. Как процессор использует адрес возврата при возврате из функции.
  5. Как шелл-код может выполниться, если адрес возврата указывает на него.
  6. Какие существуют механизмы защиты и почему мы их отключаем.
  7. Как собрать и запустить пример.

Теперь вы понимаете весь процесс эксплойта переполнения буфера. Прочитайте файлы с кодом и сравните их с этим объяснением, чтобы закрепить понимание.

Важное замечание по безопасности

Этот пример предназначен только для обучения. Не используйте эту технику против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Несанкционированный доступ к компьютерным системам незаконен.

Скачать инструмент