Practica buffer overflow
-
Upload
javierasir2012 -
Category
Documents
-
view
243 -
download
0
Transcript of Practica buffer overflow
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 1/9
BUFFER OVERFLOW 2
2012
Javier García Cambronel
SEGUNDO DE ASIR
31/01/2012
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 2/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 1
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
OVERFLOWCREAMOS UN PROGRAMA VULNERABLE
DESARROLLO DE LOS PASOS
EXPLOTANDO LA VULNERABILIDAD
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 3/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 2
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.
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 4/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 3
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 ydespués en run todo ello desde el menú de debug, vemos que no hemos sobrescrito EIP con
ninguna de las aes.
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 5/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 4
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.
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 6/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 5
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
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 7/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 6
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 hemosguardado 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.
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 8/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 7
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.
7/31/2019 Practica buffer overflow
http://slidepdf.com/reader/full/practica-buffer-overflow 9/9
[BUFFER OVERFLOW 2] 31 de enero de 2012
SEGUNDO DE ASIR Página 8
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