ПЕРЕПОЛНЕНИЕ БУФЕРА

  лопнуть как мыльный пузырь
ТЕОРИТИЧЕСКАЯ ОСНОВА
ПЕРЕПОЛНЕНИЙ БУФЕРА
   Переполнение буфера основано на
    конечной длине входных буферов и и
    организации стека.
   Используются не безопасные функции
    libc(memcpy, memmove, strcpy, strcat,
    sprintf).
   Программисты забывают контролировать
    размеры входных буферов при работе с
    памятью.
ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
   Атака на счетчик цикла:
   f(char *dst, char *src)
   {
   char buf[xxx]; int a; int b;
   b = strlen(src);
   for (a = 0; a > b; a++) *dst++ = *src++;
   }
ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
   Атака на переменную флаг
   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);
   }
ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
   Атака на кодовые указатели
   root() {...};
   f()
   {
   char buf[MAX_BUF_SIZE]; int (*zzz)();
   zzz = GetProcAddress(dllbase, "ffh");
   gets(buf);
   zzz();
   }
ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
   Атака типа POKE
   f()
   {
   char buf[MAX_BUF_SIZE]; int a; int *b;
   gets(buf);
   *b = a;
   }
ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
   Атака типа PEEK
   f()
   {
   char buf[MAX_BUF_SIZE]; int *b;
   gets(buf);
   printf("%xn", *b);
   }
ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
   Атака на индексы
   f()
   {
   int *p; char buf[MAX_BUF_SIZE]; int a; int b;
   gets(buf);
   p[b] = a;
   }
ТИПЫ ПЕРЕПОЛНЕНИЙ
БУФЕРА
   Целочисленное переполнение
   DWORD sum(DWORD a, DWORD b)
   {
   return a + b;
   }
САМЫЕ ОПАСНЫЕ
ПЕРЕПОЛНЕНИЯ БУФЕРА
   Самые опасные – перезаписывающие
    переполнения. Позволяют записывать,
    читать память по произвольным адресам и
    выполнять байткод. Удаленные уязвимости
    эксплуатируются через подобного рода
    переполнения буфера. Например
    переполнение при использовании
    форматирования функции printf.
КАК ЭТО РАБОТАЕТ НА
ПРАКТИКЕ?
КАК ЭТО РАБОТАЕТ НА
ПРАКТИКЕ?
КАК ЭТО РАБОТАЕТ НА
ПРАКТИКЕ?
КАК ЭТО РАБОТАЕТ НА
ПРАКТИКЕ?
КАК ЭТО РАБОТАЕТ НА
ПРАКТИКЕ?
КАК ЭТО РАБОТАЕТ НА
ПРАКТИКЕ?
Как защититься?
   Использовать компиляторы с
    SSP(PeX).
   Развивать свои навыки
    программирования и не
    допускать подобных ошибок.
   Ждать спасения от NX и DEP.
   Перейти на архитектуру с
    неисполняемым стеком.

Переполнение буфера: лопнуть как мыльный пузырь