Il me vient soudain à l'esprit à quel point ce sera facile pour un sudoer planter le noyau, j'ai donc essayé quelque chose comme ceci :
#include<stdio.h>
int main(){
printf("hello world");
int a;
printf("%p", &a);
int *p = (int*)0xffff000000000000; //x86_64, somewhere in the kernel space
printf("%p:%d", p,*p);
*p = 1;
printf("%p:%d", p,*p);
}
Naturellement, sans sudo
, l'exécution du programme s'avère une erreur de segment. Cependant , je n'ai RIEN lors de son exécution via sudo ./a.out
! Même le hello world
en première ligne est supprimé sans aucune erreur ni avertissement.
Quelqu'un peut-il expliquer ce qui se passe ?
Réponse acceptée :
Bien sûr, cela ne plantera pas le noyau, vous écrivez dans l'espace de mémoire virtuelle de votre propre programme, pas dans le real
espace mémoire du noyau.
En savoir plus sur la mémoire virtuelle ici
PS :
Pourquoi printf
n'imprime rien ? Par défaut, la sortie standard est mise en mémoire tampon, et votre hello world
ne contient pas de séparateur de ligne.
Donc, si le programme plante, vous n'observerez pas cette sortie (essayez d'utiliser puts
ou en ajoutant un \n
dans votre message)