Partie 18 - Le user land et kernel land
Le user land et kernel land
Vous vous ĂȘtes toujours demandĂ© la diffĂ©rence entre le noyau de votre OS, un programme lambda et un pilote ?
Ăa tombe bien ! Nous allons tenter de comprendre comment interagissent ces diffĂ©rents composant dâun systĂšme dâexploitation. LâidĂ©e est que vous puissiez avoir une vision globale de lâinteraction entre le user land et kernel land sans pour autant entrer dans les dĂ©tails du kernel land.
Dâailleurs, vous le saviez, vous, que le kernel Linux Ă©tait un fichier ELF et que le kernel Windows Ă©tait un fichier PE đČ ?
Sous linux, le kernel se trouve ici :
/boot/vmlinuz-$(uname -r). Vous pouvez suivre les Ă©tapes indiquĂ©es ici afin de constater par vous-mĂȘme que le kernel nâest finalement quâun fichier ELF đ.
Sous Windows, le kernel est normalement présent ici :
C:\Windows\System32\ntoskrnl.exe.
Les appels systĂšme (ou syscalls)
Nous nâallons pas nous attarder sur le kernel land en termes de reverse car il est nĂ©cessaire dâĂȘtre trĂšs Ă lâaise en rĂ©tro-ingĂ©nierie et dâavoir des connaissances avancĂ©es concernant le fonctionnement su kernel land et ce nâest pas forcĂ©ment un chapitre quâil convient dâentamer dans un cours dâintroduction au reverse.
Néanmoins, il y a une fonctionnalité que vous risquez de rencontrer et qui est à la limite du user land et du kernel land : les appels systÚme (ou syscalls).
DerriÚre ce nom alambiqué se cache une solution à une problématique relativement simple.
La problématique
Voici comment on pourrait reprĂ©senter la mĂ©moire du PC Ă un instant T (sous Linux mais sous Windows le principe et plus ou moins le mĂȘme) :
Nous pouvons distinguer 3 parties :
- Le user land : câest la partie visible de lâiceberg, celle Ă laquelle on est confrontĂ©s tous les jours : navigateur, terminal, programme compilĂ©, serveur web et jâen passe.
- Le hardware : il sâagit du matĂ©riel et pĂ©riphĂ©rique que lâon branche Ă un ordinateur, qui peuvent ĂȘtre essentiels (RAM, Disque dur / SSD âŠ) ou non (imprimante, carte graphique dĂ©diĂ©e, souris, clavier, ethernet âŠ).
- Le kernel land : lâaccĂšs au matĂ©riel et pĂ©riphĂ©riques Ă©tant beaucoup trop sensible ( exemple : risque de sabotage du Disque dur si mal utilisĂ©), il nâest pas possible de laisser nâimporte quel programme en user land y accĂ©der. Il faut donc que des programmes bien spĂ©cifiques, appelĂ©s pilotes, modules ou drivers opĂšrent ce dĂ©licat travail . Le kernel land contient le kernel (noyau, merci Sherlock đ”ïžââïž) de lâOS. Le noyau est chargĂ© de faire un tas de choses dont : lâordonnancement, la gestion de la mĂ©moire physique et virtuelle âŠ
Ok je comprends bien, donc les pilotes gĂšrent les accĂšs au hardware afin que tout se passe bien, jusque-lĂ , câest ok.
Mais comment fait un programme en user land, par exemple mon navigateur, pour se connecter Ă internet sâil nâa pas directement accĂšs Ă la carte rĂ©seau WiFi / Ethernet đ€ ?
Câest justement LA problĂ©matique susmentionnĂ©e Ă laquelle les appels systĂšme vont nous permettre de rĂ©pondre : comment interagir avec des composants ou fonctionnalitĂ© bas niveau Ă partir du user land ?
Un appel systÚme, comment ça marche ?
PremiĂšrement voici une maniĂšre de reprĂ©senter lâutilitĂ© des appels systĂšme dans le prĂ©cĂ©dent schĂ©ma :
Les appels systĂšmes vont jouer le rĂŽle dâinterface entre le user land et le kernel land.
Les syscalls sont des fonctions prĂ©dĂ©finies prĂ©sentes dans le kernel lui mĂȘme. La liste des syscalls (sous Linux) est disponible dans le fichier include/linux/syscalls.h.
Si on y jette un Ćil, au vu des noms de fonctions qui sont assez explicites, on constate quâil y a des fonctions de gestion de fichiers (sys_read, sys_write, sys_open, sys_close ⊠) de gestion de mĂ©moire (sys_mmap, sys_mprotect, sys_munmap âŠ) et bien dâautres.
Par abus de langage, on parle souvent de syscall
readpour parler desys_read,writepoursys_writeetc.
Vous remarquerez que beaucoup de ces noms de fonctions ressemblent tout simplement Ă des fonctions de la libc (read, write, mmap âŠ). Dâailleurs, les fonctions associĂ©es dans la libc ne sont âqueâ des surcouches (wrappers) aux appels systĂšme idoines.
Quoi ? Vous ne me croyez pas đ ? Alors voici un exemple avec la fonction read :
1
2
3
4
5
6
7
8
9
10
#include <unistd.h>
#include <stdio.h>
int main()
{
char buff[20];
read(0,buff,10);
return 1;
}
Compilons-le en statique afin de pouvoir voir le contenu de read ⊠en analyse statique : gcc -static main.c -o exe.
Si vous ouvrez le programme dans IDA et allez dans read, vous verrez cela :
En assembleur, le syscall est rĂ©alisĂ© avec lâinstruction syscall (merci Sherlock đ”ïžââïž) :
En fait, lâinstruction
syscallnâest disponible quâen x86_64. Ainsi, pour rĂ©aliser un appel systĂšme en x86, câest plutĂŽt lâinstruction (plus prĂ©cisĂ©ment, interruption)int 0x80qui est utilisĂ©e.
Il y a une convention dâappel Ă respecter lorsque lâon souhaite rĂ©aliser un appel systĂšme. Par exemple mettre le numĂ©ro du syscall dans
eax/rax. NĂ©anmoins, comme nous nâallons pas nous attaquer au reverse kernel land, il nâest pas nĂ©cessaire de nous y attarder.
Convaincus maintenant đ ?
En somme, un appel systĂšme est une fonction prĂ©dĂ©finie du kernel que lâon peut appeler depuis le user land. Le kernel se dĂ©brouille ensuite pour utiliser les bons modules/pilotes afin de satisfaire la demande (lecture de lâentrĂ©e standard, allocation de mĂ©moire, Ă©criture dans un fichier âŠ).
Si vous souhaitez comprendre davantage le fonctionnement des appels systĂšme, cet article est fait pour vous. Il est rĂ©digĂ© en anglais mais permet de comprendre les aspects techniques sous-jacents lors dâun syscall.
Dans le prĂ©cĂ©dent schĂ©ma, tous les syscall finissent dans le kernel. Nâest-il pas possible dâinteragir aussi avec les diffĂ©rents pilotes en kernel land ?
Il est effectivement possible dâinteragir avec des drivers avec un appel systĂšme bien prĂ©cis sous Linux : ioctl (et DeviceIoControl sous Windows).
Lâexplication et le fonctionnement de ce syscall sortent du cadre de ce cours et puis, de toute maniĂšre, on ne le voit pas trĂšs souvent quand on dĂ©bute en reverse, sauf Ă©ventuellement dans des programmes qui nĂ©cessitent dâĂ©changer des donnĂ©es avec certains pilotes. Cela peut ĂȘtre le cas, par exemple, des programmes systĂšme.
Si vous ĂȘtes Ă©galement intĂ©ressĂ©s au sujet de la gestion des interruptions, voici un petit rĂ©sumĂ© qui en parle : les interruptions.



