Duda con findjmp.exe (no consigo entender su verdadera utilidad)

Iniciado por exploiterstack, 1 Diciembre 2014, 14:21 PM

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

x64core

@UND3R:
La dirección de la pila no depende de la versión de Windows, ni del idioma, o algo que tenga que ver. El kernel es el que determina donde la memoria será reservada, ya que en la inicialización del proceso casi toda la memoria de modo usuario es disponible, es por eso que generalmente la dirección no varia mucho. Esto más bien se basa en asuntos como tamaño de la memoria a reservar, attributos, etc.

Uno mismo puede comprobarlo haciendo lo siguiente: Añadir el depurador al proceso explorer.exe, breakpoint en NtCreateProcess/NtCreateProcessEx/NtCreateUserProcess, abrir algun programa como notepad.exe o cualquier otro, el depurador parará en el bp, dejar que la función se ejecute, ahora crear 500-1000MB de memoria virtual en bloques de 1MB cada uno ( con el depurador o alguna herramienta como CheatEngine), ahora permitir que la inicialización del proceso (notepad.exe) sea completada, comprobar la dirección de la pila del hilo principal del proceso.


Cita de: exploiterstack en  1 Diciembre 2014, 14:21 PM
Hola comunidad, tengo una duda que me ronda la cabeza y por mas que intento aplicarle la lógica no lo consigo. Dicha duda consiste en el uso de findjsp.exe he leido muchos textos que hacen uso de esta herramienta entre ellos la explicación que aquí se detalla:

http://foro.elhacker.net/bugs_y_exploits/herramientas_findjmp_offsets_etc_actualizado-t101215.0.html

Yo lo que tengo entendido que se utiliza para obtener la dirección(offset) de una instrucción JMP ESP que hace uso la aplicación o una librería(dll) del software que se esta explotando.

Con dicha instrucción tenemos que sobrescribir EIP en la pila, de modo que cuando este registro vaya a ejecutar esta instrucción accederá a la cima de la pila(ESP) a ejecutar lo que alli tengamos(en el caso mas común una shellcode), hay viene mi duda. Por que forzar a sobrescribir el EIP con ese ofset para que este acceda a la pila a ejecutar la shellcode?

Se que mas o menos lo entiendo pero no se si sera mi mente pero no lo llego a entender  al 100% todo esto, así que si alguien fuera capaz de hacérmelo ver de una manera sencilla (for dummies)

Gracias de antemano.
Lo que preguntas es simple, te lo responderé igual de simple. Es porque generalmente es una manera cómun de ejecutar lo que se encuentre en la pila directamente, de lo contrario tendrás que arreglarte para ejecutar lo que se encuentre en la pila buscando otro conjunto de instrucciónes que te ayuden para hacerlo algo como:
MOV EBP,ESP
JMP EBP
Y miles de otras formas de hacerlo, claro que algunas no son comunmente generadas por compiladores.







exploiterstack

Hola x64Core,

Haber lo que me quieres decir es que se utiliza JMP ESP por que al machacar el EIP con esa dirección me llevaría a la cima de la pila para ejecutar el shellcode(en el caso de que la tenga apuntando a ESP) vale hasta ay creo estar en lo cierto.

Si no es así esta parte házmelo saber plis...

Con la otra parte que dices, significa que si no tuviera la shellcode apuntando en la cima y la tuviera en cualquier otro lugar del stack debería de apañarmelas con otro juego de instrucciones y utilizar la dirección de estas instrucciones para machar el registro EIP para que me lleve al lugar exacto donde esta la shellcode para que sea ejecutada?

Si no es así esta otra parte házmelo saber plis...

Por ultimo esto que comento estoy en lo cierto?


1)Nunca hay que confiar en las direcciones del stack por que estas direcciones variaran dependiendo únicamente del programa, contenido etc...Y esto repercutirá en las direcciones que haga uso en el stack.

