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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2019-25485 — Стековое переполнение буфера в R 3.4.4. Полная эксплуатация на x86, но на x64 — только контроль RIP с анализом гаджетов из-за ограничений программы. Одна и та же уязвимость в двух архитектурах, приводящая к разным путям эксплуатации. | Kitploit
Инструменты/GitHubGitHub/themalwareguardian/cve-2019-25485
Анализ уязвимостейЭксплуатацияОбратная инженерияШелл-кодОтладчикиОбучение и ОбразованиеРазработка Полезной НагрузкиЭксплуатация Бинарных Файлов
GitHub
themalwareguardian/cve-2019-25485

CVE-2019-25485

Стековое переполнение буфера в R 3.4.4. Полная эксплуатация на x86, но на x64 — только контроль RIP с анализом гаджетов из-за ограничений программы. Одна и та же уязвимость в двух архитектурах, приводящая к разным путям эксплуатации.

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

Популярное

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

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

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

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

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

🐞 CVE-2019-25485: R 3.4.4 - Переполнение буфера на основе стека (x86 и x64)

Переполнение буфера на основе стека в R 3.4.4. Полная эксплуатация на x86, но на x64 — только контроль над RIP с анализом гаджетов из-за ограничений программы. Одна и та же уязвимость на двух архитектурах приводит к разным путям эксплуатации.




📑 Оглавление

  • Почему существует этот репозиторий
  • Почему эта уязвимость интересна
  • Контекст и затронутое ПО
  • Об уязвимости
  • Вызов краха
  • Эксплуатация



🎓 Почему существует этот репозиторий

Этот репозиторий — часть материалов, которые я использую при преподавании эксплуатации повреждения памяти (помимо основной работы я также преподаю на различных курсах по кибербезопасности, где помогаю обучать следующее поколение реверс-инженеров).

CVE-2019-25485 — это случай, который я использую, когда хочу, чтобы студенты проработали одну и ту же уязвимость на двух разных архитектурах и воочию увидели, что между ними меняется. R 3.4.4 поставляется в версиях x86 и x64, и ровно одно и то же переполнение существует в обеих: то же поле GUI, тот же обработчик ввода, тот же крах. Обе версии задокументированы и эксплуатируются здесь как отдельные упражнения:

  • Версия x86 следует классической методологии перезаписи EIP. Переполнение достигает EIP, в модуле без ASLR находится гаджет JMP ESP, шеллкод размещается после перезаписи EIP, и достигается рабочий обратный шелл. Это чистый и прямой эксплойт, демонстрирующий основы переполнений буфера на основе стека.
  • Версия x64 достигает контроля над RIP и подтверждает смещение, но полного RCE добиться не удаётся. Это сделано намеренно, и в этом суть упражнения. Попытка эксплуатации на x64 полностью документирует процесс поиска гаджетов, анализирует, почему каждая категория гаджетов не работает в данном конкретном контексте, объясняет ограничение нулевых байтов, накладываемое обработчиком ввода, и описывает структуру ROP-цепочки, которая потребовалась бы для обхода DEP, а также причины, по которым её невозможно построить с учётом ограничений этого вектора ввода. Единственный оставшийся теоретический путь к полной эксплуатации этой единственной уязвимости — JOP, Jump-Oriented Programming (программирование, ориентированное на переходы), которое объединяет гаджеты, заканчивающиеся на JMP, а не на RET, и не полагается на стек для управления потоком выполнения. Ручное построение JOP-цепочки без какой-либо контролируемой записываемой области после перезаписи RIP — это продвинутая открытая задача, выходящая за рамки этого упражнения. Неудача — это не пробел в методологии. Это и есть урок.



💡 Почему эта уязвимость интересна

R 3.4.4 — это приложение для статистических вычислений, а не сетевой сервис или браузер. Переполнение срабатывает через поле графического интерфейса рабочего стола, а значит, поверхность атаки полностью отличается от всех остальных случаев, которые я преподаю. Что делает этот случай полезным для обучения:

  • Нет сетевого компонента. Полезная нагрузка вставляется в поле GUI, что вводит другой класс ограничений, в частности то, как обработчик ввода GUI обрабатывает байты до того, как они достигнут уязвимой операции копирования.
  • Контроль над RIP подтверждён. Переполнение достигает RIP, и смещение найдено. Это не тот случай, когда до уязвимости невозможно добраться. Управление счётчиком команд полностью продемонстрировано.
  • Проверка канонических адресов ломает классический подход. На x86 вы перезаписываете EIP и добавляете шеллкод. На x64 старшие байты RIP должны быть \x00\x00, чтобы адрес был каноническим, и эти нулевые байты немедленно завершают ввод сразу после адреса гаджета. После перезаписи не остаётся места для шеллкода или значений ROP-цепочки.
  • Преобразование нулевых байтов блокирует ROP. Поле GUI преобразует нулевые байты в пробелы перед копированием в буфер. Каждый x64-адрес содержит нулевые байты в старшей половине. Ни один адрес гаджета не может быть помещён в стек как значение ROP-цепочки — все они приходят повреждёнными.
  • DEP блокирует прямое выполнение. Даже если бы был найден способ добраться до буфера шеллкода, DEP включён и блокирует выполнение кода на стеке.
  • Поиск гаджетов задокументирован полностью. Процесс извлечения гаджетов из каждого загруженного модуля, фильтрации по типу и анализа причин, по которым каждый гаджет не работает, задокументирован шаг за шагом. Это ключевой навык, необходимый каждому разработчику эксплойтов.
  • Поясняется скелет ROP-цепочки для VirtualProtect. Студенты видят, что именно потребовалось бы для обхода DEP, почему соглашение о вызовах имеет значение и почему данную конкретную цепочку невозможно построить с учётом ограничений ввода.



