por qué no puedo sobrescribir el marco de pila

3

Actualmente estoy leyendo Gray Hat Hacking The Ethical Hacker's Handbook, Fourth Edition y tengo una pregunta con un ejercicio en el libro. El laboratorio "Lab 10 - 1 Overflow of meet.c" es un laboratorio en el que realizamos un desbordamiento de búfer en el programa. El programa es el siguiente:

//meet.c
#include <stdio.h>   // needed for screen printing
#include <string.h>

greeting(char *temp1,char *temp2){ // greeting function to say hello
   char name[400];    // string variable to hold the name
   strcpy(name, temp2);    // copy the function argument to name
   printf("Hello %s %s\n", temp1, name); // print out the greeting
}
main(int argc, char * argv[]){      // note the format for arguments
   greeting(argv[1], argv[2]);      // call function pass title & name
   printf("Bye %s %s\n", argv[1], argv[2]);   // say "bye"
} // exit program

El libro le informa que compile el código con:

gcc -ggdb -mpreferred-stack-boundary=2 -fno-stack-protector -z execstack -o meet meet.c

No estoy muy seguro de lo que pasa cada argumento al compilador significa que leí en la página del manual que mpreferred-stack-límite intenta alinear el límite de pila en este caso 2 ^ 2 = 4 bytes. He visto la bandera protectora de no pila utilizada anteriormente, así que sé que permite romper la pila y la execstack -z que quiero creer es hacer que los datos sean ejecutables desde la pila (eliminando el bit NX).

Y antes de todo esto, ya deshabilitamos ASLR usando el comando:

echo "0" > /proc/sys/kernel/randomize_va_space

El libro también menciona para deshabilitar lo siguiente:

echo "0" > /proc/sys/kernel/exec-shield
echo "0" > /proc/sys/kernel/exec-shield-randomize

No encontré estos archivos en el directorio especificado, así que no ejecuté el comando. Tenía curiosidad por si esto estaba causando mi problema, así que lo busqué en Google y encontré esta publicación en el foro:

enlace

Pero la publicación del foro indicó que los argumentos que pasamos al compilador ya se encargan de deshabilitar la característica "exec-shield" y la característica "exec-shield-randomize".

Entonces, el problema que tengo es que cuando sigo las instrucciones del libro recibo diferentes resultados del libro.

El libro dijo que el marco de pila se parecería a esto:

                         Function
                         Variable                            Parameters
______________________________________________________________________________
|           |    ESP   |    Name   |   EBP   |   EIP   |   Temp1   |   Temp2  |
-------------------------------------------------------------------------------
Low Mem:               <--------- Stack Grow                         High Mem:
0x11111111                                                        0xfffffff0

Luego cargaron el programa en el depurador GNU con el siguiente comando:

gdb -q meet

Luego colocaron un punto de interrupción en la línea 7:

strcpy(name, temp2);

Se pasó un valor de argumento de desbordamiento usando perl:

(gdb) ejecuta Mr perl -e 'print "A" x 600'

Para eso obtuvieron el siguiente resultado:

Breakpoint 1, greeting (temp1=0x41414141 <Address 0x41414141 out of bounds>,
    temp2=0x41414141 <Address 0x41414141 out of bounds>) at meet.c:7
          printf("Hello %s %s\n",temp1, name); //print out the greeting

Así que escribieron con éxito sobre el registro EIP, los punteros temp1 y temp2 como decía el libro, pero cuando lo probé obtuve esto:

Intenté600,1,000,10,000,ycomopuedesverenlacapturadepantalla100,000A's.Entonces,¿alguienpuededecirmesiestoyhaciendoalgomalymeolvidodedesactivarunafuncióndeseguridadoalgoasí?

InformacióndelSO:

  

Ubunut14.04Linuxubuntu3.19.0-49-generic#55~14.04.1-UbuntuSMPFri  22deenero11:23:34UTC2016i686i686i686GNU/Linux

ACTUALIZACIÓN:

Estossonlosresultadosdellibro:

El estado del libro de que ahora los punteros temp1 y temp2 se sobrescriben y ahora apunta a nulo para mí, esto no sucedió. ¿Por qué?

    
pregunta user1803784 24.02.2016 - 04:49
fuente

2 respuestas

3

Su captura de pantalla muestra que gdb ha alcanzado el punto de interrupción, Temp1 y temp2 aún no se han sobrescrito porque está alcanzando un punto de interrupción en strcpy que detiene la ejecución antes strcpy sobrescribe la pila. Según la imagen de su libro, puede ver que su línea 7 es printf , lo que sucede después de que strcpy corrompe la pila. Intente usar el comando c gdb para continuar. El control EIP se produce en el epílogo, cuando la función regresa.

    
respondido por el wireghoul 24.02.2016 - 11:15
fuente
3

Una nota al margen no está directamente relacionada con el problema:

No estoy seguro de si el libro que está usando es el mejor para comenzar con su desarrollo de pentesting \ exploit. Recomendaría el manual de OSCP o el libro de Georgia Weidman. "Pruebas de penetración Una introducción práctica al hacking"
O puede probar los laboratorios del proyecto SEED .

Ahora no estoy seguro de poder decir lo que está mal sin probar el laboratorio (que intentaré hacer y te volveré a llamar). Sin embargo, puedo decirles que aumentar el tamaño del búfer no siempre es la respuesta. De hecho, a veces corrompe su vulnerabilidad porque su búfer extra largo puede sobrescribir los datos de la función del llamante, lo que hace que la aplicación llame al controlador de excepciones, el cual, si ocurriera, moverá la dirección de la función del controlador de excepciones al EIP, y lo forzará a haga las cosas de una manera diferente para sobrescribir el EIP porque ahora la dirección del controlador de excepciones está en el EIP, no en su búfer.

    
respondido por el HSN 24.02.2016 - 05:37
fuente

Lea otras preguntas en las etiquetas