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

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

<< . 1 . 2 .

Посл.отвђт Сообщен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), исключения страничного сбоя не будет

<< . 1 . 2 .


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