🔍 Контекст и затронутое ПО

R — это среда для статистических вычислений и построения графиков, доступная для Windows, macOS и Linux. Уязвимость находится в диалоговом окне GUI Preferences, а именно в поле Language for menus and messages, которое копирует пользовательский ввод в буфер фиксированного размера на стеке, не проверяя его длину.

Ключевые технические детали:

  • Тип уязвимости: Переполнение буфера на основе стека
  • Затронутая версия: R 3.4.4 x86_x64
  • Затронутая точка входа: Edit -> GUI Preferences -> Language for menus and messages
  • Уязвимый компонент: обработчик ввода настроек GUI
  • Требуется аутентификация: Нет (локальное приложение)
  • Воздействие: x86 - удалённое выполнение кода | x64 - поток управления подтверждён



⚠️ Об уязвимости

R 3.4.4 обрабатывает поле Language for menus and messages, копируя переданную строку в буфер фиксированного размера на стеке без проверки длины. Упрощённая версия уязвимой логики выглядит так:

root@kitploit:~
char language_buffer[256];

strcpy(language_buffer, user_input);

Отправка достаточно длинной строки заставляет операцию копирования выйти за конец буфера, повреждая стек до тех пор, пока не будет перезаписан сохранённый обратный адрес. Когда функция возвращается, CPU загружает управляемое атакующим значение из стека в RIP и пытается выполнить переход на него.

На x64 Windows применяет проверку канонических адресов перед любым переходом. Неканоническое значение, такое как 0x4141414141414141, вызывает немедленное нарушение доступа ещё до загрузки RIP, а это значит, что крах выглядит иначе, чем на x86, — без явного значения RIP = 4141414141414141. Смещение приходится находить, читая циклический паттерн из стека после краха, а не из самого RIP.




💥 Вызов краха

Крах можно воспроизвести, вставив длинную строку в языковое поле. Аутентификация не требуется. Пример генерации полезной нагрузки с помощью Python:

root@kitploit:~
import struct

payload = b'A' * 400

with open('payload.txt', 'wb') as f:
	f.write(payload)
root@kitploit:~
Open R 3.4.4 x64
Edit -> GUI Preferences
Paste contents of payload.txt into Language for menus and messages
Click OK
Скачать инструмент



💣 Эксплуатация

Цель этого репозитория — не только продемонстрировать крах, но и провести полный процесс эксплуатации на обеих архитектурах, документируя, что работает на x86, что ломается на x64 и, что более важно, почему.

Чтобы основной README оставался чистым, подробные заметки по эксплуатации, скрипты и шаги отладчика размещены в папке Vulnerability 📂 этого репозитория и разбиты на отдельные подпапки для x86 и x64.

Там вы найдёте полный рабочий процесс для обеих архитектур:

x86 - Полная эксплуатация:

  • Фаззинг языкового поля для выявления краха.
  • Определение смещения для поиска точного положения EIP в стеке.
  • Анализ «плохих» символов для выявления байтов, повреждающих полезную нагрузку.
  • Поиск гаджета JMP ESP в stats.dll — модуле, скомпилированном без ASLR или SafeSEH.
  • Размещение и выполнение шеллкода — достигнут полноценный обратный шелл.

x64 - Контроль над RIP и анализ эксплуатации:

  • Настройка x64dbg для предотвращения постоянных прерываний из-за событий загрузки DLL.
  • Фаззинг языкового поля в три этапа для точного определения размера краха.
  • Определение смещения RIP путём чтения циклического паттерна из стека, а не из RIP.
  • Подтверждение контроля над RIP с помощью 6-байтовой перезаписи с автоматическим дополнением нулевыми байтами.
  • Выявление преобразования нулевых байтов в пробелы как фундаментального ограничения ввода.
  • Извлечение гаджетов из всех загруженных модулей R с помощью rp++ и их фильтрация с помощью PowerShell.
  • Анализ каждой категории гаджетов — CALL RBX, CALL RSP, POP RSP, SUB RSP, PUSH RSP — и документирование причин, по которым каждый из них не работает в данном конкретном контексте.
  • Объяснение структуры ROP-цепочки, необходимой для вызова VirtualProtect и обхода DEP, и причин, по которым её невозможно построить с учётом ограничения нулевых байтов.
  • Описание JOP как единственного оставшегося теоретического пути и причин, по которым это остаётся открытой задачей.