varias preguntas sobre la depuración del kernel de Linux - examen de memoria

4

He leído esto ¿El kernel de Linux usa DEP para ¿Memoria del núcleo?

pero estoy depurando el kernel de Linux (x86_64) en Vmware usando el código auxiliar de vmware. He adjuntado gdb a mi kernel de linux. la versión del kernel es 3.x

y cambié la memoria ejecutable del núcleo de Linux en un solo lugar

(gdb) x/i $rip
=> 0xffffffff81190930 <sys_getdents>:   push   rbp
(gdb) set{long}0xffffffff81190930=0
(gdb) x/x 0xffffffff81190930
0xffffffff81190930 <sys_getdents>:      0x00000000
(gdb) x/i $rip
=> 0xffffffff81190930 <sys_getdents>:   add    BYTE PTR [rax],al

¿Por qué es eso? ¿Esto es porque estoy en la máquina virtual?

segunda pregunta. Sé que puedo listar páginas usando este comando

(gdb) info files
Symbols from "/home/a/vmlinux".
Remote serial target in gdb-specific protocol:
Debugging a target over a serial line.
        While running this, GDB does not access memory from...
Local exec file:
        '/home/a/vmlinux', file type elf64-x86-64.
warning: Cannot find section for the entry point of /home/a/vmlinux.
        Entry point: 0x1000000
        0xffffffff81000000 - 0xffffffff815f795f is .text
        0xffffffff815f7960 - 0xffffffff815f7adc is .notes
        0xffffffff815f7ae0 - 0xffffffff815fbb00 is __ex_table
        0xffffffff81600000 - 0xffffffff818427ce is .rodata
        0xffffffff818427d0 - 0xffffffff81849ed4 is __bug_table

pero, ¿cómo listar permisos para estas páginas - rwx?

    
pregunta tigger 17.10.2016 - 13:07
fuente

1 respuesta

4

Nunca he depurado el kernel, así que puedo estar equivocado, pero creo que lo que estás viendo tiene mucho sentido. Vamos a verlo:

  

add BYTE PTR [rax],al

     

¿Por qué es eso? ¿Esto es porque estoy en la máquina virtual?

Eso es lo que realmente esperaría de 0x0000. Esto es fácil de probar:

[~]$ uname -a
Linux haps 4.7.6-1-ARCH #1 SMP PREEMPT Fri Sep 30 19:28:42 CEST 2016 x86_64 GNU/Linux
[~]$ perl -e 'print "\x00\x00\x00\x00"' > pp
[~]$ ndisasm pp
00000000  0000              add [bx+si],al
00000002  0000              add [bx+si],al

Entonces, sí, 0x0000 es add en el primer byte de RAX (es decir, al ).

  

pero, ¿cómo listar permisos para estas páginas - rwx?

Argumentaré que eso no tiene sentido. Un malentendido común es pensar que el kernel se ejecuta como raíz, eso es completamente falso. El kernel se ejecuta en kernelmode , y todo lo demás se ejecuta en usermode (a menos que esté en medio de una syscall, es decir).

En el directorio de páginas globales, las páginas utilizadas por el kernel tienen el DLP (Nivel de privilegio del descriptor) establecido en 0, lo que significa kernelmode . Todas las páginas utilizadas del espacio de usuario tienen el DLP establecido en 3, lo que significa modo de usuario . Cuando la CPU está ejecutando un proceso de espacio de usuario, está en modo de usuario, por lo tanto, si intenta acceder a una página que tiene un DLP de 0 (o 1 o 2, pero no se usan en Linux), el CPU disparará una excepción (un Interrumpir) y decirle al núcleo que limpie el desorden. El kernel, a su vez, simplemente pondrá en cola un SEGFAULT en la cola de señales del proceso que está actualmente activo.

En resumen, cualquier proceso de espacio de usuario que intente acceder a esas páginas se segregará. No importa si el proceso se ejecuta con privilegios de root o no. Por lo tanto, no tiene sentido dar un conjunto de permisos a las páginas de memoria que usa el kernel.

Nota adicional

Puedes preguntar: pero ¿qué pasa con /dev/mem ? Esa es la memoria del núcleo que se puede ver desde el espacio de usuario. Bueno, leer y escribir en /dev/mem (o /dev/kmem ) provoca un syscall. Y se llama a algo como copy_to_user o copy_from_user para pasar datos entre las páginas DLP 3 y DLP 0.

    
respondido por el grochmal 17.10.2016 - 19:33
fuente

Lea otras preguntas en las etiquetas