|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 28, 2003 12:17:12 Интересное определение. Т.е. если запустился драйвер у которого CPL и RPL = 0, но при этом код его находится в страницах памяти < 80000000h то он уже и сам не в ring 0 :) Было бы интересно посмотреть на этот драйвер. Особенно после того, как винда свопнула пару страниц такого драйвера на диск, у вызвалась подпрограмка на IRQL >= DPC_LEVEL. :) Если удастся нанести какие-то вредительские действия из CPL 3 повредив системные области памяти, это лишь значит что ты опосредовано (через чужой код выполняющейся в ring0) повредил области памяти, страницы которой доступны только для супервизора А кто вообще говорил про переход в ring-0? (заголовок я конечно читал) :-) Лично я говорил о том, чтобы пропатчить хотя бы один байт в системной области памяти. Например для NT4 был такой патч, который изменял байт NtGlobalFlags+2, в результате чего функция OpenProcess переставала проверять наличие отладочных привилегий при открытии системного процесса.. Вопрос остаётся открытым - что за дескриптор будет загружен в ES, если таких сегментов очень ограниченое колличество и из тех, которые можно загрузить, невозможно попасть в системные области - просто предела сегмента не хватит. Опять же я говорил, что с этим напряг. Все эти рассуждения можно рассматривать как чисто теоретические. Хотя тут и предлагалось использовать DPMI в NTVDM, но я очень сомневаюсь что он действительно даст создать реальные дескрипторы. 2dragon: Виртуальными дескрипторы и селекторы быть очень даже могут. Можно, напимер, хучить исключения проца при обращении к таким дескрипторам и эмулировать это дело.. (тут, конечно есть темные места - что делать при попытке загрузки селектора такого дескриптора в сегментный регистр?) Ты, например, VMWare видел? Там, правда, похоже, вообще все эмулируется.. Как это все реализовано в NTVDM я не знаю. |
|
|
Дата: Июл 28, 2003 19:07:45 Вообще вроде как VMWare на виртуальной машине работает. А на счёт NTVDM вряд ли так будет. |
|
|
Дата: Июл 31, 2003 07:26:04 Я когда-то в школе учился, и никак не мог запомнить как пишутся некоторые слова - через а или через о. Поэтому я в диктантах пытался смухлевать - писал так, чтобы можно было в слове собака, и как собака и как сабака. Разговор про "виртуальные дескрипторы" навеял эти воспоминания... Что это такое "виртуальные дескрипторы"? Не могли бы вы, пожалуйста, разъяснить мне как второкласснику и второгоднику? Что такое VM и как там рассчитываются смещения - знаю, а вот, что такое "виртуальные" дескрипторы - нет :(. Как процессор то работает с ними? |
|
|
Дата: Авг 2, 2003 00:48:53 Sten А что если запустить не одно, а два приложения: одно DPMI, а другое Win32. Далее селекторы созда- ваемые по int 31h будут в таблице LDT, которой без DPMI не существует вообще. Я не могу проверить сейчас, но займусь этим в бижайшее время. Еще раз повторю основную суть пробемы -dragon да действительно нужно использовать sysenter, а не int 2Eh и даже настаиваюна этом.The Svin -dragon Вот только надо хорошо ядро XP изучить, чтобы знать, что перезаписывать. - Создать в приложении win32 поток suspend, а потом изменить его cs в структуре CONTEXT и разрешить выполнение (если это сделать вручную используя soft-ice то поток будет выполняться на ring0 |
|
|
Дата: Авг 2, 2003 00:53:33 Вопрос остаётся открытым - что за дескриптор будет загружен в ES, если таких сегментов очень ограниченое колличество и из тех, которые можно загрузить, невозможно попасть в системные области - просто предела сегмента не хватит. Для этого я и предлагаю использовать DPMI НОВОЕ-ХОРОШО ЗАБЫТОЕ СТАРОЕ |
|
|
Дата: Авг 2, 2003 01:02:52 P.S. 2PROFi: Если ты все-таки нашел инет - использовать NTVDM DPMI для этих целей вряд-ли получится по любому. Т.к. там вообще все селекторы виртуальные..Sten Селекторы виртуальные?, а вот sysenter - даже в V86 режиме вызывается |
|
|
Дата: Авг 2, 2003 01:05:55 dragon случайно на forum.codenet.ru не участвуеш. |
|
|
Дата: Авг 2, 2003 02:06:10 · Поправил: Безпощадный даос Да напоследок ; независима от расположения в памяти ; независима от операционной системы ; Поскольку кеш TLB и регистры tr6 и tr7 меняются от процессора к ; процессору, то их использовать для вычсления линейного адреса из ; физического нельзя (они разные для intel и athlon) ; Ошибочно работает если линейный адрес !!!кода!!! перекрывается ; с линейным адресом стека т.е. допустим 0F8800000h - адрес выполняемой ; программы, а 0F8801000h - адрес стека, т.к. тогда анализ именения ; бита A (выполнен доступ) невозможен. В этом случае возможен поиск ; таблицы страниц, а не каталога но это лишь в том случае, если ; размер страницы 4 Кб т.е. и код и стек помещаются в одной странице 4 Кб, ; но чаще данная ситуация происходит если размер страницы 2 Мб или 4 Мб, а ; в данном случае поиск невозможен. Поэтому есть резон искать по изменению ; бита D, поскольку выполнение кода не меняет его в отличие от прямой записи ; в страницу. ; необходимо запускать с DPL=0 ; сегментный регистр DS должен иметь базу 0 лимит 4 ГБ и !!!DPL=0!!! ; в Win NT (XP) если запускать программу в режиме драйвера, то хотя ; DPL у cs = 0, !!!DPL у ds = 3!!! ; не расчитана на использование при 36-бит адресации бит PAE в cr4 ; используется в Pentium Pro например, но на момент написания программы ; эту возможность не использовала ни одна общедоступная операционная система. ; практически страница стека должна быть в памяти, должна быть доступна по ; записи, и к ней уже произошел доступ т.е. P=1,R/W=1,A=1 маска 00100011b ; на бит D (в станицу произведена запись) расчитывать нельзя при ; поиске страницы в памяти (хотя для каталога страниц intel в своей докумен- ; тации говорит, что это резервный бит и он равен 0 и не изменяется, но ; Windows NT (XP) прописывает сюда несмотря на рекомендации - 1), а вот ; отличить каталог таблиц от таблицы страниц по этому биту можно т.к. он ; в каталоге страниц при записи в страницу в отличие от входа таблицы страниц ; действительно не меняется, а вот если размер страницы 2 Мб (Pentium Pro ; и выше) или 4 Мб (Pentium бит PS = 1), то тогда каталога для этой ; страницы не существует и бит D будет меняться введена проверка. include inc\protect.mac .data xDT STRUC limit dw ? base dd ? xDT ENDS store_esp equ -6 ; поскольку есть разница во времени использования idt equ -6 ; используем объединение ячеек .code GetLogicalAdr: push es push ds call SetSegments pop ds pop es push ebp mov ebp,esp sub esp,6 ; для сохранения idt sidt [ebp.idt] mov ebx,[ebp+idt.base] push L [ebx+(14*8)] push L [ebx+((14*8)+4)] call GLALocal4 GLALocal4: pop eax mov edx,eax add eax,(offset int_0E - offset GLALocal4) mov ecx,eax mov [ebx+(14*8)],ax mov ax,08E00h ; P=1 DPL=0 S=0 TYPE=E(шлюз int) mov [ebx+((14*8)+4)],eax mov eax,cs ; текущий селектор mov [ebx+(14*8)+2],ax mov eax,cr4 ; если не сбростить push eax and al,7Fh ; то вход таблицы страниц mov cr4,eax ; будет кэшироваться и mov eax,esp ; бит A изменяться не будет shr eax,(10+12-2) and al,0FCh xchg esi,eax mov [ebp.store_esp],esp ; меньше работы со стеком GLALocal2: mov al,[esi] and al,00100011b ; предположение, что cmp al,23h ; страница памяти стека jnz GLALocal1 ; имеет P=1 R/W=1 A=1 cmp esi,edx ; Проверка границ jc GLALocal5 ; чтобы не изменять cmp esi,ecx ; собственный код jc GLALocal1 GLALocal5: xor byte ptr [esi], 00100000b ; остальные не определены test byte ptr [esi],00100000b ; не ПЗУ ли jnz GLALocal1 mov eax,cr3 ; сброс TLB mov cr3,eax mov eax,[esp] ; доступ и проверка test byte ptr [esi],00100000b ; бита A=1 (доступ осуществлен) jnz GLALocal3 xor byte ptr [esi], 00100000b ; восстановление GLALocal1: mov esp,[ebp.store_esp] add esi,1000h cmp esi,1000h jnc GLALocal2 GLALocal3: test byte ptr [esi],10000000b jnz GLALocal6 ; страница 2 или 4 Мб push L [esi] and byte ptr [esi],10111111b mov eax,cr3 ; сброс TLB mov cr3,eax mov eax,[esp] ; доступ и проверка mov [esp],eax test byte ptr [esi],01000000b ; бита D=1 (проведена запись) pop L [esi] jnz GLALocal1 ; это не каталог GLALocal6: pop eax mov cr4,eax pop L [ebx+((14*8)+4)] ; esi - указатель pop L [ebx+(14*8)] ; на каталог страниц + leave ; смещение на страницу стека retn int_0E: jmp GLALocal1 ; Есть ошибка ; т.к. SS:ESP уже новое из ; TSS (ss:esp для CPL0) ; необходимо восстанавливать |
|
|
Дата: Авг 2, 2003 02:16:58 Программа ищет линейный адрес CR3, и помещает его в esi, но необходимо сделать and esi,0FFFFF000h перед использованием |
|
|
Дата: Авг 2, 2003 09:15:39 Жалко, что доков по DPMI нет, так бы сам проверил, но мне кажется, что память должна перезаписаться, если es будет действительно указывать после SYSENTER на созданный дескриптор. Да, на codenet.ru тоже бываю. |
|
|
Дата: Авг 4, 2003 00:50:23 dragon По DPMI документацию найти в и-нете легко, а сам я часто не признаю никакие API или др. функции, которые можно подменить, например, антивирусом. Что касается знаю-незнаю, то могу тебя заверить я тоже не знаю до конца DPMI, но он использует int 2Fh (одна - две функции), но она нужна для использования int 31h. Да я столкнулся с DPMI когда запускал NTFSDOS Pro 4.0 без серийного номера, псмотри как там используется DPMI. |
|
|
Дата: Авг 4, 2003 14:56:54 Проверка происходит во время загрузки селектора в сегментный регистр. Если произойдёт попытка загрузить селектор указывающий на дескриптор с DPL = 0, произойдёт особый случай нарушения общей защиты. |
|
|
Дата: Авг 24, 2003 02:42:04 The Svin Мы загружаем селектор данных с DPL=3 из LDT, суть в обходе защиты не сегментной, а страничной. Обработка выполняется на CPL=0, но в этой обработке отсутствует перегрузка сегментов данных, а поскольку это CPL 0, то когда мы будем писать в память страницы которая доступна только на уровне system (в страницу уровня user можно записать и на CPL=3), исключения страничного сбоя не будет |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.062 |