Está en la página 1de 9

2012

BUFFER OVERFLOW 2

Javier García Cambronel


SEGUNDO DE ASIR
31/01/2012
[BUFFER OVERFLOW 2] 31 de enero de 2012

PRÁCTICA FUNCIÓN OCULTA


CREAMOS UN PROGRAMA VULNERABLE
DESARROLLO DE LOS PASOS
CÓDIGO DEL EXPLOIT
EXPLOTANDO LA VULNERABILIDAD

SALTANDO SISTEMA DE AUTENTIFICACIÓN BUFFER


OVERFLOW
CREAMOS UN PROGRAMA VULNERABLE
DESARROLLO DE LOS PASOS
EXPLOTANDO LA VULNERABILIDAD

SEGUNDO DE ASIR Página 1


[BUFFER OVERFLOW 2] 31 de enero de 2012

PRÁCTICA FUNCIÓN OCULTA


CREAMOS UN PROGRAMA VULNERABLE

Compilamos el siguiente ejemplo de código 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 ejecución normal del programa la función “CodigoMaligno()”nunca se ejecutaría.


Aprovechando la vulnerabilidad de la función “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 código 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 Página 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 dirección de memoria donde comienza la función “CodigoMaligno()”.

Revisando el código desensamblado del programa “vulnerable.exe” podemos ver que la 1ª


instrucción (“push EBP”) reside en la dirección “004012FD”. Esa es la dirección que se debe
cargar en el registro EIP para que la función “CodigoMaligno” se ejecute. Para ello debemos
calcular cuantos caracteres debemos introducir en el array “buff[]” para desbordarlo y
sobrescribir EIP.

Calculamos del número 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
después en run todo ello desde el menú de debug, vemos que no hemos sobrescrito EIP con
ninguna de las aes.

SEGUNDO DE ASIR Página 3


[BUFFER OVERFLOW 2] 31 de enero de 2012

Como la prueba anterior no ha sido fructífera 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, más los tres correspondientes a la dirección a la
queremos que apunte 4012FD para lograr que EIP contenga la dirección de comienzo de la
función que queremos ejecutar.

CÓDIGO DEL EXPLOIT

Escribimos un sencillo programa en c que contenga una única instrucción: la llamada al


sistema (Windows) que permita ejecutar el código vulnerable pasándole como argumento
los 28 bytes (p.ej. aes) más la dirección de memoria de comienzo de la función
“CodigoMaligno” le indicamos que en Hexadecimal y puesta al revés.

Guardamos el siguiente código 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 dirección donde se encuentra el
exploit, en este caso Mis documentos y escribimos el nombre del .exe del exploit, veremos
que hemos ejecutado una función oculta del programa que no se debería ejecutar pues
nunca el propio programa hace la llamada a dicha función.

SEGUNDO DE ASIR Página 4


[BUFFER OVERFLOW 2] 31 de enero de 2012

SALTANDO SISTEMA DE AUTENTIFICACIÓN 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 autenticación".

#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 Página 5


[BUFFER OVERFLOW 2] 31 de enero de 2012

DESARROLLO DE LOS PASOS

Una vez que compilamos el código 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 código funciona, para ello abrimos la consola y nos situamos en la
dirección 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 validación funciona perfectamente y hasta que no


introducimos la contraseña correcta “Asir2012” no nos da acceso

Si ejecutamos el código, básicamente tendremos un prompt que nos pide la contraseña 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 función scanf recoge la cadena que
introduzcamos por teclado sin tener en consideración su longitud, por lo que si introducimos
una cadena de más de los 10 caracteres que tenemos reservados se producirá un Buffer
Overflow.

SEGUNDO DE ASIR Página 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
contraseña está limitada a 10 caracteres y que la función 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 contraseña introducida y con la


que se valida.

j a v i e r /0
A s i r 2 0 1 2 /0

Sin embargo, ¿que pasa cuando introducimos más de 10 caracteres?

Comprobemos primero lo que pasa en memoria con este esquema, es decir, como vemos lo
que pasa es que la dirección de memoria donde se guarda la cadena que introducimos para
compararla con la contraseña sobrescribe a esta y finalizándola con /0.

1 2 3 4 5 6 7 8 9 0
1 /0 i r 2 0 1 2 /0

Entonces comprobamos a saltarnos el sistema de autentificación insertando los mismos


valores que en el esquema teniendo en cuenta que con introducir el número uno, nos
tendríamos que autentificar y vemos que así es.

SEGUNDO DE ASIR Página 7


[BUFFER OVERFLOW 2] 31 de enero de 2012

CONSIDERACIONES DE LA PRÁCTICA 2: no he conseguido nada más que averiguar el offset de


la dll necesaria y unos mil errores al intentar compilar los dem´´as archvisvos necesarios,
cambiando las cosas que en principio hay que cambiar, no he utilizado dev c++ porque ya se
dice en la práctica que directamente no va, He utilizado Code blocks

SEGUNDO DE ASIR Página 8

También podría gustarte