· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.VIROLOGY —› Проникновение на 0 ring в XP

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июл 21, 2003 00:42:57

Более подробно об идее проникновения на 0 кольцо.
пишем приложение DPMI (int 31h), создаем
дескриптор с базой допустим 80000000h(надо
подбирать),загружаем этот дескриптор в ES.
Потом вызываем sysenter или int 2Eh, а
если его (int 2Eh) просмотреть soft-ice,
то видно что он не меняя селекторы ES и DS
пытается скопировать параметры в новый стек
коммандой movsb (ds:[esi]->es:[edi]), а
ведь база уже не 000000000h => он копирует наши
параметры практически куда угодно (хоть
само int 2Eh меняй), а поскольку это на кольце 0 -
исключения не возникает. Да еще, я настаиваю
на использовании sysenter, а не int 2Eh, потому
что вряд ли, XP будет переписывать модельно-
специфические регистры при переходе в V86, а вот
изменение адреса int 2Eh вполне возможно.


Дата: Июл 21, 2003 01:16:11

Ха, поднял таки... Молодец :)


Дата: Июл 21, 2003 01:22:17

volodya
Я немогу этого проверить, сейчас я в отпуске и компьютер за которым я в и-нете довольнослабый чтобы поставить XP.
Есть возможность, что врежиме гостя даже DPMI нельзя
использовать, но время-деньги, если кто сможет - проверьте
вышеизложенное предположение. Вернусь из отпуска проверю сам.


Дата: Июл 21, 2003 13:56:35

пишем приложение DPMI (int 31h),
Т.е. ты хочешь заюзать DPMI из ДОС проги?
Это не так чтобы очень интересно - в нормальных системах скорее всего NTVDM будет вообще отключен.

он копирует наши параметры практически куда угодно
Ага, только вот куда конкретно? Непонятно как подобрать базу дексриптора.


Дата: Июл 24, 2003 13:59:09

Читал, читал и ничего не понял.
При чём тут база? Какой дескриптор нужно подбирать и с какой целью? Защита на страничном уровне, хоть какая у тебя база если результирующий линейный адрес будет
>= 8000 0000h а CPL и RPL не 0 у текущего кода - возникнет особый случай защиты. По этим линейным адресам у всех страниц стоит только доступ супервизора.
Может мне кто подробней может объяснить, чувствую полное непонимание о чём речь и причём тут база и "подбор дескриптора".
И вообще что здесь понимается под проникновением в кольцо 0?
Позволить какой то бинарной части приложения запущеного
с CPL 3 выполнится с CPL 0?


Дата: Июл 24, 2003 17:18:46 · Поправил: Sten

А, это мы продолжали обсуждение другого топика поэтому непонятно.

При чём тут база? Какой дескриптор нужно подбирать и с какой целью? Защита на страничном уровне, хоть какая у тебя база если результирующий линейный адрес будет
>= 8000 0000h а CPL и RPL не 0 у текущего кода - возникнет особый случай защиты. По этим линейным адресам у всех страниц стоит только доступ супервизора.

Все правильно. Речь шла о том, что когда вызывается INT 2Eh (_KiSystemService) то он устанавливает значение регистра FS=30h. При этом не трогает регистры DS и ES. Возникла естественная мысль использовать этот фактик. :)
А именно сделать так, чтобы база ES была не 0 и, когда _KiSystemService, выполняющийся с правами супервизора начинает копировать параметры из ring3-стека в ring0, используя инструкцию movsb, фактически выполняя DS:[ESI]->ES:[EDI], то вполне возможно запортит что-либо в системной области памяти, т.к. база ES не есть ноль, а KiSystemService мыслит категориями плостой модели памяти.
(Не самое короткое предложение! :-))

Здесь были две траблы - поменять базу ES проблематично (предполагалось заносить в регистр ES селектор из FS). И вторая трабла - сложно так подобрать базу, чтобы запортилось именно то, что нам нужно.

P.S. 2PROFi: Если ты все-таки нашел инет - использовать NTVDM DPMI для этих целей вряд-ли получится по любому. Т.к. там вообще все селекторы виртуальные..


Дата: Июл 24, 2003 22:45:13

Уж селекторы не могут быть виртуальными. Там другая проблема - int 2Eh не туда указывает, зато SYSENTER - туда. Вот это и надо использовать, потому что MSR регистры вряд ли меняются, а SYSENTER - непривилигированная команда. Вот только надо хорошо ядро XP изучить, чтобы знать, что перезаписывать.


