Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2015_лекции / Переполнение буфера

.pdf
Скачиваний:
89
Добавлен:
22.03.2016
Размер:
2.71 Mб
Скачать

Ошибка «Переполнение буфера»

Литература

1) Цикл статей К. Касперски: (2003-2005)

Ошибки переполнения буфера извне и изнутри как обобщенный опыт реальных атак

Переполнение буфера в стеке.

2) T. Werthmann. Survey on Buffer Overflow Attacks And Countermeasures (2006)

3) A. O. Flaglien. Buffer Overflows: Understanding the Cause, Effect and Countermeasures for Software Systems (2008)

4) K-S. Lhee, S.J. Chapi. Buffer Overflow and Format String Overflow Vulnerabilities (2002)

Буфер – это некоторое хранилище данных, предназначенное для хранения данных фиксированного, заранее определенного размера.

Переполнение буфера возникает при попытке программы записать в буфер данные, размер которых больше размера буфера.

Переполнение буфера – это то, что с неизбежностью возникает при попытке засунуть в буфер больше, чем он может переварить.

Основная причина: отсутствие механизмов контроля размеров копируемых данных в буфер

Цель атаки переполнения буфера:

чтение секретных переменных

модифицирование секретных переменных

передача управления на секретную функцию программы

передача управления на код, передаваемый жертве самим злоумышленником

Последствия переполнения буфера

меняется логика выполнения программных инструкций

программа аварийно завершается, «зависает», вылетает

ничего не происходит

Виды буфера (в зависимости от местоположения)

локальные буфера, расположенные в стеке и часто называемые автоматическими переменными;

статичные буфера, расположенные в секции (сегменте) данных;

динамические буфера, расположенные в куче.

Типы переполнения буфера (время обнаружения

и используемый механизм)

1 поколение - переполнение стека

2 поколение - переполнение кучи, указателей на функции

3 поколениеиспользование механизмов форматирования строк, уязвимости в управлении кучей.

Архитектура Intel IA-32

Важные регистры (32-разрядные регистры)

EIP(IP)- регистр, который хранит адрес команды, которая должна быть выполнена в следующий раз

ESP(SP) –указатель вершины стека, указывает адреса данных, которые должны быть вынуты из стека

EBP(BP)- указатель на базу, облегчает доступ к данным в стеке

Регистры общего назначения EAX, EBX, ECX, EDX

Наиболее важные операции

PUSH,POP,CALL,RET

Операции POP и PUSH

CALL:

1) EAX :=EIP (eax – некий следующий регистр)

2) EIP:=<новый адрес>

RET

1) POP %EIP

2)EIP:=EAX

esp

1) push %eip %eipадресвозврата

eip:=новый адрес

RET pop %eip eip:=eax

адрес

возврата

следующая инструкция после возврат

eip:=<новый адрес >

2) eip:=адрес возврата

esp

1) pop ESP

Пример: (Стандарт для любой С программы )

void main(){

int t; // локальная переменная

}

push %ebp

 

move %esp, %ebp

чтобы бродить по стеку-

sub $0x04,%esp

резервирование памяти под

 

переменную t

mov %ebp, %esp

 

pop %ebp

 

ret

 

Соседние файлы в папке 2015_лекции