Лекция: Искажение указателей данных

Данный способ не предусматривает явной передачи управления подготовленному коду, но предполагает, что передача происходит на основании оригинального алгоритма программы. Другими словами, подготовленный код запускается в ходе обычной, неискаженной последовательности исполнения программы.

Рассмотрим следующий фрагмент программы на языке С++.

 

foo(char * arg)

{

char * p = arg; // уязвимый указатель

char a[40]; // переполняемый буфер

gets(a);

gets(p); // искажение кода

}

 

В данном примере переполнение буфера a вызывает подмену указателя p и последующую запись строки по адресу искаженного указателя. Вводимая строка содержит код атакующего. Такая схема атаки часто используется для корректировки части кода программы или кода динамических и статических библиотек, располагающихся в памяти по фиксированным адресам. Например, корректировка-подмена системных функций выхода из программы или запуска процесса.

Другой пример атаки подобного рода – искажение указателя кадра стека локальных переменных (frame pointer overwrite attack). Эта атака основана на стандартных операциях пролога и эпилога подпрограмм, в результате чего подменяется указатель базы кадра локальных переменных.

Комбинация всех методов подготовки кода и целей переполнения буфера (типа искажаемых структур) определяет виды всех возможных атак по переполнению буфера, что позволяет их классифицировать (табл. 1.1).

 

Таблица 1.1

еще рефераты
Еще работы по информатике