Дата: Июл 24, 2003 23:10:11

Т.е. задача записать какой-то мусор по системным адресам?
И нужно знать доступный для CPL 3 сегмент, дескриптор которого содержит базу отличную от 0, для того чтобы загрузить его в ES?
Таких доступных сегментов всего 4е в XP насколько я знаю.
Два и так используются для данных и стека\ для кода.
Остальные два 16и разрядные. Оба можно загрузить, но поскольку они 16и разрядные то работают в пределе 64 к.
Один из них имеет базу отличную от 0 (обычно ту же что FS) если загружено CPL3, его можно грузить, читать, писать но он
не выйдет в системеные адреса из-за ограничености размера.
Второй грузить можно, но делать ничего нельзя - он будет
ссылаться на нижнюю область "нулевого адреса" (база 400, предел 0FFF), которая защищена от записи в страницах. Да и толку нет туда что-то писать, эта область для отслеживания программных ошибок и больше ничего, чтобы программы проверяли указатели которые им возвращаются.
Вот простенькая програмка показывающая какие селекторы доступны, выбор невелик.
BTW: Ты не тот Sten, который когда-то был комодератором в FIDO RU.HACKER?


_82260323__ACCSEGS.ZIP


Дата: Июл 24, 2003 23:47:48

Учтите, в Мкрософте тоже не дураки сидят, врят ли бы они допустили ошибку в таком узком месте. Наоборот тщательнее всего проверяется код, который работает с разными кольцами.
Это взгляд как психолога, а не программиста.


Дата: Июл 25, 2003 06:26:01

:)
Чего же они такие умные оставили доступ к IDT в 9х.
А ошибку которая валила NT в консольном классе исправили только в последних SP к XP?


Дата: Июл 25, 2003 12:23:04

BTW: Ты не тот Sten, который когда-то был комодератором в FIDO RU.HACKER?
Нет, не тот.


Дата: Июл 26, 2003 20:21:35

Я тоже что-то никак не всосу - как порча некоторой области памяти в ядре поможет перейти в ring0?


Дата: Июл 28, 2003 06:00:13

Потому что эта память и есть ринг 0


Дата: Июл 28, 2003 11:10:06

Интересное определение.
Т.е. если запустился драйвер у которого CPL и RPL = 0,
но при этом код его находится в страницах памяти < 80000000h то он уже и сам не в ring 0 :)
По моему скромному крестьянскому пониманию:
Перейти в ring 0 означает выполнять код из сегмента
CPL и RPL которого = 0.
Память сама по себе не может быть ring x.
Он может быть доступна из ring x.
Понятие колец защиты и перехода в них относится к текущему исполняемому коду, текущиму DPL в дескрипторе сегмента этого кода (реально же в теневом регистре ассоциированного с сегментным регистром) и RPL (последним битикам в CS)

Если удастся нанести какие-то вредительские действия из CPL 3 повредив системные области памяти, это лишь значит что ты опосредовано (через чужой код выполняющейся в ring0) повредил области памяти, страницы которой доступны только для супервизора. Здесь это предлогается делать не самому CPL 3 приложению, а через int 2E, которое выполняется в 0 кольце (то есть обработчик
int 2E будет в 0 кольце а не само приложение).
Это всё равно что мы написали драйвер, вызвали его сервис приложением с CPL 3, этот драйвер выполняясь получил доступ к защищённым страницам памяти и мы на основании этого начали утверждать что наше CPL 3 приложение перешло в ring 0. Никуда оно не перешло, оно вызвало программу-драйвер, который выполняется в ring 0, само оно в ring 3 так и качумает.

Если конкретно говорить уже не о переходе в нулевое кольцо а об инициировании действий пользовательским приложением с тем чтобы системный обработчик, работающий в 0 кольце, сделал что-то с системными областями памяти, то пока я не видел реализации, и жду с нетерпением :)
Вопрос остаётся открытым - что за дескриптор будет загружен в ES, если таких сегментов очень ограниченое колличество и из тех, которые можно загрузить, невозможно попасть в системные области - просто предела сегмента не хватит.
Если кто-то практически это опровергнет, я только буду рад посмотреть - поучится.


Дата: Июл 28, 2003 12:16:24

[ spaces: Потому что эта память и есть ринг 0 ]

Но это не есть переход в ring0, а есть возможность получить DSOD.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067