GNU/Linux >> Tutoriels Linux >  >> Linux

Qu'est-ce que j'obtiendrais si Sudo était un programme destructeur du noyau ?

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)


Linux
  1. Linux - Que faire lorsqu'un bureau Linux se fige ?

  2. Linux - Que se passerait-il si un disque dur tombait en panne pendant que le noyau Linux était en cours d'exécution ?

  3. Que fait un programme lorsqu'il envoie un signal Sigkill ?

  4. Qu'est-ce qui rend un serveur Linux noyau fondamental ?

  5. Comment puis-je obtenir ce que ma fonction principale a renvoyé?

Que faire en cas de panique du noyau Linux

Qu'est-ce que Bonjour sur mon ordinateur ? Guide PC du programme Windows 10 Bonjour

Comment vérifier quelle version du noyau Linux suis-je en cours d'exécution

Que se passe-t-il lorsqu'un thread bifurque ?

Que faire lorsque Ctrl + C ne peut pas tuer un processus ?

Qu'est-ce que le transfert IP du noyau ?