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:
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é?