当 sudo 一个破坏内核的程序时,我会得到什么?

qwe*_*iop 5 c kernel sudo

我突然想到 sudoer使内核崩溃是多么容易,所以我尝试了这样的事情:

#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);
}
Run Code Online (Sandbox Code Playgroud)

可以理解,没有sudo,运行程序会导致段错误。不过,我NOTHING当通过执行它sudo ./a.out!甚至hello world第一行也被抑制,根本没有任何错误或警告。

有人可以解释发生了什么吗?

dai*_*isy 12

当然它不会使内核崩溃,您正在写入自己程序的虚拟内存空间,而不是real内核内存空间。

在此处了解有关虚拟内存的更多信息

PS:

为什么printf不打印任何东西?默认情况下,标准输出是行缓冲的,并且您hello world不包含行分隔符。

因此,如果程序崩溃,您将不会观察到该输出(尝试在您的消息中使用puts或添加一个\n

  • “*您正在写入自己程序的虚拟内存空间*” **错误。** 这是对虚拟寻址的误解。**写入涉及实际 RAM。** 如果写入成功,则可能写入内核存储位置,因为它是越界地址。但是,系统不允许这样的写入——它改为发送 SIGFAULT;事实上,它会尝试读取或以其他方式访问这样的地址,例如,在声明指针时,当内存仍然是虚拟的时。写操作将虚拟地址映射到真实地址。 (3认同)