2)Si confiamos en una librería del sistema, este exploit funcionara únicamente para el sistema que se esta utilizando. Por decirlo de alguna manera el exploit dependerá del S.O en cuestión(teniendo en cuenta lo que mencionaste, versión, sp, idioma etc...)

3)Esto es lo que yo deduzco. Lo lógico seria depender de una librería que haga uso el programa vulnerable, ya que esta se cargara inmediatamente en el momento que se ejecute el programa y como la dirección que contenga el JMP ESP de la librería se le abra asignado en el mismo instante que se carga ya no me importaría saber de antemano la dirección ya que sea cual sea la dirección podrá referenciar SIEMPRE(siempre y cuando no haya ASLR) a la cima de la pila. En este ultimo punto estamos haciendo que el exploit ya no dependa del S.O si no de la aplicación vulnerable en cuestión, de este modo nuestro exploit funcionara haya donde funcione la aplicación saltándonos como digo la dependencia del S.O y ahora la dependencia sera sobre la aplicación asegurándonos así que la explotación se realice con éxito en mas sistemas.

Si no estoy en lo cierto o algo que pongo en este bloque házmelo saber plis...


Espero su respuesta, un saludo!



x64core

Cita de: exploiterstack en  5 Diciembre 2014, 08:43 AM
Hola x64Core,


Haber lo que me quieres decir es que se utiliza JMP ESP por que al machacar el EIP con esa
dirección me llevaría a la cima de la pila para ejecutar el shellcode(en el caso de que la
tenga apuntando a ESP) vale hasta ay creo estar en lo cierto.

Si cuando dices machacar te refieres a establecer el EIP con la dirección de esa instrucción,
entonces es correcto.

Cita de: exploiterstack en  5 Diciembre 2014, 08:43 AM
Con la otra parte que dices, significa que si no tuviera la shellcode apuntando en la cima y
la tuviera en cualquier otro lugar del stack debería de apañarmelas con otro juego de instrucciones
y utilizar la dirección de estas instrucciones para machar el registro EIP para que me lleve al lugar
exacto donde esta la shellcode para que sea ejecutada?

Yo estoy suponiendo que estamos hablando de un escenario donde se logra un stack overflow para
cargar el exploit, a menos que estes introducciendo más valores en la pila ESP apuntará a la shellcode.

Cita de: exploiterstack en  5 Diciembre 2014, 08:43 AM
1)Nunca hay que confiar en las direcciones del stack por que estas direcciones variaran dependiendo
únicamente del programa, contenido etc...Y esto repercutirá en las direcciones que haga uso en el stack.

De ningun programa, no veo razon de porqué considerar por ejemplo el valor 0x1000 como la dirección
de la pila o algo por el estilo.

Cita de: exploiterstack en  5 Diciembre 2014, 08:43 AM
2)Si confiamos en una librería del sistema, este exploit funcionara únicamente para el sistema que se
esta utilizando. Por decirlo de alguna manera el exploit dependerá del S.O en cuestión(teniendo en
cuenta lo que mencionaste, versión, sp, idioma etc...)
Dependerá de la libreria, es posible que el modulo se cargue en el mismo espacio de direcciones de diferentes sistemas operativos.

Cita de: exploiterstack en  5 Diciembre 2014, 08:43 AM
3)Esto es lo que yo deduzco. Lo lógico seria depender de una librería que haga uso el programa
vulnerable, ya que esta se cargara inmediatamente en el momento que se ejecute el programa y como la
dirección que contenga el JMP ESP de la librería se le abra asignado en el mismo instante
que se carga ya no me importaría saber de antemano la dirección ya que sea cual sea la dirección
podrá referenciar SIEMPRE(siempre y cuando no haya ASLR) a la cima de la pila. En este ultimo punto
estamos haciendo que el exploit ya no dependa del S.O si no de la aplicación vulnerable en cuestión,
de este modo nuestro exploit funcionara haya donde funcione la aplicación saltándonos como digo la
dependencia del S.O y ahora la dependencia sera sobre la aplicación asegurándonos así que la
explotación se realice con éxito en mas sistemas.
Supongo que esto ya se resuelve cuando respondí la 2.

