Защити свои приложения Илья Рабинович Спецвыпуск: Хакер, номер #058, стр. 058-034-2 Щит №4: NX/XD-бит процессора, технология DEP от Microsoft Что же представляет собой этот широко разрекламированный бит? Все очень просто. NX - аббревиатура от Non-Executable. Бит неисполняемости процессора. Как известно, шелл-код внутри приложения имеет вполне определенное положение - это стек, куча или (очень-очень редко) статическая память внутри секции данных приложения. Если мы запрещаем выполнение кода внутри этих областей памяти (метим их NX-битом), то при попытке выполнить шелл-код в помеченных областях памяти мы получим исключение защиты. Все просто и гениально. Атака на переполнение не проходит. Именно на основе NX/XD-бита и построена технология DEP от Microsoft, встроенная в операционные системы Windows XP SP2 и Windows 2003 SP1. Также технология DEP включает в себя контроль целостности стека и кучи на основе проверочных данных и контроль цепочки SEH. А теперь - по порядку. 1. Внутри исполняемых процессов все области данных метятся NX-битом, что запрещает исполнение кода в них. В случае попытки выполнить код в этих областях памяти вылетает исключение и приложение заканчивает свою работу. Если же процессор не поддерживает NX/XD-бит, то код можно выполнять в любой доступной области памяти процесса. 2. Контроль целостности стека представляет собой применение старой доброй технологии StackGuard, реализованной для Linux. При входе в функцию в стек запихивается некоторое проверочное число. При выходе из функции то число, которое лежит в стеке, сравнивается с эталонным. Если эти числа не совпадают, значит, было переполнение. В этом случае генерируется исключение защиты и приложение заканчивает свою работу. Эта возможность заложена в компиляторы Microsoft начиная с VC 2003 (директива компилятора /GS, включена для всех проектов по умолчанию). С кучей происходит примерно та же вещь: в начало каждого блока кучи операционная система помещает проверочные данные. Если при выделении нового блока или при освобождении старого где-то внутри цепочки блоков проверочные данные не сошлись, генерируется исключение защиты. Это не свойство компилятора, как в предыдущем случае, а свойство операционной системы! 3. Контроль целостности цепочки SEH. В общих словах, SEH - это последовательность обработчиков исключений приложения. У каждого потока внутри приложения своя цепочка SEH! Если в потоке происходит исключение, то система последовательно вызывает все обработчики, ожидая, что хоть один из них справится с ним. Если же ни один из обработчиков исключений не смог обработать его, то вызывается обработчик исключений, общий для всех потоков (UnhandledExceptionFilter). Если же и он бессилен, то системе ничего другого не остается, как показать сообщение "Ваш коврик от мышки выполнил недопустимую операцию и будет свернут..." и завершить данное приложение. Так вот, возвращаясь к контролю. При наличии исключения в потоке система проверяет, не лежат ли адреса обработчиков исключений внутри кучи или стека. Если лежат, система генерирует исключение защиты. |