¿Es posible la ejecución de código arbitrario utilizando la sobrescritura GOT con W ^ X habilitado?

0

¿Es posible ejecutar de manera confiable un código arbitrario desde una sola sobrescritura de la Tabla de compensación global cuando W ^ X ¿está habilitado? Por "confiablemente" me refiero a asumir que controlo solo la ubicación señalada por el puntero de instrucción y posiblemente algunos datos no ejecutables en otro lugar.

Por qué pregunto: utilizando el exploit de la Casa de Fuerza demostrado aquí , es posible sobrescribir la memoria arbitraria, lo que hace que el GOT sea un objetivo atractivo para secuestrar el puntero de instrucción. Sin embargo, para hacer que la implementación del desbordamiento del montón funcione (es decir, obtener un shell), el autor tuvo que inyectar el código de shell para señalar desde el GOT. Si W ^ X está habilitado, esta técnica fallará. ¿Hay un método (posiblemente aprovechando ROP / JOP?) Que supere esta limitación? La razón por la que estoy teniendo dificultades con esto es porque en esta explotación solo controlas el puntero de instrucción, no el puntero de pila, por lo que no puedo ver fácilmente una forma de hacer que ROP funcione, y JOP parece requerir el control de múltiples se registra para que funcione (pero para ser honesto, la implementación de JOP todavía está por encima de mi cabeza).

    
pregunta camercu 01.10.2017 - 00:24
fuente

2 respuestas

0

Ciertamente es posible , solo depende de las circunstancias. Como ejemplo de un ataque ret2libc, digamos que el programa toma la entrada del usuario en buffer y luego de haber sobrescrito una entrada GOT, el programa recibe una llamada a strlen(buffer) en algún punto de ejecución. Ahora, si ha pasado '/ bin / sh' en el búfer y ha sobrescrito la entrada para strlen con la dirección libc de system , entonces al hacer la llamada a strlen , '/ bin / sh se colocará convenientemente en la pila como un parámetro para system y se generará un shell - con NX habilitado y sin tener un control explícito sobre el puntero de la pila.

Ahora, esto puede sonar como un ejemplo artificial, pero surge muy a menudo y la diferencia entre 'posible' e 'imposible' es a menudo una artesanía inteligente como esta.

    
respondido por el rhodeo 15.10.2017 - 08:33
fuente
0

W ^ X simplemente evita que las páginas sean ejecutables y de escritura simultáneamente, por lo que una vulnerabilidad de escritura arbitraria no puede modificar las páginas ejecutables. No impone el flujo de control, por lo que cualquier primitiva de explotación que permita la ejecución fuera de orden del código existente puede evitarlo. Otros ataques, como la Programación Orientada a SigReturn, o SROP (en plataformas que son vulnerables a ella) y la Programación Orientada a Loop, o LOP, a menudo son capaces de lograr lo mismo.

Se puede ver un ejemplo de explotación de JOP aquí .

    
respondido por el guest 15.10.2017 - 02:18
fuente

Lea otras preguntas en las etiquetas