Error en Buffer Overflow

Iniciado por Lodos76, 27 Febrero 2014, 17:43 PM

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

Lodos76

Cita de: soez en 28 Febrero 2014, 23:14 PM
Pon un bp en 00401032 y aprieta run y sacale imagen cuando pare. Te pongo aqui este ollydbg parcheado para que no detecte el IsDebuggerPresent (No me acuerdo si era el parcheado 4 o 5 si eso avisa) por ir eliminando posibilidades. Aunque este DEP activado debería parar en strcpy y ya después se ve. Si, deberias destildar todas las excepciones, puedes mirar la pestaña L log para ver que ha pasado también.

http://ricardonarvaja.info/WEB/OTROS/HERRAMIENTAS/L-M-N-O-P/Parcheado%204.rar


Lo que no sé es por qué Olly no me coloreaba y marcaba dónde estaba la llamada a strcpy.

Lo que me pediste:




He entrado al CALL y creo que hace un loop muchas veces para comparar muchas veces, y luego se va a IsDebuggerPresent y continua normal y tal, pero luego presiono run y me  sale el exitcode C0000409 (termina), y la pila no la he visto con muchos 41414141 (no he visto ningún 41)...

soez

#11
Con paciencia, tienes que parar justo cuando en la pila te salga algo asi ojo lo estoy poniendo a boleo pero es algo así, saca imagen.

| call to strcpy
| src = 00331274
| dst = 0012FF28

He visto en tus imagenes que el buffer se ha copiado con exito en la pila asi que habrá pasado por ahí, aunque que no te pare en strcpy al darle a run me parece muy raro.

Puede ser que no te este marcando strcpy por tener alguna opción desactivada..
01001010 01100001 01110110 01101001 01100101 01110010

.:UND3R:.

Cita de: Lodos76 en 28 Febrero 2014, 23:17 PM
Whaaat? ¿Desmarqué? ¿Cómo hago todo eso? No me importa leerme todo lo que me pases, quiero aprender.

He buscado por "desmarcar saltos debugger", "desmarcar jmp debugger" (también en inglés) y no sale nada que me pueda servir.

Y perdón, ahora estoy en SP3, pensé que no se activaría solo... Ya está DEP desactivado.

Que felicidad, leer eso.

Para colorear, debes hacer clic derecho e ir a Aparence, luego en hightlight poner light jumtp and calls, no recuerdo muy bien, en cuanto a las excepciones debes irte a options, debugger optiones y dentro de esta opción te vas a la pestaña Exceptions dentro de ella deberías destildar todo, aunque precisamente es Memorya access violation, ya que es esa excepción la que se genera al sobre-escribir el EIP.

Deja terminar una parte del tutorial de corelan (estoy estudiando al igual que tú, en realidad repasando pero a full) e intento ayudarte, saludos.

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

soez

Cita de: .:UND3R:. en  1 Marzo 2014, 00:01 AM
aunque precisamente es Memorya access violation, ya que es esa excepción la que se genera al sobre-escribir el EIP.

+1
01001010 01100001 01110110 01101001 01100101 01110010

.:UND3R:.

Lo revisé y al parecer debe haber sido compilado con alguna opción extraña, no sé en realidad, cuando lo probé compilando con gcc sin nada extraño, funcionó sin problemas.

Nota: vuln1.exe tiene SafeSEH ON, aunque no debería afectar en nada ya que no estamos sobre-escribiendo el SEH.

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

Lodos76

Primero que nada, muchas gracias por la ayuda que me estáis dando. Me quiero dedicar a la seguridad pero nunca he podido completar ningún exploit por cosas de estas...

Hecho:
1. Jumps'n'calls coloreados (pero me refería a que no veía ningún call que ponga a la derecha strcpy funtion, como pasa con las otras funciones de las DLLs de Windows).
2. Destildadas todas las excepciones (sólo tenía tildada la opción "ignore memory access violations in KERNEL32").

¿Compilado con alguna opción extraña? Qué raro... sólo lo compilé como código C (cl.exe /TC vuln1.c).
Aunque con gcc creo que va bien, el problema es compilar con MCV++.

Respecto a esto:
| call to strcpy
| src = 00331274
| dst = 0012FF28

