Один из примеров того, как ошибка может создать возможность для использования:
Допустим, у вас есть подпрограмма в программе, которая изменяет данные в массиве символов. Допустим, он также содержит ошибку, заключающуюся в том, что, когда массив имеет определенный размер или массив содержит определенные символы, подпрограмма непреднамеренно выполняет запись за концом массива символов.
Само по себе это не кажется большой возможностью, но в зависимости от того, как выполнение достигает подпрограммы и других артефактов того, как она реализована и компилируется, ее можно использовать в качестве трамплина для выполнения произвольного кода.
В традиционном программировании (C, C ++) символьные массивы (буферы) часто хранятся в программном стеке. Стек - это очень быстрое и простое выделение памяти для небольших временных данных.
Еще одна вещь, которая хранится в стеке, - это адрес возврата вызова функции - адрес кода, на который нужно вернуться при выходе из этой функции.
Теперь у вас есть все необходимое для создания катастрофы: если вы можете передать только правильные данные в эту подпрограмму, чтобы она перезаписала стек, и перезаписать ее достаточно, чтобы перезаписать адрес возврата функции, который также находится в стеке недалеко от данных buffer, тогда у вас есть возможность изменить место, куда вернется выполнение программы после выхода из функции. Вместо того, чтобы возвращаться к вызывающему, его можно заставить «вернуться» (на самом деле, перейти) к Halt (), Format () или PhoneHome (). В этот момент доступна любая функция в любой библиотеке или DLL, на которую ссылается текущий процесс.
Это всего лишь один пример эксплойта произвольного выполнения. Таких выкроек десятки.
Самый простой способ предотвратить этот конкретный эксплойт - убедиться, что ваш код соблюдает границы ваших буферов данных. Для большинства компиляторов это означает включение проверки диапазона или аналогичных проверок во время выполнения. Компилятор выдаст код для проверки того, что значение индекса массива находится в диапазоне, прежде чем обращаться к ячейке памяти в массиве.
person
dthorpe
schedule
02.04.2010