182
«Молодой учёный»
. № 4 (138)
. Январь 2017 г.
Информатика
ленной функции display. Функция display, принимающая
в качестве параметра строковый указатель, содержит уяз-
вимость. В начале данной функции определяется огра-
ниченный по размеру буфер buf. Далее, путем вызова
функции strcpy, в локальный буфер
копируется строка, на
которую указывает параметр функции display. В данном
месте и содержится уязвимость. Дело в том, что библи-
отечная функция strcpy не проверяет размеры буфе-
ра-приемника, копирование строки при этом продолжа-
ется до тех пор, пока в строке-источнике не встретиться
нулевой символ, обозначающий конец строки.
Таким об-
разом, возможна ситуация переполнения локального бу-
фера, если строка-источник, указатель на которую посту-
пает в функцию display, будет достаточной длины.
Рассмотрим, как выглядит переполнение со стороны
отладчика. Снимки экрана с программой, запушенной под
отладчиком Windbg, показаны на рисунках 2 и 3.
На рисунке 2 (до команды отладчика dd esp) пред-
ставлен дизассемблированный код начала функции display.
Видно, что по адресу 0040134d происходит
выполнение
команды lea, которая в данном случае загружает в регистр
eax указатель на область памяти в стеке. Далее этот ука-
затель используется в качестве параметра строки-прием-
ника функции strcpy, которая получает управление после
Рис.
2.
Начало функции display и состояние стека в момент входа
Рис.
3.
Состояние стека к моменту исполнения инструкции ret
183
“Young Scientist”
. # 4 (138)
. January 2017
Computer Science
исполнения инструкции call по адресу 00401353 (через
прыжок по адресу 00401с00).
На рисунках 2 и 3 показаны два изображения состо-
яния стековой области памяти, в момент входа в функцию
display и перед самым выходом — исполнением ин-
струкции ret. В данном случае программе передавалась
строка, состоящая из 12h символов «A», четырех сим-
волов «B» и четырех символов «C». Хорошо видно, что
важная управляющая информация —
адрес возврата из
функции — к моменту исполнения инструкции ret ока-
зывается перезаписанной значением 43434343. Данное
значение представляет собой четыре байта с ascii кодом
символа «C». Таким образом, мы получаем здесь клас-
сическое переполнение буфера в стеке. Поскольку появ-
ляется возможность контролировать адрес возврата, то
становится вероятным появление функциональности в
уязвимой
программе, которая не была запланирована ее
разработчиком.
Переполнение буфера не в стеке.
Явление переполнение буфера может возникать не
только в стековой памяти. Пусть у нас имеются некоторые
переменные в программе (на языке C), которые объ-
явлены как статические и не инициализированы. В том
случае, если среди этих переменных есть буферы фикси-
рованного размера, которые принимают входные данные
без соответствующих проверок и объявляются перед не-
которыми статическими
указателями на функции, то воз-
можно переполнение буфера в сегменте. bss. При пере-
записи указателей на функции последующий их вызов
способен привести к исполнению программой посторон-
него кода.
Другим типом уязвимости переполнения является
переполнение буфера, выделенного в куче [1, с. 119].
Куча — специальная область памяти, которую программа
способна запрашивать динамически во время выпол-
нения. Кроме
того, что сами блоки памяти могут содер-
жать важную для программы информацию, в выделенных
из кучи участках содержатся служебные данные, переза-
пись которых может спровоцировать в конечном итоге вы-
полнение произвольного кода.
На некоторых системах [2, с. 291]
при наличии пере-
полнения используются особенности алгоритма управ-
ления памятью из кучи. Все свободные куски памяти
(области, освобожденные с помощью функции free ())
объединяются в двухсвязные списки. На рисунке 4 схема-
тично показан фрагмент одного из таких списков.
Рис.
Do'stlaringiz bilan baham: