You are on page 1of 9

2012

BUFFER OVERFLOW 2

Javier Garca Cambronel SEGUNDO DE ASIR 31/01/2012

[BUFFER OVERFLOW 2] 31 de enero de 2012

PRCTICA FUNCIN OCULTA CREAMOS UN PROGRAMA VULNERABLE

DESARROLLO DE LOS PASOS


CDIGO DEL EXPLOIT EXPLOTANDO LA VULNERABILIDAD

SALTANDO SISTEMA DE AUTENTIFICACIN BUFFER OVERFLOW CREAMOS UN PROGRAMA VULNERABLE DESARROLLO DE LOS PASOS EXPLOTANDO LA VULNERABILIDAD

SEGUNDO DE ASIR

Pgina 1

[BUFFER OVERFLOW 2] 31 de enero de 2012

PRCTICA FUNCIN OCULTA


CREAMOS UN PROGRAMA VULNERABLE Compilamos el siguiente ejemplo de cdigo fuente vulnerable escrito en c. #include <stdio.h> #include <string.h> int main(int argc,char **argv){ char buff[5] = "Datos"; strcpy(buff,argv[1]); printf("%s\n\n",buff); return 0; } int CodigoMaligno(){ printf("Hola, soy el bicho!!!"); //este mensaje nunca se ejecutar return 0; } En una ejecucin normal del programa la funcin CodigoMaligno()nunca se ejecutara. Aprovechando la vulnerabilidad de la funcin strcpy(), vamos a hacer que se ejecute. Una vez que lo hemos compilado con el compilador en c que hayamos escogido, comprobamos que funciona perfectamente. Para ello nos situamos sobre la ruta donde se encuentra el archivo, nosotros lo hemos guardado como vulnerable.c y el ejecutable que nos ha creado es vulnerable.exe Lo hemos guardado en mis documentos asique abrimos la consola y escribimos el comando que vemos en la imagen

Como hemos visto en el cdigo el programa necesita de argumentos, para que estos sean ejecutados, tenemos que poner el nombre del archivo.exe a ejecutar en este caso vulnerable y seguido una cadena de caracteres en este caso hola, como vemos el programa funciona perfectamente.

SEGUNDO DE ASIR

Pgina 2

[BUFFER OVERFLOW 2] 31 de enero de 2012


DESARROLLO DE LOS PASOS Cargamos en Ollydbg el ejecutable obtenido (en este caso llamado vulnerable.exe) y localizamos la direccin de memoria donde comienza la funcin CodigoMaligno().

Revisando el cdigo desensamblado del programa vulnerable.exe podemos ver que la 1 instruccin (push EBP) reside en la direccin 004012FD. Esa es la direccin que se debe cargar en el registro EIP para que la funcin CodigoMaligno se ejecute. Para ello debemos calcular cuantos caracteres debemos introducir en el array buff[] para desbordarlo y sobrescribir EIP. Calculamos del nmero de caracteres necesarios para sobrescribir el EIP. Primero vemos los valores de los registros de nuestro programa normalmente

Nos vamos a la barra de herramientas Debug y seguidamente a arguments Probamos con 20 aes pues en principio el buffer solo espera cinco caracteres asique seria suficiente

Una vez que hemos pulsado en aceptar lo siguiente que debemos hacer es pulsar en restart y despus en run todo ello desde el men de debug, vemos que no hemos sobrescrito EIP con ninguna de las aes.

SEGUNDO DE ASIR

Pgina 3

[BUFFER OVERFLOW 2] 31 de enero de 2012


Como la prueba anterior no ha sido fructfera vamos a probar ahora con 30 aes

Ahora si, podemos ver que el EIP se ha sobrescrito con dos aes desbordando la pila (stack overflow). As pues necesitaremos 28 bytes, ms los tres correspondientes a la direccin a la queremos que apunte 4012FD para lograr que EIP contenga la direccin de comienzo de la funcin que queremos ejecutar.

