diverse domande sul debug del kernel di Linux - esame della memoria

4

Ho letto questo Il kernel di Linux usa DEP per memoria del kernel?

ma sto eseguendo il debug del kernel linux (x86_64) su Vmware usando lo stub di vmware. Ho allegato gdb al mio kernel linux. la versione del kernel è 3.x

e ho cambiato la memoria eseguibile del kernel linux in un unico punto

(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

perché è così? è perché sono nella macchina virtuale?

seconda domanda. So che posso elencare le pagine usando questo 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

ma come elencare i permessi per queste pagine - rwx?

    
posta tigger 17.10.2016 - 13:07
fonte

1 risposta

4

Non ho mai eseguito il debug del kernel, quindi potrei sbagliarmi, ma credo che ciò che state vedendo sia completamente logico. Passiamo attraverso:

add BYTE PTR [rax],al

why is that? is this because I'n in virtual machine?

Questo è quello che mi aspetterei in realtà da 0x0000. È facile da testare:

[~]$ 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

Quindi sì, 0x0000 è add nel primo byte di RAX (cioè al ).

but how to list permissions to these pages - rwx ?

Sosterrò che ciò non ha senso. Un malinteso comune è pensare che il kernel sia eseguito come root, completamente falso. Il kernel gira in kernelmode , e tutto il resto viene eseguito in usermode (a meno che non si trovi nel mezzo di un syscall, cioè).

Nella directory della pagina globale le pagine utilizzate dal kernel hanno il DLP (Descriptor Privilege Level) impostato su 0, che significa kernelmode . Tutte le pagine utilizzate dallo spazio utente hanno il DLP impostato su 3, che significa usermode . Quando la CPU sta eseguendo un processo userspce è in usermode, quindi se prova ad accedere a una pagina che ha un DLP di 0 (o 1 o 2, ma quelli non sono usati in Linux) allora la CPU scatterà un'eccezione (un interrompere) e dire al kernel di pulire il pasticcio. Il kernel, a sua volta, semplicemente accoderà un SEGFAULT nella coda di segnale del processo attualmente attivo.

In sintesi, il qualsiasi processo userspace che tenta di accedere a quelle pagine verrà segmentato. Non importa se il processo viene eseguito con privilegi di root o meno. Quindi non ha senso dare un set di permessi alle pagine di memoria che sono usate dal kernel.

Nota aggiuntiva

Potresti chiedere: ma per quanto riguarda /dev/mem ? Questa è la memoria del kernel che può essere vista dallo spazio utente. Bene, leggere e scrivere su /dev/mem (o /dev/kmem ) provoca un syscall. E qualcosa come copy_to_user o copy_from_user viene chiamato per passare i dati tra le pagine DLP 3 e DLP 0.

    
risposta data 17.10.2016 - 19:33
fonte

Leggi altre domande sui tag