Пример:
void someFn (char *arg){
char szBuf[128]
sprintf (szBuf, "Name: %s", arg);
//или strcpy (szBuf, arg);
}
void caller (char *userInput){
someFn (userInput);
}
Не проверяется размер arg и:
- Могут быть разрушены локальные переменные
- Неправильно восстановятся регистры
- Могут быть разрушены локальные переменные вызывающей функции
- Изменится адрес возврата
- Управление может быть передано в произвольное место кода
Способы защиты:
- Безопасные функции - доступны безопасные аналоги функций, начиная с Visual Studio 2007 (вместо sprintf() - sprintf_s() и т.д.). Им передается максимальная длина, иначе бросается исключение.
- Security cookies - 4 байта в стеке перед выполнением каждой операции добавляется инструкция проверки, которая выполняется для проверки типа, "а туда ли мы вернулись".
- DEP (Data Execution Prevention) - функция безопасности, которая не позволяет приложению исполнять код из области памяти, помеченной как «только для данных».
- ASLR (Address space layout randomization) - технология, применяемая в операционных системах, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур, а именно: образа исполняемого файла, подгружаемых библиотек, кучи и стека.
Комментарии