De repente me doy cuenta de lo fácil que será para un sudoer para bloquear el núcleo, así que probé algo como esto:
#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);
}
Comprensiblemente, sin sudo
, ejecutar el programa resulta en una falla de segmento. Sin embargo , no obtuve NADA cuando se ejecuta a través de sudo ./a.out
! Incluso el hello world
en la primera línea se suprime sin ningún error o advertencia.
¿Alguien puede explicar qué está pasando?
Respuesta aceptada:
Por supuesto, no bloqueará el kernel, está escribiendo en el espacio de memoria virtual de su propio programa, no en el real
espacio de memoria del núcleo.
Obtenga más información sobre la memoria virtual aquí
PD:
Por qué printf
no imprime nada? De forma predeterminada, la salida estándar tiene un búfer de línea y su hello world
no contiene un separador de línea.
Entonces, si el programa falla, no observará esa salida (intente usar puts
o agregando un \n
en tu mensaje)