¿Te refieres al desensamblado, no a la pila, verdad?
Bueno, abro vuln1.exe en el OllyDbg parcheado contra IsDebuggerPresent, pongo un breakpoint en strcpy y F9.
Vale, ahora se detiene el programa en:  00401032 - CALL 0040150
F7 (entro en el CALL)
Ejecuto algunas instrucciones y entro en el bucle donde se copian los carácteres (podríamos decir que está ejecutando la función strcpy)
Ejecuto unas cuantas veces el bucle y esta esto es lo que veo

Continúo ejecutando el bucle --> Continúa sobreescribiéndose la pila

Continúo ejecutando el bucle hasta el JE SHORT 004010E9 que esta vez NO coge, y si yo he introducido 90 As, en la pila veo 22 valores 41414141 en la pila (aunque 90As/4Bytes=22.5 direcciones con 41414141, no sólo 22, pero bueno). Imagen de donde me encuentro ahora:


Continúo ejecutando y ya se llena el 0.5 que faltaba en la pila (byte,byte,41,41). Me encuentro en  00401041 - CALL 0040120D
Lo cojo! Entro al call a ver qué pasa ;)
Veo muchos MOVs de registros a direcciones que me quitan mis 41414141 de la pila, sigo ejecutando, hago un F8 (ejecutar sin entrar) al CALL de IsDebuggerPresent y sigo ejecutando instrucciones.
Bien, me veo un CALL, y después POP ECX y PUSH 0, luego SetUnhandlerExceptionFilter, luego UnhandledExceptionFilter,ExitCode=C0000409, luego GetCurrentProcess y TerminateProcess, así que entro a ese call a ver qué pasa.
Ese CALL contenía un AND y una instrucción RET, pues nada, sigo ejecutando y termina el programa.


¿Y ahora qué? :/

soez

De nada para eso estamos. Me refería a la pila no al desensamblado, me interesa más que enseñes la pila. Justo cuando te pares en la función strcpy antes de entrar saca imagen para ver el buffer disponible que te queda para pisar el return, etc..
01001010 01100001 01110110 01101001 01100101 01110010

Lodos76

Cita de: soez en  1 Marzo 2014, 18:49 PM
De nada para eso estamos. Me refería a la pila no al desensamblado, me interesa más que enseñes la pila. Justo cuando te pares en la función strcpy antes de entrar saca imagen para ver el buffer disponible que te queda para pisar el return, etc..


soez

Me parece que te hacen falta 76 Aes justo para pisar el return, pruébalo y comenta el resultado, si te quita la función Aes de la pila etc. Paciencia ya saldrá.
01001010 01100001 01110110 01101001 01100101 01110010

Lodos76

Cita de: soez en  1 Marzo 2014, 22:10 PM
Me parece que te hacen falta 76 Aes justo para pisar el return, pruébalo y comenta el resultado, si te quita la función Aes de la pila etc. Paciencia ya saldrá.

Abro Olly parcheado
Arguments -> 76As
Restart
Pongo un BP en el CALL a strcpy (00401032). Pero una pregunta, si yo hago Search for --> Name in all modules, busco strcpy y le pongo un breakpoint, me pone un breakpoint a 7C90248D, no a 0040120D. Entonces, ¿cómo supiste que tenía que hacer un breakpoint a 0040120D a partir del breakpoint a la otra dirección?
RUN
Entro al CALL strcpy y se pushea 0012FF1C - RET ADDRESS 00401037
Continúo ejecutando el CALL
Se ponen todas las As en la pila y llego al JE SHORT que no coge el salto:



Ahora llegamos a JE SHORT 00401140, y entro a ver qué ocurre dentro
Ejecuto la primera instrucción, que era un MOV, y ahora los dos ASCII "AAAA..." que había en la pila tienen la misma longitud
Ejecuto algunas instrucciones hasta llegar a una instrucción RET, entonces la ejecuto y el RET ADDRESS 00401037 se quita de la pila.
Ahora estoy así:


Ejecuto ADD ESP,8
y desaparecen los dos ASCII "AAAA..." que había en la pila

Entro al último CALL (CALL 0040120D), continúo ejecutando y llega SUB ESP,328
lo ejecuto y desaparecen todos los 41414141 de la pila :/


Salimos del CALL y unos cuantos CALLs e instrucciones después salimos del programa con nuestro querido ExitCode C0000409