x86Assembler#9: ФУНКЦИЯ - ПЕРЕПОЛНЕНИЕ БУФЕРА

YOUTUBE · 25.11.2025 07:08

Ключевые темы и таймкоды

Введение в переполнение буфера

0:00
  • Видео посвящено изучению переполнения буфера, одной из самых распространенных уязвимостей в программировании.
  • Переполнение буфера происходит, когда программа превышает объем зарезервированной памяти путем записи в смежный блок памяти.

Примеры переполнения буфера

4:38
  • Переполнение буфера может быть двух типов: переполнение стека и переполнение буфера кучи.
  • Примеры переполнения буфера на примере тестовой программы на языке C++.

Анализ кода и решение проблемы

8:22
  • Анализ кода функции на языке C++ и определение места потенциального переполнения буфера.
  • Создание проекта в асм студии и анализ кода функции на языке асм.
  • Решение проблемы переполнения буфера и предотвращение возможных уязвимостей в программе.

Обзор главного файла

15:48
  • В главном файле присутствует только одна главная функция, которая возвращает нулевое значение и передает его функции exit для завершения процесса.
  • Функция содержит макрос printf, который выводит строку на экран консоли.

Подключение файла

18:33
  • Файл содержит описание, что он является подключаемым файлом mass32 runtime library.
  • Файл содержит заголовок файла, описание всех структур данных, статические библиотеки и макросы.

Функция эксплойт

25:32
  • Функция эксплойт имеет две локальные переменные и должна иметь размер 12 байт для буфера и 4 байта для переменной.
  • Функция должна сохранять и восстанавливать значения регистров, а также выводить пояснительную строку на экран консоли.

Расположение переменных в стеке

30:36
  • Первая переменная имеет размер 4 байта и находится по смещению от регистра esp минус 4.
  • Вторая переменная имеет размер 12 байт и начинается с адреса esp минус 16.
  • Макрос printf выводит начальные адреса переменных на экран консоли.

Анализ кода

33:16
  • В коде используется сохранение регистров функции для хранения данных, которые используются многократно.
  • Функция get str используется для ввода строки с клавиатуры пользователем, а затем проверяет значение переменной.

Динамический анализ кода

39:45
  • Анализ стека показывает выделение памяти, сохранение регистров и локальных переменных.
  • Функция get str ожидает ввода строки пользователем, а затем проверяет значение переменной.

Уязвимость в использовании функции get str

43:34
  • Функция не контролирует размер вводимой строки, что может привести к переполнению буфера.
  • Переполнение буфера может быть использовано для получения необходимых данных в переменной.

Разгадка кода

46:25
  • В коде используются символы "м", "с", "а", "м".
  • Значения символов сохраняются в памяти компьютера в обратном порядке.
  • Для решения задачи необходимо ввести дополнительные четыре символа в конце строки, чтобы они перекрыли переменную выигрышного числа.

Переполнение буфера

50:09
  • В видео объясняется, как эксплойт может использовать уязвимость в программе для изменения поведения программы и вывода поздравительного сообщения.
  • Упоминается, что переполнение буфера может привести к изменению значений локальных переменных и нарушению фрейма стека функции.

Практические примеры

1:01:19
  • Автор предлагает практиковаться в определении размера локальных переменных, чтобы избежать переполнения буфера.
  • В качестве примера, автор предлагает вывести на экран консоли имя компьютера и имя пользователя, используя функции из модуля Windows.
  • В видео также демонстрируется, как правильно определять размер буфера для хранения имени компьютера.

Создание локальной переменной и вызов функции

1:10:42
  • Объявляется локальная переменная для хранения размера буфера и буфера для имени компьютера.
  • Размер буфера выбирается достаточным для вмещения имени компьютера и имени пользователя.

Вызов функции и передача параметров

1:11:37
  • Функция получает адрес буфера и размер буфера в качестве параметров.
  • Функция возвращает имя компьютера в регистре иси.

Получение имени пользователя и проверка кода

1:15:14
  • Функция получает имя пользователя и сохраняет его в переменной.
  • Проверка кода на ошибки и изменение размера буфера при необходимости.

Динамический анализ кода

1:20:38
  • Загрузка программы и установка брейка.
  • Анализ работы функций и переменных, проверка корректности кода.

Анализ уязвимости

1:27:40
  • В видео обсуждается анализ уязвимости в программе, где функция получает строку и сравнивает ее с другими значениями.
  • Уязвимость возникает из-за переполнения буфера и использования функции для ввода строки.

Статический анализ

1:33:08
  • Используется инструмент IDA для анализа кода программы и определения размера буфера и переменных.
  • Анализ показывает, что функция имеет размер буфера 80 байт и использует байтовый массив для хранения данных.

Эксплойт

1:43:55
  • Создается скрипт на Python для внедрения кода в программу и выполнения эксплойта.
  • В результате выполнения скрипта программа выводит сообщение о выигрыше.
  • Анализ и статический анализ уязвимости помогают определить расположение переменных в стеке и размер буфера.

Использование Гидры и Радара

1:47:21
  • В видео рассказывается о том, как использовать Гидру и Радар для анализа и декомпиляции программ.
  • Гидра позволяет импортировать исследуемую программу и анализировать ее функции, а Радар предоставляет информацию о библиотеках и функциях, используемых в программе.

Анализ кода с помощью Радара

1:59:03
  • Радар позволяет анализировать функции программы, используя команды в консольном режиме.
  • В видео демонстрируется, как использовать команду "пдф" для анализа функции и переименования ее.

Заключение и домашнее задание

2:04:20
  • В заключение автор упоминает о том, что Радар имеет визуальные режимы для анализа кода, которые будут рассмотрены в следующих уроках.
  • В качестве домашнего задания предлагается решить переполнение стека версии 3 и 4 самостоятельно, используя скрипты на Python.