Esto se mira simple pero hay que considerar ASLR y DEP.

exploiterstack

#13
Muchas gracias x64Core por responder y pido perdón por tardar en contentar se me liaron unas cosillas,

Una cosa por que dices:

De ningún programa, no veo razón de porqué considerar por ejemplo el valor 0x1000 como la dirección de la pila o algo por el estilo. (Refiriéndote a cualquier dirección de la pila)


Por ultimo si cojo una dirección que apunte a un JPM ESP de una librería propia de la aplicación el exploit seria universal?


Un saludo!

x64core

#14
Cita de: exploiterstack en  9 Diciembre 2014, 11:24 AM
Muchas gracias x64Core por responder y pido perdón por tardar en contentar se me liaron unas cosillas,

Una cosa por que dices:

De ningún programa, no veo razón de porqué considerar por ejemplo el valor 0x1000 como la dirección de la pila o algo por el estilo. (Refiriéndote a cualquier dirección de la pila)


Por ultimo si cojo una dirección que apunte a un JPM ESP de una librería propia de la aplicación el exploit seria universal?


Un saludo!

Eso depende, si la libreria de la aplicación puede ser cargada en una dirección base dinamica entonces no es posible, pero si siempre será cargada en 0x00400000 por ejemplo, entonces sí podes tomar ventaja, aunque las librerias generalmente siempre pueden ser cargadas en una dirección dinamica, es más común mirar a la aplicación en lugar de algún modulo.

exploiterstack

Que pasa si la librería es cargada en una dirección base? en este caso la dirección por que cambiaría?


Espero su respuesta, saludos?

x64core

Cita de: exploiterstack en 10 Diciembre 2014, 08:25 AM
Que pasa si la librería es cargada en una dirección base? en este caso la dirección por que cambiaría?


Espero su respuesta, saludos?
Arreglado, olvide escribir 'dinamica' al final.

exploiterstack

#17
Vale eso también me quedo claro, pero yo no llego a entender por que la direcciones del stack suelen ser dinámicas, ya que en realidad sabiendo el desplazamiento que hay respecto a la dirección base(EBP) podemos obtener la dirección correcta del(ESP) es por eso que no llego a entender por que no se puede confiar en esas direcciones a la hora de apuntar el EIP hacia donde empieza ESP(donde estará la shellcode).

Por favor mas claro...Y como dije necesito una explicación como para tontos :-\

Saludos!

x64core

Cita de: exploiterstack en 10 Diciembre 2014, 09:47 AM
Vale eso también me quedo claro, pero yo no llego a entender por que la direcciones del stack suelen ser dinámicas, ya que en realidad sabiendo el desplazamiento que hay respecto a la dirección base(EBP) podemos obtener la dirección correcta del(ESP) es por eso que no llego a entender por que no se puede confiar en esas direcciones a la hora de apuntar el EIP hacia donde empieza ESP(donde estará la shellcode).

Por favor mas claro...Y como dije necesito una explicación como para tontos :-\

Saludos!

Ya dije porqué la dirección de la pila de un hilo es dinamica y explique una forma de cómo comprobarlo. Acerca de EBP, este no asegura a ser la base de ESP de hecho no podemos asegurar el valor de ningun registro a menos en situaciones muy especificas y dependiendo de qué tipo de valor se encuentre en el registro.

Ahora si aún no entiendes, entonces no encuentro el punto de qué parte es la no entiendes.



dRak0

Es una forma de lograr ejecutar tu codigo, no tiene porque ser asi si o si , son tecnicas.
No soy experto en exploiting en windows , pero en linux , existen tecnicas como ret2libc , que consiste ,muy resumido , en llamar funciones de la libreria libc, permitiendonos bypassear DEP.