Kniga-Online.club
» » » » Коллектив авторов - Защита от хакеров корпоративных сетей

Коллектив авторов - Защита от хакеров корпоративных сетей

Читать бесплатно Коллектив авторов - Защита от хакеров корпоративных сетей. Жанр: Прочая околокомпьютерная литература издательство неизвестно, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Причина ошибок форматирующей строки состоит в том, что полученные извне данные включаются в форматирующую строку. Подобные ошибки можно рассматривать как сбой проверки входных данных. И по своей природе они не имеют ничего общего с ошибками определения размеров обрабатываемых данных. Злоумышленники используют ошибки форматирующей строки для записи нужных им данных в определенные области памяти. А при переполнении буфера атакующий лишен возможности выбора перезаписываемой области памяти. Другим источником путаницы является то, что использование функции sprintf() может привести как к переполнению буфера, так и к ошибкам форматирующей строки. Для того чтобы понять разницу между ними, нужно хорошо знать, что на самом деле делает функция sprintf(). Функция sprintf() позволяет программисту формировать строки с использованием стиля форматирования функции printf() и записывать их в буфер памяти. Переполнение буфера возникает тогда, когда размер сформированной строки оказывается больше размера предназначенного для нее буфера. Часто это происходит при использовании спецификации вывода строки %s, которая в формируемую строку вставляет строку переменной длины, завершающуюся нулевым байтом. Если переменная, соответствующая спецификации вывода строки %s, формируется из входных данных и ее размер не контролируется, то это может привести к переполнению буфера при записи в него отформатированной строки. Необходимо заметить, что возникшая из-за неправильного использования функции sprintf() ошибка форматирующей строки по своей сути ничем не отличается от других ошибок форматирующей строки, наступивших вследствие формирования строки из непроверенных входных данных программы.

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

Уязвимость форматирующей строки

Для понимания сути уязвимости форматирующей строки необходимо иметь четкие представления о работе функции printf().

Часто программистам требуется сформировать строку из нескольких переменных разного типа во время работы программы. Зачастую при разработке программы точное количество переменных, необходимых для формирования строки, и порядок их следования неизвестны. В основном для этих целей используется семейство функций printf, предоставляющее гибкие возможности создания и форматирования строк во время выполнения программы. Функции семейства printf входят в стандартную библиотеку языка C. Возможности функций семейства printf реализованы и в других языках, например Perl.

Параметрами этих функций являются форматирующая строка и переменное число параметров, которые позволяют сформировать строку. Форматирующая строка может рассматриваться как некий шаблон, описывающий структуру будущей строки и содержащий спецификации преобразования, которые сообщают функции семейства printf, где и какие данные должны располагаться и как они должны быть отформатированы. Часто спецификации преобразования называются спецификациями формата. В главе будут использоваться два этих понятия независимо друг от друга.

...

Инструментарий и ловушки

Функции семейства printf

Ниже приведен список функций семейства printf, входящих в стандартную библиотеку языка C. При неправильном использовании каждая из них может привести к ошибкам форматирующей строки.

• Функция printf() позволяет сформировать и записать отформатированную строку в стандартный поток вывода.

• Функция fprintf() позволяет сформировать и записать отформатированную строку в определяемый библиотекой libc файловый поток вывода, имя которого задается программистом.

• Функция sprintf() позволяет сформировать и записать отформатированную строку в область памяти. Неправильное использование этой функции часто приводит к переполнению буфера.

• Функция snprintf() позволяет сформировать и записать отформатированную строку заданной длины в область памяти. Является безопасной заменой функции sprintf() при защите от переполнения буфера.

В стандартную библиотеку языка C также включены функции vprintf(), vfprintf(), vsprintf() и vsnprintf(). Они выполняют те же функции, что и ранее перечисленные, но их входным параметром может быть структура varargs, описывающая переменное число аргументов.

Работа функции printf демонстрируется следующим примером:

int main()

{

int integer = 10;

printf(“this is the skeleton of the string, %i”,integer);

}

В этом примере вызывается функция printf() с двумя параметрами: форматирующей строкой и переменной, которая включается в формируемую строку вывода во время выполнения программы. Первый параметр функции – форматирующая строка, которая состоит из строки символов (статического текста) и спецификации вывода целого числа со знаком %i, соответствующей переменной integer. При вызове функции printf() значение переменной целого типа, преобразованное в символьный вид десятичного числа, будет вставлено в строку после запятой.

«this is the skeleton of the string, %i»

Ниже приведена строка, которая выводится во время выполнения программы (значение переменной равно 10).

[[email protected] server]$ ./format_example this is the skeleton of the string, 10

Функция printf() просматривает форматирующую строку и выводит каждый символ как он есть, буквально, пока не встретит спецификацию преобразования. Поскольку функция printf() заранее не знает, сколько параметров будет ей передано, то каждый параметр считывается из стека по мере обработки форматирующей строки в соответствии с типом каждой спецификации преобразования. В рассматриваемом примере в форматирующей строке единственная спецификация преобразования – спецификация вывода целого числа со знаком %i, обеспечивает вставку в формируемую строку переменной целого типа. Функция ожидает, что переменная, соответствующая спецификации преобразования, будет передана функции printf() вторым параметром. В архитектуре Intel (по крайней мере) параметры функций помещаются в стек до того, как будет создан стековый фрейм. Поэтому когда функция printf() считывает свои параметры из стека, они ссылаются на данные в стеке, находящиеся ниже стекового фрейма.

...

Примечание

В этой главе термин «ниже» («под») применяется к данным, которые были помещены в стек раньше каких-то других. Для описания данных, помещенных позже, применяется термин «выше» («над»). В архитектуре Intel стек растет вниз. В архитектурах с растущим вниз стеком адрес вершины уменьшается по мере роста стека, поэтому данные, расположенные «ниже», хранятся в областях памяти с большими адресами, чем данные, расположенные «выше».

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

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

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

Вернемся к примеру. Допустим, что впоследствии было решено выводить только статическую строку, но при этом забыли указать переменную, соответствующую спецификации формата. В конечном счете функция printf() вызывается следующим образом:

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

Коллектив авторов читать все книги автора по порядку

Коллектив авторов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Защита от хакеров корпоративных сетей отзывы

Отзывы читателей о книге Защита от хакеров корпоративных сетей, автор: Коллектив авторов. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*