|
|
| Посл.отвђт | Сообщен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. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067 |