CDIGO DEL EXPLOIT Escribimos un sencillo programa en c que contenga una nica instruccin: la llamada al sistema (Windows) que permita ejecutar el cdigo vulnerable pasndole como argumento los 28 bytes (p.ej. aes) ms la direccin de memoria de comienzo de la funcin CodigoMaligno le indicamos que en Hexadecimal y puesta al revs. Guardamos el siguiente cdigo en c y lo compilamos. /* exploit */ int main () { system("vulnerable.exe aaaaaaaaaaaaaaaaaaaaaaaaaaaa\xFD\x12\x40\x00"); } EXPLOTANDO LA VULNERABILIDAD Una vez compilado, desde la consola, nos situamos en la direccin donde se encuentra el exploit, en este caso Mis documentos y escribimos el nombre del .exe del exploit, veremos que hemos ejecutado una funcin oculta del programa que no se debera ejecutar pues nunca el propio programa hace la llamada a dicha funcin.

SEGUNDO DE ASIR

Pgina 4

[BUFFER OVERFLOW 2] 31 de enero de 2012

SALTANDO SISTEMA DE AUTENTIFICACIN BUFFER OVERFLOW


CREAMOS UN PROGRAMA VULNERABLE Lo primero que hacemos es crear un programa Vulnerable, este programa presenta un Buffer Overflow que puede ser explotado para saltarse un "proceso de autenticacin". #include <stdio.h> int main(){ char clave[] = "Asir2012"; char password[10]; while (1){ printf("Ingrese el codigo de Seguridad --> "); scanf("%s", password); if (strcmp(password, clave) == 0 ){ break; }//End If }//End While

printf("\nAcceso concedido... \n\n");

system("Pause"); //Envio de Pause al CMD return 0; //Retorno cuando se termina el main }//End main

SEGUNDO DE ASIR

Pgina 5

[BUFFER OVERFLOW 2] 31 de enero de 2012


DESARROLLO DE LOS PASOS Una vez que compilamos el cdigo en c con el compilador que queramos, en mi caso Codeblocks lo guardamos con el nombre que queramos, en mi caso vulnerable2 comprobamos que el cdigo funciona, para ello abrimos la consola y nos situamos en la direccin donde se ha guardado el programa escribimos el nombre con el que hemos guardado el programa y este se ejecutara. Como podemos ver el programa de validacin funciona perfectamente y hasta que no introducimos la contrasea correcta Asir2012 no nos da acceso

Si ejecutamos el cdigo, bsicamente tendremos un prompt que nos pide la contrasea y que no nos permite el acceso al resto de funcionalidad (en este caso ninguna, es solo un ejemplo). Sin embargo, podemos observar que la funcin scanf recoge la cadena que introduzcamos por teclado sin tener en consideracin su longitud, por lo que si introducimos una cadena de ms de los 10 caracteres que tenemos reservados se producir un Buffer Overflow.

SEGUNDO DE ASIR

Pgina 6

[BUFFER OVERFLOW 2] 31 de enero de 2012


EXPLOTANDO LA VULNERABILIDAD Hay que entender una cosa antes de recurrir a programas como OllyDBG y esque si aqu la contrasea est limitada a 10 caracteres y que la funcin scanf va a recoger todo lo que le metamos. Esto no es problema cuando se meten cadenas de la longitud esperada como cuando hemos probado el programa por ejemplo javier, Garcia, Cambronel. Son siempre dos direcciones de memoria consecutivas, la contrasea introducida y con la que se valida. j A a s v i i r e 2 r 0 /0 1

/0

Sin embargo, que pasa cuando introducimos ms de 10 caracteres? Comprobemos primero lo que pasa en memoria con este esquema, es decir, como vemos lo que pasa es que la direccin de memoria donde se guarda la cadena que introducimos para compararla con la contrasea sobrescribe a esta y finalizndola con /0. 1 1 2 /0 3 i 4 r 5 2 6 0 7 1 8 2 9 /0 0

Entonces comprobamos a saltarnos el sistema de autentificacin insertando los mismos valores que en el esquema teniendo en cuenta que con introducir el nmero uno, nos tendramos que autentificar y vemos que as es.

SEGUNDO DE ASIR

Pgina 7

[BUFFER OVERFLOW 2] 31 de enero de 2012


CONSIDERACIONES DE LA PRCTICA 2: no he conseguido nada ms que averiguar el offset de la dll necesaria y unos mil errores al intentar compilar los demas archvisvos necesarios, cambiando las cosas que en principio hay que cambiar, no he utilizado dev c++ porque ya se dice en la prctica que directamente no va, He utilizado Code blocks

SEGUNDO DE ASIR

Pgina 8

You might also like