close

Вход

Забыли?

вход по аккаунту

?

Overflow

код для вставкиСкачать
Лабораторная работа №3
Исследование уязвимости переполнения буфера
Цель работы
Получить представление о возникновении и механизме эксплуатации уязвимости переполнения буфера
Теоретические сведения
Ошибка переполнения буфера состоит в том, что некоторый буфер в программе имеет фиксированную длину, и программа не проверяет количество байт, которые в него копируются. При этом правильно подобранные записываемые в буфер данные могут дать нарушителю дополнительные полномочия. Буфер - это непрерывный блок памяти, используемый для хранения набора элементов, относящихся к одному типу данных. При программировании на языке Си под буфером обычно понимается массив данных (чаще всего массив символов). Переполнение буфера - это просто помещение в область памяти, отведенную под буфер, данных большей длины, чем этот буфер может содержать, при отсутствии проверки выхода за границы буфера. Большинство компиляторов языка Си такие проверки не осуществляет, поэтому все нижесказанное следует воспринимать в контексте именно этого языка.
Для того чтобы понять суть уязвимости переполнения буфера, рассмотрим фрагмент программы:
void func (char *str)
{
char buffer[256];
strcpy(buffer, str);
return;
}
void main(int argc, char * argv[])
{
...
char *BigString;
...
func(BigString);
return;
}
Подобные фрагменты программ, в которых функция принимает строку как один из нескольких аргументов, имеет локальный буфер ограниченного размера и использует вызовы типа strcpy() или sprintf(), можно встретить в большом количестве программ.
Параметры функции func передаются через стек - туда заносятся указатели на параметры или сами параметры, а вызванная функция извлекает их оттуда. После того, как параметры занесены в стек, а процессор встречает инструкцию вызова функции, он заносит в стек некоторую информацию о текущем состоянии - как правило, это смещение следующей после команды вызова. Таким образом, функция, завершив свою работу, будет знать адрес возврата управления. Функции надо запомнить указатель на текущую верхушку стека (BP), который будет использоваться в ссылке на параметры. Поэтому, независимо от архитектуры, выполняются следующие две инструкции:
push bp
mov bp,sp
Теперь в верхушке стека лежит предыдущее значение регистра BP, а сам он указывает на верхушку стека и может быть использован в качестве базового регистра при ссылке на параметры. В программе был объявлен размер буфера в 256 байт. Поскольку не использовались функции malloc() или new для выделения требуемого объема памяти и не указывался модификатор static, этот буфер будет зарезервирован в стеке. Таким образом, строка длиной более 256 байт, передаваемая в функцию func, затрет адрес возврата из функции и изменит нормальное выполнение программы. При отсутствии проверки выхода за границы буфера искажается содержимое других переменных состояния и параметров программы, которые входят в область переполнения буфера. Типы искажаемых объектов-переменных определяют способ передачи управления коду атакующего. Можно выделить три основные группы объектов, являющихся целью атаки на переполнение буфера:
* Адрес возврата из функции. Изменяется таким образом, чтобы при возврате из функции управление было передано на код нарушителя.
* Указатель на функцию. Изменяется таким образом, чтобы при вызове функции управление было передано на код нарушителя.
* Указатель на данные. Результатом изменения значения указателя может быть как подстановка данных нарушителя вместо оригинальных данных в ходе нормального исполнения атакуемой программы, так и передача управления на код нарушителя (с помощью модификации некоторых управляющих структур).
Также возможно эксплуатирование с целью нарушения безопасности ошибки переполнения буфера, расположенного в куче, в области данных (чаще всего с целью перезаписи данных данными нарушителя, а не с целью выполнения произвольного кода), а также родственных ошибок - ошибок индексации массива, ошибок форматирования строк и пр.
Постановка задачи
В рамках работы необходимо написать программу-эксплойт (exploit) для любой уязвимой с точки зрения переполнения буфера программы. Наиболее простым и распространенным случаем существования уязвимости является наличие переполняемого буфера в стеке. Допускается самостоятельное написание простой программы для демонстрации и эксплуатации уязвимости переполнения буфера. Эксплойт должен демонстрировать возможность передачи управления на произвольный код, переданный нарушителем в качестве данных (shellcode). Алгоритм выполнения работы
1. Найти или написать программу, уязвимую с точки зрения переполнения буфера. 2. Описать, в какой именно функции содержится ошибка, приведшая к возникновению уязвимости, и каков алгоритм эксплуатации этой уязвимости. 3. Исследовать программу с точки зрения нарушителя (путем подачи различных аргументов на вход по реакции программы. 4. Написать программу-exploit, выполняющую формирование входных данных для уязвимой программы (с подбором длины буфера) таким образом, чтобы передать управление на произвольный код (для этого необходимо сформировать этот shellcode для подачи на вход уязвимой программы с тем, чтобы затем передать управление на этот shellcode). 5. Подробно описать в отчете процесс поиска и эксплуатации уязвимости, используемые для этого методы и инструменты (включая формирование shellcode). Примечание 1: операционная система, для которой выполняется работа, выбирается на собственное усмотрение Примечание 2: найденные в Интернете или в других источниках известные уязвимости и соответствующие эксплойты в качестве выполненной работы не засчитываются
Документ
Категория
Рефераты
Просмотров
50
Размер файла
36 Кб
Теги
overflow
1/--страниц
Пожаловаться на содержимое документа