explotar el desbordamiento del búfer lleva a segfault

20

Estoy intentando explotar la vulnerabilidad de desbordamiento de pila simple. Tengo un código básico en c:

#include <cstring>
int main( int argc, char** argv )
{
        char buffer[500];
        strcpy(buffer, argv[1]);
        return 0;
}

compilado utilizando -fno-stack-protector . Ya he averiguado la longitud del búfer y he sobrescrito con éxito los registros EBP y EIP. Inyecté una gran cantidad de NOP, seguí con este código de shell y finalmente inserté una dirección donde los NOP inyectados son los códigos. se ejecuta.

Ahora el problema. En la imagen adjunta puedes ver la salida de gdb. Si ejecuto mi programa con entrada maliciosa, obtiene un SIGSEGV. Al descargar la dirección 0xbffff880 , puede ver que hay muchos NOP seguidos con el código de shell (cuadro rosa) y, finalmente, con la dirección (cuadro azul).

Pensé que esto funcionaría de la siguiente manera: Al principio, 0x90909090 sy el código de shell se consideran datos simples. Después de estos (más allá del cuadro rosado) hay una dirección 0xbffff880 . Le estoy diciendo a la CPU "hey allí, ahora, ejecute lo que está en 0xbffff880 ". El cpu toma lo que está en la dirección y ejecuta todos los NOP y el shellcode en sí. Sin embargo, eso no está sucediendo y ocurre SIGSEGV.

¿Dónde estoy equivocado?

Estoy intentando lograr esto en la instancia de Virtualbox de Ubuntu 14.04 Linux 3.13.0-39-generic-i686 de 32 bits con ASLR desactivado.

    
pregunta tsusanka 10.11.2014 - 13:10
fuente

1 respuesta

22

Lo más probable es que la dirección de memoria 0xbffff880 no sea ejecutable, pero solo de lectura / escritura. Hay un par de maneras en que puedes superar esto.

  1. Si esa es una dirección de pila, puedes usar -z execstack mientras compilas. Esto esencialmente hará que toda la memoria de la pila sea ejecutable.
  2. Para una solución más robusta, puede escribir el código de shell para llamar a mprotect en la dirección a la que está escribiendo.

Por ejemplo, la siguiente línea marcará la dirección 0xbffff880 como lectura / escritura / ejecutable.

mprotect((void*) 0xbffff880, buffer_len, PROT_READ | PROT_WRITE | PROT_EXEC);

-fno-stack-protector no significa que la pila sea ejecutable. Solo desactiva otras funciones de seguridad como canaries o cookies de pila . Si estos valores se sobrescriben (con un desbordamiento del búfer) cuando se verifican, el programa fallará. Esto no habilitaría la ejecución de su búfer.

    
respondido por el RoraΖ 10.11.2014 - 14:53
fuente

Lea otras preguntas en las etiquetas