¿Puedo leer / escribir valores canarios del registro de% gs?

0

Me gustaría saber si es posible leer (o escribir) los valores canarios del registro% gs.

Si "sí" , cómo; y si "no" , ¿por qué?

También, he estado leyendo en alguna parte que los valores canarios se almacenan en algún tipo de TLS (supongo que es el "Almacenamiento local de subprocesos" ).

¿Alguien puede arrojar algo de luz sobre esto?

    
pregunta Jaydeep 08.10.2013 - 04:09
fuente

2 respuestas

3

Los hilos comparten el mismo espacio de direcciones y código. Sin embargo, para una variable en el almacenamiento local de subprocesos, cada subproceso debe tener su propio valor; por lo que la variable no se puede almacenar simplemente en una dirección fija. Debe haber alguna indirección.

En la CPU x86 de 32 bits, con Linux, se accede a las variables locales de subprocesos a través del registro de segmento %gs , que hasta ahora no había sido utilizado por el código de la aplicación. Los segmentos son un remanente de tiempos más viejos; Linux siempre ha definido que todos los segmentos comiencen en la dirección 0 y se extiendan a más de cuatro gigabytes, permitiendo que el código los olvide por completo. Sin embargo, todavía están allí, y uno de ellos ( %gs ) se reactivó para admitir el almacenamiento de subprocesos locales. De hecho, todos los subprocesos comparten la misma memoria , pero cada subproceso tiene su propio conjunto de valores de registro.

El canario es una ranura en la pila. Su propósito es sobrescribir cuando se produce un desbordamiento, y es probable que el desbordamiento afecte a la dirección de retorno: el valor que se escribe en la ranura debe leerse sin cambios al final de la función. Ese valor específico se elige aleatoriamente al comienzo de cada subproceso, y cada subproceso tiene su propio valor; esto significa almacenamiento local de subprocesos, por lo que el valor canario de un subproceso puede leerse en un lugar fijo en relación con %gs , como lo conoce ese subproceso.

    
respondido por el Tom Leek 08.10.2013 - 13:55
fuente
1

Si su objetivo final es derrotar a la defensa canaria de pila, hay otras formas de cambiar el flujo de control del programa sin siquiera sobrescribir el valor de canario en la pila.

Una de esas formas de hacerlo es mediante la explotación de la vulnerabilidad de la cadena de formato en el programa. La ventaja de usar un exploit de cadena de formato es que (i) no es necesario romper la pila, y (ii) ¡evita la defensa como los canarios de la pila!

Puede obtener más información sobre Explotación de vulnerabilidades de cadenas de formato aquí .

    
respondido por el Rahil Arora 14.10.2013 - 20:59
fuente

Lea otras preguntas en las etiquetas