информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Страшный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[ASM] Переход в RING 0 под виндой 28.10.01 11:18  Число просмотров: 1126
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> Пожалкуйста ссылки или примеры!

в винде 9.х таблицы дескрипторов не защищены страничной защитой.
модификация GDT/IDT дает возможность получения PL0 в юзеровском коде

ниже приведена одна из возможных техник перехода на PL0
1) просмотр GDT и нахождение 2-х пустых слотов
2) в них делаем call gate с 3 на 0 кольцо и алиас юзеровского
дескриптора кода с PL0
3) используем этот call gate на какую-нибудь свою процедуру (ВАЖНО!!!
СИСТЕМНЫЕ Ф-ИИ В ЭТОЙ ПРОЦЕДУРЕ РАБОТАТЬ НЕ БУДУТ. RTFM. МОЖНО ИСПОЛЬЗОВАТЬ ЛИШЬ VXD-СЕРВИСЫ)
4) возвращаемся из процедуры PL0 через тот же call gate
5) восстанавливаем GDT

возможны и другие методики (например через IDT) но это IMHO самая простая

винды на основе NT не позволяют такого обращения, там или через .SYS или патчем загрузчика NTLDR


------------------------------ CUT -----------------------------------

.386p
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code32 segment byte public use32 'CODE'
assume cs:code32
assume ds:data

;input EDX=0 RW selector; else R selector
;output AX selector; 0=failed
data4g proc
push ecx
push edx
push ebx
mov edx,eax
sgdt [gdtr]
movzx ecx,word ptr [gdtr]
shr ecx,3
mov eax,8
a_0: lsl ebx,eax
jnz a_1
inc ebx
or ebx,ebx
jnz a_1
verr ax
jnz a_1
or edx,edx
jnz a_2
verw ax
jnz a_1
a_2: pop ebx
pop edx
pop ecx
ret
a_1: add eax,8
loop a_0
xor eax,eax
jmp a_2
data4g endp

pl0code proc far
call near dword ptr [pl0task]
ret
pl0code endp

public gate0open
;input NO
;output EAX<>0 -> pl0 call structure pointer
; EAX=0 -> error
gate0open proc
push ecx
push ebx
push esi
push edi
push gs
xor eax,eax
mov [code_offset],eax
mov [gate_offset],eax
call data4g
or ax,ax
jz a_ff
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov ax,cs
test ax,4
jnz a_0
mov edi,esi
jmp a_1
a_0: xor edi,edi
sldt di
and di,0fff8h
mov bl,gs:[esi+edi+7]
shl ebx,8
mov bl,gs:[esi+edi+4]
shl ebx,10h
mov bx,gs:[esi+edi+2]
mov edi,ebx
a_1: movzx ecx,word ptr [gdtr]
shr ecx,3
mov ebx,8
a_2: cmp dword ptr gs:[esi+ebx],0
jnz a_3
cmp dword ptr gs:[esi+ebx+4],0
jnz a_3
jmp a_4
a_3: add ebx,8
loop a_2
jmp a_ff
a_4: and ax,0fff8h
push gs:[edi+eax]
push gs:[edi+eax+4]
pop gs:[esi+ebx+4]
pop gs:[esi+ebx]
and byte ptr gs:[esi+ebx+5],9fh
mov [code_offset],ebx
mov edi,ebx
a_5: cmp dword ptr gs:[esi+ebx],0
jnz a_6
cmp dword ptr gs:[esi+ebx+4],0
jnz a_6
jmp a_7
a_6: add ebx,8
loop a_5
jmp a_fe
a_7: mov gs:[esi+ebx+2],di
mov eax,offset pl0code
mov gs:[esi+ebx],ax
shr eax,10h
mov gs:[esi+ebx+6],ax
mov word ptr gs:[esi+ebx+4],0ec00h
mov [gate_offset],ebx
mov word ptr [pl0gate_ptr+4],bx
or word ptr [pl0gate_ptr+4],3
mov eax,offset pl0task
a_8: pop gs
pop edi
pop esi
pop ebx
pop ecx
ret
a_fe: mov dword ptr gs:[esi+edi],0
mov dword ptr gs:[esi+edi+4],0
a_ff: xor eax,eax
jmp a_8
gate0open endp

public gate0close
;input NO
;output EAX<>0 -> ok
; EAX=0 -> error
gate0close proc
push ecx
push ebx
push esi
push gs
mov ebx,[code_offset]
or ebx,ebx
jz b_ff
mov ecx,[gate_offset]
or ecx,ecx
jz b_ff
xor eax,eax
call data4g
or ax,ax
jz b_0
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov dword ptr gs:[esi+ebx],0
mov dword ptr gs:[esi+ebx+4],0
mov dword ptr gs:[esi+ecx],0
mov dword ptr gs:[esi+ecx+4],0
b_0: pop gs
pop esi
pop ebx
pop ecx
ret
b_ff: xor eax,eax
jmp b_0
gate0close endp

code32 ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
data segment byte public
gdtr dw 0
dd 0
align 4
gate_offset dd 0
code_offset dd 0
pl0task dd 0
pl0gate_ptr dd 0
dw 0
data ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end

------------------------------ CUT -----------------------------------

<programming>
[ASM] Переход в RING 0 под виндой 27.10.01 11:00  
Автор: eXeC001er Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Пожалкуйста ссылки или примеры!
[ASM] Переход в RING 0 под виндой 28.10.01 11:18  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> Пожалкуйста ссылки или примеры!

