Que es el EstablisherFrame y el Exception Dispatcher Stack?

Iniciado por cuentanegra1990, 20 Julio 2015, 15:27 PM

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

cuentanegra1990

Pues eso que es el EstablisherFrame cuando se trata de un exploit basado en SEH?

Leyendo el tutorial 3a que habla de SEH aparece un concepto llamado EstablisherFrame y
no se exactamente a que se refiere.

Se que una función/método reserva su propio espacio en la pila para hacer uso de ella, según dice Vivek  Ramachandran y Corelan comenta que los propios manejadores de excepciones SE HANDLER también reservan su propio espacio en la pila y es hay donde habla de este termino ademas del "Exception Dispatcher Stack".

Un saludo!




El funcionamiento de las excepciones lo entiendo, el problema viene cuando Corelan dice que los Exception-Registration_Record del hilo o proceso están en posiciones de la pila mas altas, es decir abajo del todo, ademas dice que una función/método tiene su propio espacio en la pila(hasta aquí todo normal) el problema viene cuando dice que el Exception-Registration_Record tiene su propio espacio de pila, cosa que da a entender que esta en un marco de pila aislado del marco de la función(con su propio prologo/epilogo), cosa que Vivek Ramachandran dice en sus vídeos, que estos registros Exception-Registration_Record están dentro del mismo espacio de pila que la función que lo contiene y para ser mas exactos entre las variables locales y el registro EBP salvado de la función llamadora.

Y que hay de esos dos términos que mencionan los cuales hay poca información sobre ellos:

   EstablisherFrame
   Exception Dispatcher Stack




Nadie puede ayudarme? :-\


[MOD] No se debe hacer doble, triple post, usa el botón "modificar" para añadir comentarios.


Eternal Idol

#1
En Google hay informacion.

EstablisherFrame is the address of the base of the fixed stack allocation for this function.
https://msdn.microsoft.com/en-us/library/b6sf5kbd.aspx

Exception Dispatcher Stack: el mismo nombre lo dice, no es la pila original donde se produjo la excepcion, sino la que se usa para manejar la misma.

¿Tres mensajes consecutivos? ¿En serio? ¿Hace falta?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

cuentanegra1990

Hola  Eternal Idol,

Exception Dispatcher Stack: el mismo nombre lo dice, no es la pila original donde se produjo la excepción, sino la que se usa para manejar la misma.

Con la pila te refieres a otro marco(contexto) de pila no? es decir al stack frame generado por el SEH HANDLER no?





Eternal Idol

No, me refiero a una Duracell con pila. ¿Queres entender como funcionan las cosas? Ya te dijeron lo que tenes que hacer: DEPURALAS. Asi verias rapidamente como en el momento de la excepcion hay una pila del programa y cuando se la maneja hay otra.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

cuentanegra1990

#4
Te aseguro que estoy haciendo las pruebas oportunas Eternal Idol,

Por ejemplo me dirijo al SEH handler(tras habiendo provocado una excepción) y hago clic derecho y selecciono la opción "Follow in Disassembler" se me abre un marco(contexto) arriba a la izquierda del debugger lo cual tiene su propio prologo/epilogo. Este stack frame forma parte de la pila principal o es verdad que existe otra pila. Y de ser otra pila independiente esta es lo que se   llama "Exception Dispatcher Stack" ?


Porfavor os pido, si me podeis ayudar os lo agradeceria, tengo esa duda.

Un saludo!!!

.:UND3R:.

#5
Lo que ocurre es que SEH Structured exception handler, es la estructura que se utiliza para manejar las excepciones de un ejecutable, si mal no me equivoco, leyendo rápidamente cuando este manejador es instalado por hilos, para entender el manejador de excepciones debemos entender la estructura ERR:

Exception registration record:
- Puntero a la siguiente estructura ERR.
- Puntero al manejador de excepciones.

Esta estructura se encuentra en la pila, por lo menos eso es apreciable en los depuradores, además lo podemos corroborar por el rango, además de ello para obtener el SEH del marco actual, podemos obtenerlo a través de TIB:
https://es.wikipedia.org/wiki/Win32_Thread_Information_Block

específicamente en:
fs:[0]


En cuanto a los conceptos que mencionas no estoy muy seguro a que se refiere pero a podrías darnos ejemplos de su contexto, saludos.




Aquí unos apuntes que encontré:
CitarTipos de manejador de excepciones:

Por proceso:
SetUnhandledExceptionFilter
Devuelve la dirección en donde retornará un programa cuando ocurra una excepción
siempre y cuando este no esté siendo depurado y no posea un SEH propio instalado

Por thread:
Este manejador de excepciones devuelve la dirección en donde retornará un programa
cuando ocurra una excepción, este SEH solo es instalado en thread's y no en todo el programa

