Pregunta:
Segmentación en x86 para canarios de pila
user1743
2014-11-13 17:32:51 UTC
view on stackexchange narkive permalink

Acabo de compilar un código C que se lee en la entrada usando gets y desensamblé el código. La plataforma es Ubuntu de 32 bits.

Hay estas 3 líneas que verifican si el valor canary ha sido manipulado.

  0x08048455 < + 33>: mov edx, DWORD PTR [esp + 0x7c] 0x08048459 < + 37>: xor edx, DWORD PTR gs: 0x14 0x08048460 < + 44>: je 0x8048467 >: je 0x8048467 >  / code> y vi que el registro  gs  tenía el valor 0x33.  

Mis preguntas son:

  1. ¿Qué es gs: 0x14 dado que gs es 0x33? ¿Es 0x33 un índice de algo? ¿Es una ubicación de memoria de algún tipo?
  2. ¿Hay instrucciones x86 para mover el valor de gs a cualquier otro registro? ¿O quizás ponerlo en la pila?
One responder:
Guntram Blohm supports Monica
2014-11-13 18:32:28 UTC
view on stackexchange narkive permalink

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.



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...