Cómo funcionan los "punteros de pérdida" para omitir DEP / ASLR

17

Me preguntaba si alguien podría darme algunas pistas sobre cómo funcionan los "punteros con fugas" para eludir el funcionamiento de DEP / ASLR. Leí aquí :

  

La única forma de omitir de forma confiable DEP y ASLR es a través de un puntero   fuga. Esta es una situación en la que un valor en la pila, a un nivel confiable   ubicación, se puede utilizar para localizar un puntero de función utilizable o ROP   artilugio. Una vez hecho esto, a veces es posible crear un   Carga útil que pasa por alto de manera confiable ambos mecanismos de protección.

cómo se logra esto es como un misterio para mí. Tengo un desbordamiento de búfer ... así que puedo sobrescribir hasta el EIP y los contenidos de la pila ... Tengo un puntero de función confiable o un puntero de código en la pila, y sé dónde está almacenado ... también si conozco esta ubicación ... ¿cómo Pongo esta dirección en EIP? No puedo controlar la secuencia de ejecución si no puedo cambiar el EIP a esa ubicación confiable

    
pregunta John Smith 22.10.2012 - 20:55
fuente

2 respuestas

13

"Leaky Pointers" o más comúnmente conocido como "Dangling Pointers" es útil para crear una cadena de ataque para evitar un sistema de seguridad en capas.

La idea detrás de DEP es que estás haciendo que las regiones de la memoria no sean ejecutables, por lo que no se puede ejecutar el código de shell en esta área. Solo el DEP es realmente fácil de omitir, solo puede volver a lib, y llamar a cualquier función que desee, system() es un favorito.

Sin embargo, bajo Windows, las bibliotecas habilitadas para ASLR tendrán un espacio de memoria aleatorio, por lo que el atacante no sabrá la la dirección de memoria de la función system() , y allí no se puede llamar. La idea detrás de ASLR es que no importa si puedes controlar el EIP si no sabes a dónde saltar.

Ser capaz de leer la ubicación de una región de memoria aleatoria socava la protección de ASLR, porque ahora tiene una ubicación de salto confiable. Esto se puede lograr a través de una amplia variedad de métodos. El uso de un desbordamiento de búfer para simplemente sobrescribir el terminador nulo y leer más allá del final de una matriz se ha utilizado en pwn2own contra IE. Pero realmente la técnica más común es utilizar un Dangling Pointer que se puede usar para leer / escribir o incluso ejecutar una ubicación de memoria válida a pesar de ASLR.

Incluso con ASLR, no todas las ubicaciones de memoria son aleatorias. De hecho, el binario ejecutable tiene un diseño predecible, por lo que puede usar el ejecutable contra sí mismo en una ROP Chain . Sin embargo, a veces es difícil encontrar gadgets ROP útiles, especialmente si el binario de destino es muy pequeño. Si no puede crear una cadena de ROP útil, entonces una vulnerabilidad de divulgación de memoria, como un puntero colgante, es un excelente método de ataque. Es importante tener en cuenta que ASLR solo aleatoriza la ubicación de la página (los primeros bytes de la dirección de memoria), si puede poblar una región dentro de esta página con su código de shell, es posible que pueda ejecutar su código de shell con precisión utilizando la memoria filtrada. diríjase como una base y luego, con suerte, su código de shell se encuentra en algún desplazamiento de esta ubicación aleatoria.

El uso de cadenas de vulnerabilidades de manipulación de memoria es inusualmente solo posible dentro de un entorno de scripting, como JavaScript.

    
respondido por el rook 22.10.2012 - 21:46
fuente
5

ASLR implica aleatorizar la ubicación de los objetos en la memoria. Por ejemplo, el montón se puede mover a un desplazamiento aleatorio en la memoria.

Si de alguna manera logras conocer la dirección de un objeto en el montón, entonces obtuviste mucha información sobre la ubicación del montón en la memoria. Esto puede ser suficiente para permitirte predecir la ubicación de otros objetos en el montón. En ese punto, la aleatorización de ASLR se vuelve inútil. Por lo tanto, las vulnerabilidades de divulgación de información que revelan el valor de un puntero (su dirección) se pueden usar para subvertir ASLR.

¿Cómo se puede filtrar la dirección de un puntero? Una forma es a través de una cadena de formato de vulnerabilidad. Supongamos que haces esto de esta manera:

printf(msg);

donde msg es un mensaje controlado por el atacante y donde el atacante puede leer la salida estándar. Luego, el atacante puede especificar que el mensaje debe ser la cadena "%d" , y esto revelará el valor de algunos datos aleatorios en la pila, que bien podría ser un puntero válido. (¿Por qué? Porque printf() piensa que pasaste otro argumento y busca en la pila para encontrar e imprimir el valor de ese argumento adicional. No tiene idea de que en realidad no pasaste otro argumento y en realidad está rastreando a través de la memoria no relacionada .)

Hay otras formas en que se puede filtrar este tipo de información, pero cuando puede, a menudo se puede omitir ASLR. Una vez que puede omitir ASLR, puede usar técnicas estándar para explotar una vulnerabilidad de saturación de búfer. Por lo tanto, este tipo de vulnerabilidades de divulgación de información no es algo bueno que tenga en su aplicación.

    
respondido por el D.W. 23.10.2012 - 06:55
fuente

Lea otras preguntas en las etiquetas