Si, por supuesto jeje:
Código:
#include "milibreria.h"
int check_autethication(char *password){
int auth_f;
char password_buffer[16];
strcpy(password_buffer, password);
if(strcmp(password_buffer, "brillig")==0)
return 1;
else
return 0;
}
int main(int argc, char *argv[]){
if(check_autethication(argv[1])){
printf ("Has conseguido acceder a la zona restringida");
}else
printf ("No puedes entrar aqui");
}
El desbordamiento lo produzco desde la línea de comandos, haciendo uso de perl, y depurando el código veo que una vez llamada a la funcion check_autethication, entre el comienzo de password_buffer y la dirección de retorno hay 24 bytes, con lo cual, miro primero la dirección donde está la instruccion:
printf ("Has conseguido acceder a la zona restringida");
y si la direccion es por ejemplo 0xAAAAAAAA, hago algo tal que así:
user@laptop~#>./programa $(perl -e 'print "\xAA\xAA\xAA\xAA"x10');
pero me da fallo de segmento. Intenté hacer esto mismo en tiempo de depuración pero no sé cómo meter valores hexadecimales en gdb.
----La otra pequeña duda es en estas líneas:
int auth_f;
char password_buffer[16];
según la arquitectura del IA32, las variables se guardan en memoria en orden inverso, es decir, primero password_buffer y luego auth_f(con lo cual podría sobreescribirse por desbordamiento auth_f). El caso es que, ponga las variables en el orden que las ponga, siempre se guarda auth_f encima de password_buffer, haciendo imposible machacar su valor por desbordamiento. Es como un sistema de protección que tiene el compilador. ¿A qué se debe esto?
Gracias, un saludo!
Marcadores