Презентация работы Хамлова П.
Выполнена на Кафедре Защиты Информации Факультета Информационных Систем и Технологий СыктГУ.
http://www.kzissu.ru/paper/doklady/546
2. ТЕОРИТИЧЕСКАЯ ОСНОВА
ПЕРЕПОЛНЕНИЙ БУФЕРА
Переполнение буфера основано на
конечной длине входных буферов и и
организации стека.
Используются не безопасные функции
libc(memcpy, memmove, strcpy, strcat,
sprintf).
Программисты забывают контролировать
размеры входных буферов при работе с
памятью.
3. ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
Атака на счетчик цикла:
f(char *dst, char *src)
{
char buf[xxx]; int a; int b;
b = strlen(src);
for (a = 0; a > b; a++) *dst++ = *src++;
}
4. ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
Атака на переменную флаг
f(char *psswd)
{
char buf[MAX_BUF_SIZE]; int auth_flag =
PASSWORD_NEEDED;
printf("скажи пароль:"); gets(buf);
if (auth_flag != PASSWORD_NEEDED) return
PASSWORD_OK;
return strcmp(passwd, buf);
}
8. ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
Атака на индексы
f()
{
int *p; char buf[MAX_BUF_SIZE]; int a; int b;
gets(buf);
p[b] = a;
}
9. ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
Целочисленное переполнение
DWORD sum(DWORD a, DWORD b)
{
return a + b;
}
10. САМЫЕ ОПАСНЫЕ
ПЕРЕПОЛНЕНИЯ БУФЕРА
Самые опасные – перезаписывающие
переполнения. Позволяют записывать,
читать память по произвольным адресам и
выполнять байткод. Удаленные уязвимости
эксплуатируются через подобного рода
переполнения буфера. Например
переполнение при использовании
форматирования функции printf.
17. Как защититься?
Использовать компиляторы с
SSP(PeX).
Развивать свои навыки
программирования и не
допускать подобных ошибок.
Ждать спасения от NX и DEP.
Перейти на архитектуру с
неисполняемым стеком.