¿Cómo llevar esto al desbordamiento de búfer?

8

Estoy tratando de entender el desbordamiento del búfer, y estoy trabajando con un simple código, como se muestra a continuación.

#include <stdlib.h>
#include <stdio.h>
#include <string.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;
}

Comprendo que necesito inyectar el código de shell en "badfile", supongo que creo un archivo bad como este:

char buffer[517];
FILE *badfile;
memset(&buffer, 0x90, 517);
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);

¿Lo inyecto en el índice 12 del búfer []? Estoy enfrentando un problema con eso. Pero creo que es porque no es la posición de retorno. ¿Tengo que calcular la posición de retorno? Gracias.

    
pregunta nubela 09.10.2012 - 08:08
fuente

3 respuestas

8

No, no del todo.

Hay dos cosas en las que centrarse:

  • Sobrescribiendo la dirección de retorno. Debe averiguar qué bytes del archivo terminarán sobrescribiendo la dirección de retorno. Supongamos que estos son los bytes 20-23 del archivo (por ejemplo).

  • La ubicación del shellcode. Debes poner tu código de shell más adelante en el archivo (por ejemplo, cerca del final). Luego debe predecir en qué dirección se cargará el código de shell en la memoria. Supongamos que A es la dirección donde se cargará el shellcode en la memoria. Debe conocer esta dirección, porque es lo que debe usar para sobrescribir la dirección de retorno.

Una vez que conozca ambos, estará listo para comenzar. Almacena el valor A en los bytes 20-23 del archivo y el código de shell más adelante en el archivo donde decidiste ponerlo.

Para resolver estas dos cosas, deberás mirar el diseño de la pila.

  • Primero, encuentre el desplazamiento entre la ubicación donde aparece el inicio de str en la pila y la ubicación donde aparece la dirección de retorno. Este desplazamiento le indica qué bytes del archivo terminarán sobrescribiendo la dirección de retorno. Si este desplazamiento es, digamos, 20 bytes, los bytes 20-23 del archivo terminarán por escribirse sobre la dirección de retorno. Para hacer que el ataque funcione, 20 bytes en el archivo que necesita para poner un valor que sea donde desea que salte el programa (la dirección de inicio de su código de shell). Este valor sobrescribirá la dirección de retorno. El valor para poner allí es la dirección A mencionada anteriormente.

  • Segundo, ponga el código de shell incluso más adelante en el archivo, prediga en qué dirección se almacenará el código de shell en la memoria una vez que el archivo se lea en la memoria, y use esa dirección de inicio como valor para sobrescribir el retorno dirección con.

Le recomiendo que lea Smashing The Stack For Fun and Profit de Aleph One. Cuenta con un excelente tutorial para aprender a hacer un aprovechamiento de saturación del búfer de aplastamiento de pila. (Consejo: en los sistemas modernos, asegúrate de desactivar primero el ASLR y el DEP manualmente, para que funcione tu exploit).

    
respondido por el D.W. 09.10.2012 - 10:05
fuente
0

Definitivamente es un desbordamiento de búfer de vainilla. Pero también debe encontrar el desplazamiento exacto donde se almacena el puntero de retorno en la pila. (Sugerencia: definitivamente no es de 12 bytes, considere el EBP guardado que está almacenado). Tiene razón, también debe calcular la dirección de retorno del código de shell que inyecta en el archivo defectuoso. Sin embargo, permítame advertirle, ya que el búfer tiene solo 12 bytes, creo que es difícil inyectar un código de shell de 12 bytes en ese espacio. Mira a tu alrededor para ver si puedes encontrar uno. Pero puede colocar el código de shell en la parte posterior de la pila, ya que el buf en main tiene una longitud de 517 bytes. Esto significa que los 12 bytes principales de su archivo pueden ser basura.

Sugerencias : enlace

Trate el tutorial de video anterior para los desbordamientos de búfer como una biblia para desbordamientos de búfer

Use GDB, trace su código, vigile el puntero de la pila, la pila en sí.

    
respondido por el sudhacker 10.10.2012 - 02:27
fuente
0

Tu búfer es demasiado pequeño para ajustarse al código de shell + dirección de retorno. Hazlo un poco más grande si planeas probar el concepto. Además, puedes poner el código shell en la ENV.

    
respondido por el user41853 12.03.2014 - 08:24
fuente

Lea otras preguntas en las etiquetas