Переполнение буфера на системах с неисполняемым стеком

       

Конфигурирование DEP


64-битные редакции NT при работе в native-режиме всегда задействуют DEP и не позволяют его отключать. Если разработчику хочется выполнить код на стеке или в куче (а хочется это достаточно часто), он должен явно назначить атрибуты доступа к данному региону памяти путем вызова API-функции VirtualAlloc или VirtualProtect. Никаких прав для этого не нужно, так что мы получаем лишь видимость безопасности – защиту от непреднамеренного доступа, но не более того и чуть позже мы покажем как ее обойти.

С 32-битными приложениями все намного сложнее. Существует огромное количество уже написанного ПО, трактующего атрибут -r- как -x-, и отказывающегося работать, если это не так. Поэтому, для сохранения обратной совместимости Microsoft предусмотрела возможность отключения DEP для 32-битных редакций NT и 32-битных приложений, исполняющихся в 64-битных редакциях NT.

Чтобы задействовать механизм DEP, необходимо иметь процессор, поддерживающий NX/XD-биты, причем 32-битные процессоры поддерживают NX-бит только в режиме PAE (Physical Address Extension – режим расширение физических адресов). 32-битные редакции NT автоматически распознает тип процессора, при необходимости добавляя ключ /PAE в файл boot.ini. 64-битные редакции не имеют отдельного PAE-ядра (они работают через технологию расширения окна адресации Address Windowing Extension — AWE), поэтому добавлять ключ /PAE для них не нужно.

Рисунок 7 конфигурирование DEP через редактирование boot.ini файла в Notepad

Если не указывать никаких дополнительных ключей, то в 32-битных редакциях NT будет запрещено выполнение кода на стеке, в ядре и в некоторых системных службах прикладного уровня. Все остальные приложения будут исполняться в обычном режиме. 64-битные версии по умолчанию разрешают выполнение кода на стеке/куче только для 32-битных приложений, а для 64-битных они запрещены (см. рис. 6)

Ключ /execute полностью отключает DEP для 32-битных редакций NT и 32-битных приложений, исполняющихся под 64-битными редакциями NT, но на "родные" 64-битные приложения его влияние не распространяется и они по-прежнему остаются защищены.


Ключ /noexecute=уровень_политики

позволяет конфигурировать DEP по своему усмотрению, выбирая требуемый уровень защищенности. Параметр "уровень_политики" может принимать одно из следующих значений: AlwaysOn, AlwaysOff, OptIn и OptOut, описанных в таблице 1.





параметр



значение



OptIn(по умолчанию)



DEP включена только для ограниченного системных процессов Windows и ядра



OptOut



DEP включена для всех процессоров и ядра, однако, можно сформировать список приложений, на которые защита не распространяется



AlwaysOn



DEP включена для всех процессоров и ядра. Отключить защиту для выборочных приложений нельзя



AlwaysOff



DEP отключена для всех процессов и ядра

Таблица 1 влияние уровня политики на безопасность

Если редактирование boot.ini приводит вас ужас (что в общем-то вполне закономерно, поскольку после этого система может перестать загружаться), воспользуйтесь интерактивным конфигуратором:



Рисунок 8 редактирование boot.ini файла через интерактивный конфигуратор

q       в командной строке введите "start sysdm.cpl" или нажмите <win>-<break>;

q       на вкладке "дополнительно" в группе "быстродействие" нажмите кнопку "параметры";

q       перейдите на вкладку "предотвращение выполнения данных";

q       выберите пункт "включить DEP только для основных программ и служб Windows" чтобы добавить в boot.ini параметр OptIn или выберите "включить DEP для всех программ и служб, кроме выбранных ниже", чтобы добавить параметр OptOut. другие параметры через интерактивный конфигуратор добавить невозможно;

q       если был выбран параметр OptOut нажмите кнопку "добавить" и укажите программы, на которые DEP распространятся не должна;



Рисунок 9 интерактивное конфигурирование DEP

Список программ, для которых отключен DEP, можно сформировать и через реестр (чисто хакерский путь, экономящий массу времени). Просто откройте ключ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers и создайте новый ключ типа "строка". Его имя должно содержать полный путь к exe-файлу, защиту которого мы хотим отключить, поместив внутрь ключа значение "DisableNXShowUI". Только не перепутайте их местами — иначе ничего не получится.


Содержание раздела