Este grupo de trabajo ha estado mucho tiempo buscando para darle espuestas a tu pregunta, te dejamos la soluciones por esto deseamos serte de gran apoyo.
Solución:
Es fácil rastrear esta inicialización, como para (casi) todos los procesos strace
muestra una llamada al sistema muy sospechosa durante el comienzo de la ejecución del proceso:
arch_prctl(ARCH_SET_FS, 0x7fc189ed0740) = 0
eso es lo que man 2 arch_prctl
dice:
ARCH_SET_FS
Set the 64-bit base for the FS register to addr.
Yay, parece que eso es lo que necesitamos. Para encontrar, quien llama arch_prctl
busquemos un backtrace:
(gdb) catch syscall arch_prctl
Catchpoint 1 (syscall 'arch_prctl' [158])
(gdb) r
Starting program:
Catchpoint 1 (call to syscall arch_prctl), 0x00007ffff7dd9cad in init_tls () from /lib64/ld-linux-x86-64.so.2
(gdb) bt
#0 0x00007ffff7dd9cad in init_tls () from /lib64/ld-linux-x86-64.so.2
#1 0x00007ffff7ddd3e3 in dl_main () from /lib64/ld-linux-x86-64.so.2
#2 0x00007ffff7df04c0 in _dl_sysdep_start () from /lib64/ld-linux-x86-64.so.2
#3 0x00007ffff7dda028 in _dl_start () from /lib64/ld-linux-x86-64.so.2
#4 0x00007ffff7dd8fb8 in _start () from /lib64/ld-linux-x86-64.so.2
#5 0x0000000000000001 in ?? ()
#6 0x00007fffffffecef in ?? ()
#7 0x0000000000000000 in ?? ()
Entonces, la base del segmento FS está establecida por el ld-linux
que forma parte de glibc
, durante la carga del programa (si el programa está vinculado estáticamente, este código se incrusta en el binario). Aquí es donde todo sucede.
Durante el inicio, el cargador inicializa TLS. Esto incluye la asignación de memoria y la configuración del valor base de FS para señalar el comienzo de TLS. Esto se hace a través de arch_prctl
llamada al sistema. Después de la inicialización de TLS security_init
se llama a la función, que genera el valor de la protección de la pila y lo escribe en la ubicación de la memoria, lo que fs:[0x28]
puntos a:
- Inicialización del valor de protección de pila
- Escritura de valor de protección de pila, más detallada
Y 0x28
es el desplazamiento de la stack_guard
campo en la estructura que se encuentra en el inicio de TLS.
Lo que está viendo se llama (en GCC) Stack Smashing Protector (SSP), que es una forma de protección contra desbordamiento de búfer generada por el compilador. El valor es un número aleatorio generado por el programa al inicio y, como menciona el artículo de Wikipedia, se coloca en Thread Local Storage (TLS). Otros compiladores pueden usar diferentes estrategias para implementar este tipo de protección.
¿Por qué almacenar el valor en TLS? Como el valor se encuentra allí, los registros CS, DS y SS no pueden acceder a su dirección, lo que hace que sea muy difícil adivinar el valor almacenado si está tratando de alterar la pila de código malicioso.
Sección de Reseñas y Valoraciones
Si tienes algún enigma y capacidad de medrar nuestro reseña puedes añadir una interpretación y con mucho placer lo estudiaremos.