в винде 9.х таблицы дескрипторов не защищены страничной защитой.
модификация GDT/IDT дает возможность получения PL0 в юзеровском коде

ниже приведена одна из возможных техник перехода на PL0
1) просмотр GDT и нахождение 2-х пустых слотов
2) в них делаем call gate с 3 на 0 кольцо и алиас юзеровского
дескриптора кода с PL0
3) используем этот call gate на какую-нибудь свою процедуру (ВАЖНО!!!
СИСТЕМНЫЕ Ф-ИИ В ЭТОЙ ПРОЦЕДУРЕ РАБОТАТЬ НЕ БУДУТ. RTFM. МОЖНО ИСПОЛЬЗОВАТЬ ЛИШЬ VXD-СЕРВИСЫ)
4) возвращаемся из процедуры PL0 через тот же call gate
5) восстанавливаем GDT

возможны и другие методики (например через IDT) но это IMHO самая простая

винды на основе NT не позволяют такого обращения, там или через .SYS или патчем загрузчика NTLDR


------------------------------ CUT -----------------------------------

.386p
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code32 segment byte public use32 'CODE'
assume cs:code32
assume ds:data

;input EDX=0 RW selector; else R selector
;output AX selector; 0=failed
data4g proc
push ecx
push edx
push ebx
mov edx,eax
sgdt [gdtr]
movzx ecx,word ptr [gdtr]
shr ecx,3
mov eax,8
a_0: lsl ebx,eax
jnz a_1
inc ebx
or ebx,ebx
jnz a_1
verr ax
jnz a_1
or edx,edx
jnz a_2
verw ax
jnz a_1
a_2: pop ebx
pop edx
pop ecx
ret
a_1: add eax,8
loop a_0
xor eax,eax
jmp a_2
data4g endp

pl0code proc far
call near dword ptr [pl0task]
ret
pl0code endp

public gate0open
;input NO
;output EAX<>0 -> pl0 call structure pointer
; EAX=0 -> error
gate0open proc
push ecx
push ebx
push esi
push edi
push gs
xor eax,eax
mov [code_offset],eax
mov [gate_offset],eax
call data4g
or ax,ax
jz a_ff
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov ax,cs
test ax,4
jnz a_0
mov edi,esi
jmp a_1
a_0: xor edi,edi
sldt di
and di,0fff8h
mov bl,gs:[esi+edi+7]
shl ebx,8
mov bl,gs:[esi+edi+4]
shl ebx,10h
mov bx,gs:[esi+edi+2]
mov edi,ebx
a_1: movzx ecx,word ptr [gdtr]
shr ecx,3
mov ebx,8
a_2: cmp dword ptr gs:[esi+ebx],0
jnz a_3
cmp dword ptr gs:[esi+ebx+4],0
jnz a_3
jmp a_4
a_3: add ebx,8
loop a_2
jmp a_ff
a_4: and ax,0fff8h
push gs:[edi+eax]
push gs:[edi+eax+4]
pop gs:[esi+ebx+4]
pop gs:[esi+ebx]
and byte ptr gs:[esi+ebx+5],9fh
mov [code_offset],ebx
mov edi,ebx
a_5: cmp dword ptr gs:[esi+ebx],0
jnz a_6
cmp dword ptr gs:[esi+ebx+4],0
jnz a_6
jmp a_7
a_6: add ebx,8
loop a_5
jmp a_fe
a_7: mov gs:[esi+ebx+2],di
mov eax,offset pl0code
mov gs:[esi+ebx],ax
shr eax,10h
mov gs:[esi+ebx+6],ax
mov word ptr gs:[esi+ebx+4],0ec00h
mov [gate_offset],ebx
mov word ptr [pl0gate_ptr+4],bx
or word ptr [pl0gate_ptr+4],3
mov eax,offset pl0task
a_8: pop gs
pop edi
pop esi
pop ebx
pop ecx
ret
a_fe: mov dword ptr gs:[esi+edi],0
mov dword ptr gs:[esi+edi+4],0
a_ff: xor eax,eax
jmp a_8
gate0open endp

public gate0close
;input NO
;output EAX<>0 -> ok
; EAX=0 -> error
gate0close proc
push ecx
push ebx
push esi
push gs
mov ebx,[code_offset]
or ebx,ebx
jz b_ff
mov ecx,[gate_offset]
or ecx,ecx
jz b_ff
xor eax,eax
call data4g
or ax,ax
jz b_0
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov dword ptr gs:[esi+ebx],0
mov dword ptr gs:[esi+ebx+4],0
mov dword ptr gs:[esi+ecx],0
mov dword ptr gs:[esi+ecx+4],0
b_0: pop gs
pop esi
pop ebx
pop ecx
ret
b_ff: xor eax,eax
jmp b_0
gate0close endp

code32 ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
data segment byte public
gdtr dw 0
dd 0
align 4
gate_offset dd 0
code_offset dd 0
pl0task dd 0
pl0gate_ptr dd 0
dw 0
data ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end

------------------------------ CUT -----------------------------------

[ASM] Если из DOS-программ, то... 27.10.01 13:36  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
...То ниже есть диалог (тема - ASM), я там пример своей проги с комментариями кинул. Тама есть и другие примеры. Стандартный способ вроде vxd.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach