Plötzlich fällt mir ein, wie einfach es für einen Sudoer sein wird um den Kernel zum Absturz zu bringen, also habe ich so etwas versucht:
#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);
}
Verständlicherweise ohne sudo
, das Ausführen des Programms ergibt einen Segmentfehler. Allerdings , ich habe NICHT wenn es über sudo ./a.out
ausgeführt wird ! Sogar die hello world
in der ersten Zeile wird ohne Fehler oder Warnungen unterdrückt.
Kann jemand erklären, was passiert?
Akzeptierte Antwort:
Natürlich bringt es den Kernel nicht zum Absturz, Sie schreiben in den virtuellen Speicherplatz Ihres eigenen Programms, nicht in den real
Kernel-Speicherplatz.
Erfahren Sie hier mehr über virtuellen Speicher
PS:
Warum printf
druckt nichts? Standardmäßig ist die Standardausgabe zeilengepuffert und Ihr hello world
enthält kein Zeilentrennzeichen.
Wenn das Programm also abgestürzt ist, werden Sie diese Ausgabe nicht beobachten (Versuchen Sie, puts
zu verwenden oder Hinzufügen eines \n
in Ihrer Nachricht)