Problema al intentar explotar buffer overflow

Iniciado por Vannox991, 3 Enero 2021, 22:10 PM

0 Miembros y 3 Visitantes están viendo este tema.

Vannox991

Buenas! Estoy intentando desarrollar un exploit para una vulnerabilidad de un buffer overflow basado en SEH en una aplicación para Windows. Pero me encontré con el siguiente problema;  No encuentro ninguna dll sin safe seh, por lo que no puedo utilizar ninguna dll a mi favor.
Sólo el ejecutable no tiene la protección safe seh, pero todas las direcciones de este comienzan con 0x00, por lo que cuando paso cualquier dirección de estas por el payload sencillamente llegan mal escritas.

Realmente no se como seguir, agradecería mucho si alguien me puede hechar una mano con esto.

Gracias!

MCKSys Argentina

Hola!

Qué binario es? Puedes dar más info? Quizás puedas hacer un shellcode que sólo necesite 1 dirección del ejecutable y la misma pueda pasarse al final del shellcode (para que el 0x00 se tome como fin de string).

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vannox991

Cita de: MCKSys Argentina en  4 Enero 2021, 13:34 PM
Hola!

Qué binario es? Puedes dar más info? Quizás puedas hacer un shellcode que sólo necesite 1 dirección del ejecutable y la misma pueda pasarse al final del shellcode (para que el 0x00 se tome como fin de string).

Saludos!


Buenas! Gracias por su respuesta!
Lamentablemente no puedo dar más información sobre el programa ya que la vulnerabilidad la descubrí yo, por lo que se trata de un 0day...

Intentaré explicar mejor el problema:
Este problema me lo encuentro cuando tengo que sobreescibir el SEH Y apuntar hacia las instrucciones pop, pop, ret (instrucciones que las tengo que sacar De alguna dll). Como digo no logró hacer esto ya que todas las dll según me indica el comando !mona modules se encuentran protegidas con safeseh por lo que no logró hacer que el seh apunte a Estas direcciones de estas dll...
Si consigo sobreescibir el seh con éxito, pero Cuando se intenta dirigirse estas direcciones donde se encuentran las instrucciones pop, pop, ret  sencillamente se me genera una excepción causada supongo por el safeseh. Entonces sencillamente no puedo usar ninguna dll. Únicamente el mismo ejecutable me figura sin safe seh, pero este tampoco consigo usarlo con éxito ya que todas las direcciones del ejecutable comienzan con 0x00 por lo que por un motivo que desconozco el seh se sobreescribe mal (llega bien toda la dirección exceptuando por la parte de la misma que contiene el 00)

Es de mis primeras veces intentando explotar un buffer overflow por lo que no soy un experto en el tema. Tampoco entiendo al 100% la teoría por lo que es posible que haya cometido un montón de errores tratando de explicarme, pero creo que ya se entiende mejor mi problema...

Gracias!

MCKSys Argentina

Hola!

Prueba colocando todas A'es en el buffer y en el último DWORD pon la dirección del pop-pop-ret del exe (invertida, por supuesto.). El 0x00 final debería tomarse como fin de string y escribirse en el stack.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vannox991

Cita de: MCKSys Argentina en  5 Enero 2021, 01:21 AM
Hola!

Prueba colocando todas A'es en el buffer y en el último DWORD pon la dirección del pop-pop-ret del exe (invertida, por supuesto.). El 0x00 final debería tomarse como fin de string y escribirse en el stack.

Saludos!

Buenas!

Acabo de intentar lo que dices, pero me da otro problema...
En la "A" número 336 (que es donde se sobreescibe) coloco como me indicas la dirección de la secuencia de comandos pop, pop y ret del ejecutable y luego de eso termino la Sting, paso la String por el programa y se sobreescibe con la dirección correcta... Pero el problema ahora es que la cantidad de caracteres no consigue generar el buffer overflow correctamente, osea que EIP no logra apuntar a la dirección del pop, pop y ret... para que esto suceda me veo obligado a agregar mas valores de "A" al final de la Sting, por lo que volvemos al mismo problema de antes; se sobreescibe el EIP con el valor de la dirección mal escrita (Sale toda la dirección bien menos la parte del 0x00)

Se le ocurre alguna idea?

Gracias por la ayuda!

Un saludo.

MCKSys Argentina

Hola!

No coloques las A'es al final, agrégalas en el medio. Lo último del buffer que pasas siempre debe ser la address del pop-pop-ret.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vannox991

Cita de: MCKSys Argentina en  6 Enero 2021, 16:29 PM
Hola!

No coloques las A'es al final, agrégalas en el medio. Lo último del buffer que pasas siempre debe ser la address del pop-pop-ret.

Saludos!

Buenas!

Claro, es lo que he intentado; lleno de letras A hasta completar los 332 bytes necesarios para producir el buffer overflow y ahí coloco la dirección del pop pop ret y termino la Sting... Con esto logro que se sobreescriba con la dirección correcta pero por algún motivo el buffer overflow no se produce correctamente. Para que el buffer overflow suceda, por algún motivo necesito agregar mas caracteres después de la posición donde se sobreescibe el Seh...

La Sting que me mencionas sería algo asi: A*332 + nSEH + SEH
Esta Sting consigue sobreescibir con éxito el seh pero por algún motivo el buffer overflow no tiene éxito.

Esta es la Sting que si consigue el buffer overflow, pero con la dirección escrita:  A*332 + nSEH + SEH + A*300

Como se puede apreciar en realidad necesito mas de 600 bytes para que suceda el buffer overflow correctamente, cantidad de bytes que es bastante mayor que la posición donde se sobreescibe el SEH

Espero se haya entendido

Gracias y un saludo!

MCKSys Argentina

Hola!

Debugea el programa y pon un BP en el 1er pop al que retornas. Así podrás ver qué es lo que está pasando.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."