domingo, 1 de septiembre de 2013

Escribiendo un Exploit ( Buffer Overflow) I

Existen muchos artículos en Internet "de todos los colores y sabores del arcoiris" que explican como funciona el "buffer overlflow" , voy a tratar de explicarlo como me hubiera gustado que me lo expliquen xD.

Antes de entrar a sobre-escribir las direcciones de memoria y buscar un jmp , tenemos que conocer la teoría para llevarlo a la practica.

Comencemos por lo básico que son los registros del procesador, si necesitas saber sobre sistemas de numeración como ser binario , decimal o hexadecimal te sugiero el siguiente enlace.

La forma en que se representa la memoria depende únicamente de la arquitectura del procesador dicho esto existen 2 formas de hacerlo
  • Big Endian: El byte más significativo se representa a la izquierda.De izquierda a derecha).
  • Little Endian: El byte mas significativo se representa a la derecha. Análogamente, de derecha a izquierda
Representación de la dirección de memoria 01234567

EAX , EBX , ECX , ESI , EDI : Son registros multipropositos para usarlo segun el programa.

EAX: Es el registro acumulador cualquier instruccion de retorno la almacena el valor en EAX.

EBX: Este registro es utilizado como manejador o "handler" de ficheros de direcciones de memoria.

ECX: Se utiliza como registro contador , por ejemplo para aplicar un ciclo o loop , cuando ECX llega a 0 el ciclo acaba
ESI & EDI: Son registros que son utilizados para guardar direcciones de memoria.
EIP: Es el registro donde se almacena la dirección de la siguiente instrucción que debe ejecutar el ordenador.

EBP: Es el registro "puntero a base", apunta al elemento mas alto de la pila ; la pila es una estructurara de datos que utiliza el procesador para ayudarse en la ejecución de los programas.

ESP:  Es el registro que apunta a la "cima" , apunta a la direccion de memoria (donde comienza la pila).

NOP: Instrucción en ensamblador que significa "No Operation" , lo único que hace e aumentar en uno el registro de la siguiente instrucción "EIP".

Cabe aclarar que el modo de acceso a la "pila" es LIFO , "last in ;first out" el ultimo en entrar el primero en salir.


¿Que es el desbordamiento de memoria?

Sencillamente se puede definir como un error en nuestro código que no controla correctamente la cantidad de datos que se copian sobre una area de memoria reservada (Buffer).

Si tenemos asignados en un array (independiente del lenguaje de programación) 30 espacios y nosotros "introducimos" 40 espacios en , estamos causando un desbordamiento de memoria por que los asignados son 30 y no 40.

El siguiente código (escrito en C) es vulnerable


#include  
int main (int argc, char **argv)

    char buffer[64];
    if (argc < 2){ 
        printf ("Introduzca un argumento al programa\n");  
        return 0;  acaba
        }
    strcpy (buffer, argv[1])
    return 0; 
}

La funcion principal recibe argumentos como parametro ,reservamos un buffer de 64 espacios continuos en memoria de tipo "char" creando nuestro buffer.

char *strcpy(char *cadena1, const char *cadena2);

La funcion strcpy copia la cadena2 (incluyendo el caracter nulo "\0" en la cadena1) , el gran problema es que no verifica que la cadena2 sea del mismo "tamaño" o menor a la del buffer sobre-escribiendo las direcciones de memoria contiguas generando el desbordamiento.

Creo que para ser la introducción por el momento estamos bien!  , en el proximo post, queda totalmente prohibido la teoria y directo a la practica!

Slds
Related Posts Plugin for WordPress, Blogger...