Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Ring0

Shen (_shen_@mail.ru)

Спецвыпуск Xakep, номер #035, стр. 035-062-3


Windows использует только два уровня (кольца): нулевой для себя и третий для всех остальных. Т.е. любая написанная нами Win32-программа будет работать в третьем кольце и иметь наименьший уровень привилегий! Помнишь, что сказал Гейтс насчет вирусов и Win95? Единственным документированным методом обратиться к сервисам нулевого кольца является написание VxD, но это чересчур громоздкий и неудобный способ. А других возможностей перейти с третьего пользовательского кольца на нулевое системное нет! Но не зря же я сказал "единственным документированным методом". Всего же в документации не упомянешь :). И вот, мы вплотную подобрались к теме статьи: как же все-таки попасть на вожделенный ноль-уровень?

Прерывания

Помнишь, я говорил о трех дескрипторных таблицах: GDT, LDT и IDT? Нас будет интересовать последняя – IDT. Крайне интересным для нас является тот факт, что в этой таблице хранятся дескрипторы прерываний и исключений, т.е. Interrupt Descriptor Table защищенного режима - это аналог Interrupt Vector Table режима реального. Когда возникает исключение, процессор ищет в IDT запись с соответствующим номером и передает управление обработчику по адресу, хранящемуся в дескрипторе. Исключения обрабатываются на нулевом уровне привилегий. Стоп! Обработчик исключения работает в Ring0, а программа, вызвавшая исключение – в Ring3? Как же так? Для разрешения такого противоречия используется механизм шлюзов. Шлюз – это специальный объект, через который процессор может "передвигаться" между уровнями зашиты. Когда программа на третьем уровне вызывает исключение, процессор через шлюз спускается на нулевой уровень, передает управление обработчику, а когда обработчик возвращает управление, процессор, опять же через шлюз, возвращается в Ring3. Т.е. когда управление получает обработчик, он автоматически имеет наивысший уровень привилегий. Ничего не приходит в голову? А если я скажу, что Win9x разрешает программам с третьего кольца безнаказанно модифицировать IDT? Видимо, это у Microsoft такая традиция, фирменный почерк – предоставлять свободный доступ к таблицам векторов прерываний, что в реальном, что в защищенном режиме :). Что будет, если мы подменим адрес обработчика прерывания N в соответствующем дескрипторе на адрес своей процедуры, а потом из нашей Ring3-программы вызовем это самое прерывание N? Верно! Процессор перейдет на нулевой уровень защиты, найдет в нужном дескрипторе адрес обработчика и передаст тому управление. Т.е. "включит режим Ring0" и передаст управление нашей процедуре! Там мы будем всячески наслаждаться полным доступом к ресурсам компьютера и самой системы, а когда надоест, вернем управление процессору, тот через шлюз "поднимет" нас на Ring3, где мы спокойно продолжим работу на "юзерском" уровне. Правда, перед этим нам придется восстановить в IDT старый адрес обработчика, чтобы не нарушить работу операционки и не вызвать лишних подозрений. Итак, начинаем писать. Нам потребуется Tasm 5.0 и сама Win9x, больше ничего.

Назад на стр. 035-062-2  Содержание  Вперед на стр. 035-062-4