Локализация ошибки в программе. Построение диаграммы стека уязвимой функции. Построение контрольного примера, демонстрирующего наличие уязвимости. Построение эксплоита с шелл-кодом.
Задание посвящено анализу и эксплуатации уязвимости типа «Переполнение буфера» в программе на языке Си. Персональный вариант задания включает две уязвимые программы, для каждой из которых необходимо выполнить последовательность действий, в конечном счёте приводящих к построению полноценного эксплоита с шелл-кодом.
Подготовка к выполнению задания
Выполните следующую последовательность действий для подготовки к выполнению задания.
- Скачайте и разверните образ виртуальной машины (ZIP) и запустите его в ПО Oracle VirtualBox. Если на вашем компьютере не работает VirtualBox, используйте вместо этого образ в формате QCOW2 и QEMU.
- Войдите в гостевую Linux-систему с именем пользователя student без пароля. В гостевой системе уже отключена рандомизация адресного пространства (ASLR), а также установлены все необходимые для выполнения задания программы. При необходимости вы можете установить дополнительные программы с помощью пакетного менеджера apt, а также настроить под себя окружение.
-
Изнутри виртуальной машины скачайте архив с персональным вариантом при
помощи утилиты wget и распакуйте его в каталог /home/student
(обязательно именно в этот каталог, иначе могут измениться адреса в стеке),
например:
BUFFER_SIZE
, вам неизвестны.
Архив содержит две уязвимые программы: 01 и 02, а также
их исходные коды 01.c и 02.c. Ключи, с которыми были
собраны программы, а также значение константы - Для запуска программ используйте скрипты 01.sh, 01-gdb.sh, 02.sh, 02-gdb.sh. Скрипты принимают в качестве аргумента имя файла, которое будет передано уязвимой программе. Примеры использования:
Подзадачи
Для каждого из предложенных примеров необходимо решить четыре подзадачи. Подзадачи решаются в произвольном порядке.
Подзадача 1: минимальная длина ввода для перезаписи адреса возврата
В рамках данной подзадачи необходимо установить минимальную длину входного файла, при которой перезаписывается хотя бы один байт адреса возврата уязвимой функции.
Подзадача 2: диаграмма стека уязвимой функции
В рамках данной подзадачи необходимо определить адреса следующих объектов в фрейме уязвимой функции: сохранённого адреса возврата, «канарейки» (в примере 2), перезаписываемого указателя на функцию (в примере 2) и адреса уязвимого буфера.
Подзадача 3: передача управления на другую функцию
В рамках данной подзадачи необходимо подготовить входной файл, который, при подаче
его уязимой программе, реализует переполнение буфера и изменяет поведение программы
так, чтобы управление оказалось передано на функцию success
.
Показателем успешного выполнения данной подзадачи является выдача уязвимой программой сообщения:
Подзадача 4: эксплуатация с шелл-кодом
Данная подзадача является завершающей. Необходимо подготовить входной файл, который, при подаче его уязвимой программе, реализует переполнение буфера и изменяет поведение программы так, чтобы она запустила командный интерпретатор /bin/sh.
Показателем успешного выполнения данной подзадачи является запуск командной оболочки вместо завершения работы уязвимой программы.
Рекомендуется (но не обязательно) использовать 30-байтовый шелл-код следующего содержания:
Необходимые инструменты и полезные команды
Для выполнения задания следует использовать инструменты gdb (через скрипты-обёртки), nm (для получения адресов функций), objdump (для дизассемблирования текста программы).
Для формирования входного файла можно пользоваться командами echo, tr, head, либо любым удобным языком программирования. Примеры полезных команд для формирования файла приведены далее:
Извлечение файлов изнутри виртуальной машины
Подзадачи 3 и 4 предполагают сдачу файлов, которые готовятся внутри виртуальной машины. Чтобы извлечь эти файлы, пользуйтесь возможностью создания разделяемых каталогов (shared folders) в VirtualBox.
Подзадача | Баллы | |
---|---|---|
Пример 1 | Минимальная длина ввода для перезаписи адреса возврата | 1 |
Диаграмма стека уязвимой функции | 2 | |
Передача управления на другую функцию | 3 | |
Эксплуатация с шелл-кодом | 4 | |
Пример 2 | Минимальная длина ввода для перезаписи адреса возврата | 1 |
Диаграмма стека уязвимой функции | 2 | |
Передача управления на другую функцию | 3 | |
Эксплуатация с шелл-кодом | 4 | |
Всего | 20 |