para instalar un Manejador de excepciones por Thread
se debe localizar la tabla TIB Thread Information Block
una vez localizada nos enfocaremos en el primer valor de la tabla ERR(exception registration record) contiene el actual manejador de excepciones SEH (Structured Exception Handling)
dentro de ella contiene dos valores
1-puntero hacia el siguiente SEH (si el programa no tiene instalado uno este nos mostrará FFFFFF ya que es el genérico)
2-address en donde se redirigirá el programa al haber una excepción

Para instalar un SEH propio

se debe empujar (push) el valor hacia donde se dirigirá el programa en caso de una excepción y el puntero a la anterior SEH

push xxx
push fs:[0]

y modificar el valor de fs:[0] por el SEH actual
mov fs:[0],esp

Para desinstalar:
pop fs:[0] (saca el primer valor del stack y lo guarda en fs:[0])
add esp,4 (si no se le suma a esp el valor 4, el stack quedará apuntando al segundo valor que se empujó cuando se instaló el manejador de excepciones)


Sé que no suple tus dudas pero quizás pueda orientarte en algo, saludos.

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

cuentanegra1990

#6
Hola .:UND3R:. antes de nada gracias por responder,

Mira como bien dices cuando implementamos una función que haga uso de excepciones que manejen estas son introducidas en la pila de forma de estructura Exception Registration Record, los cuales podemos verlos en la pila entre las variables locales y el registro EBP salvado de la función anterior, estos registros tienen la siguiente estructura:


  • Next SEH(Puntero al siguiente SEH)
  • SEH Handler(Puntero al manejador de excepciones propiamente dicho)

Ahora bien cuando se genera una excepción se crea un prologo/epilogo como el contexto que hace uso una función para sus variables locales, ret adrress... esto lo podemos ver si hacemos click derecho sobre el SEH handler y en el menú contextual seleccionamos la opción que dice "Follow in Disassembler" veremos en la parte superior izquierda donde empieza el prologo del Exception Handler.

Aquí viene mi duda, este contexto es lo que se llama Excetion Dispatcher Stack?
Es una pila aparte o es un contexto como el que suele hacer uso una función normal?

Lo que si que se es que esta fuera del entorno de pila de programa principal(e aquí mi gran duda).

.:UND3R:.

Cita de: cuentanegra1990 en 27 Julio 2015, 11:44 AM
Hola .:UND3R:. antes de nada gracias por responder,

Mira como bien dices cuando implementamos una función que haga uso de excepciones que manejen estas son introducidas en la pila de forma de estructura Exception Registration Record, los cuales podemos verlos en la pila entre las variables locales y el registro EBP salvado de la función anterior, estos registros tienen la siguiente estructura:


  • Next SEH(Puntero al siguiente SEH)
  • SEH Handler(Puntero al manejador de excepciones propiamente dicho)

Ahora bien cuando se genera una excepción se crea un prologo/epilogo como el contexto que hace uso una función para sus variables locales, ret adrress... esto lo podemos ver si hacemos click derecho sobre el SEH handler y en el menú contextual seleccionamos la opción que dice "Follow in Disassembler" veremos en la parte superior izquierda donde empieza el prologo del Exception Handler.

Aquí viene mi duda, este contexto es lo que se llama Excetion Dispatcher Stack?
Es una pila aparte o es un contexto como el que suele hacer uso una función normal?

Lo que si que se es que esta fuera del entorno de pila de programa principal(e aquí mi gran duda).


El segundo campo apunta a una dirección X y al parecer esta dirección depende de la programación del manejador, ya que como exploit writer podrías modificar el segundo campo para que apunte a la pila o darte cuenta que el manejador por defecto de las aplicaciones apunta a una dirección con comienzo 0x7. Ahora como lo dices claro que está fuera de la pila (normalmente) pero si haces una escritura del stack, la dirección debería apuntar a una de la pila que controles.

Todo esto te lo comento bajo mi supuestos pero no estoy seguro 100% debido a que desconozco de los conceptos pero si lo que te he comentado es verídico, ahora si esos conceptos se refieren a lo que te comento, excelente, si no, sigamos buscando.

Saludos

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

cuentanegra1990

No te entendí bien lo que quisiste decir...El registro que comento Exception_Registration_Record es puesto en la pila pero el segundo campo que es la dirección al manejador propiamente dicho no se donde apunta. Mencionas que apunta a una dirección de la pila por que empieza por 0x7.

Mira te dejo un vídeo que es el que comenta todo a la perfección pero no lo llego a entender...

[youtube=640,360]https://www.youtube.com/watch?v=rkQ4QI9dE6c[/youtube]

En este vídeo lo explica al detalle, el concepto esta en el minuto 8 pero me confunde ya que no se si se refiere a otro stack frame o otra pila independiente.

Espero su respuesta, un saludo.