
2015_лекции / Переполнение буфера
.pdf
Ошибка «Переполнение буфера»

Литература
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 |
|