GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué establece fs:[0x28] (canario de pila)?

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 quién llama arch_prctl , busquemos un backtrace:

(gdb) catch syscall arch_prctl
Catchpoint 1 (syscall 'arch_prctl' [158])
(gdb) r
Starting program: <program path>

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 sucede todo.

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, que fs:[0x28] apunta a:

  • Inicialización del valor de protección de la pila
  • Escritura de valor de guardia de pila, más detallada

Y 0x28 es el desplazamiento del 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.


Linux
  1. ¿Qué hace “lc_all=c”?

  2. Que hace ?

  3. ¿Qué significa el valor del símbolo del comando nm?

  4. ¿Qué hace ulimit -s ilimitado?

  5. Imprime el valor del puntero de la pila

¿Qué es LAMP Stack?

¿Qué es SSH?

¿Qué es SFTP?

¿Qué significa nulo en Linux y Computación?

¿Qué viene en GNOME 42?

¿Qué es el analfabetismo digital?