Ejemplo de flujo de búfer en Linux de 64 bits

0

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?

    
pregunta Matthew 04.01.2018 - 20:37
fuente

1 respuesta

1

Se está ejecutando en protección de memoria , específicamente el bit NX . En los sistemas modernos, la memoria se marca normalmente como datos (y, por lo tanto, se puede leer y escribir) o como código (y, por lo tanto, se puede leer y ejecutar). Intentar escribir en un área de código o ejecutar un área de datos activará un SEGURO.

    
respondido por el Mark 04.01.2018 - 22:26
fuente

Lea otras preguntas en las etiquetas