Estoy intentando aprender sobre desbordamientos de búfer. He escrito un programa en C simple que llama a una función llamada checkpw()
que asigna una matriz de caracteres de 10 bytes. Cuando analizo el código de operación, veo que realmente asigna 16 bytes en la pila.
Mi objetivo era desbordar ese búfer y escribir sobre la dirección del puntero de retorno, lo que he hecho con éxito. Lo he señalado un poco más abajo en el búfer donde tengo el código de shell, donde la primera instrucción es xor eax,eax
.
Durante el desmontaje de GDB puedo si
paso a paso a través de los códigos de operación con éxito hasta que el rip (puntero de instrucción) apunte exactamente donde quiero que apunte (0x00007fffffffde40).
Incluso veo =>
cuando examino esa ubicación de memoria con x/i 0x00007fffffffde40
que luego muestra el código de operación xor eax,eax
.
El problema es tan pronto como me involucro en la siguiente instrucción con si
, obtengo un SEGFAULT.
Cuando compilé el programa, me aseguré de incluir la configuración de switch -fno-stack-protector
, y también realicé echo 0 > /proc/sys/kernel/randomize_va_space
Aparte de eso, estoy atascado. ¿Por qué obtengo un SEGURO en lugar de ejecutar el xor?