Читаем Защита от хакеров корпоративных сетей полностью

int main()

{

// test.c

printf(“start: %10i end\n”,10);

}

В предыдущем примере форматирующая строка содержит спецификацию преобразования %10i — спецификацию вывода десятичного числа со знаком с заданной шириной поля, равной 10. Ширина поля указывает функции printf() использовать для вывода целого числа со знаком поле в отформатированной строке, достаточное для печати не менее 10 символов.

[dma@victim server]$ ./test start: 10 end

Для десятичного представления числа 10 не требуется десяти символов, поэтому по умолчанию оставшаяся часть поля заполняется пробелами. Этим свойством функции printf() может воспользоваться злоумышленник для увеличения значения величины, записываемой в указанную область памяти при помощи спецификации преобразования %n без фактического увеличения размера отформатированной строки. Хотя при использовании в спецификации преобразования ширины поля можно записать в память достаточно большое число, тем не менее злоумышленнику для записи могут потребоваться еще большие числа.

Применив способ многократной записи с несколькими спецификациями преобразования %n, злоумышленник может использовать младшие значащие разряды получающихся по спецификации %n целых величин для раздельной записи каждого байта нужного ему числа. Этот прием позволяет получить нужные адреса памяти при относительно небольшом количестве спецификаций преобразования %n. Для реализации способа следует указать для каждой операции записи адрес, куда записывать, причем каждый последующий адрес смещается относительно первого на 1 байт.

Используя четыре спецификации преобразования %n и четыре адреса памяти, младшие биты записываемых целых чисел побайтно формируют нужные слова.

На некоторых платформах, например платформах с архитектурой RISK (архитектура RISK (Reduced Instruction Set Computer) – архитектура с сокращенным набором команд. Тип архитектуры микропроцессора, ориентированный на быстрое и эффективное выполнение относительно небольшого набора встроенных команд), запрещено при записи использовать адрес, не выровненный на границу двух байт. Во многих случаях это ограничение удается снять, используя запись коротких целых чисел при помощи спецификации преобразования %hn.

Рис. 9.1. Получение адреса с помощью четырех операций записи

Перейти на страницу:

Похожие книги