Compruebe la protección de la pila en la fuente del kernel de Linux. El kernel inicializa el registro gs
en una estructura percpu, que contiene un valor aleatorio que está destinado a ser utilizado como stack canary. Este canario de pila está en el desplazamiento 20 (0x14) para programas de 32 bits. Es aleatorio para cada proceso para evitar que el malware pueda confiar en que siempre tenga el mismo valor.
El 0x33 es en realidad un índice en una tabla en el kernel, a la que no tiene acceso, por lo que no tiene sentido desde la tierra de los usuarios. La memoria virtual que forma la estructura de percpu se asigna a la memoria física "en algún lugar" a través de gs y el índice de la tabla del kernel al que se asigna gs, pero esta memoria física no se asigna a ninguna dirección que pueda direccionar. "normalmente", es decir, a través de los segmentos cs / ds / ss "normales".
Cuando busca en Google registros de segmento, puede encontrar información que dice "el registro de segmento se desplaza a la izquierda 4 bits, luego agregado al desplazamiento, para dar como resultado la dirección real ", pero eso se aplica solo al modo real . Linux siempre ha utilizado el modo protegido . Puede encontrar información más detallada sobre los segmentos en modo real y protegido aquí.
Para leer el valor, hay una instrucción push gs
que puede usar . También hay un pop gs
. Pero, como se mencionó anteriormente, conocer el valor no lo ayudará, y establecer el valor en cualquier cosa probablemente resultará en una falla de segmentación.