O que eu recebo quando sudo um programa destrutivo de kernel?

5

De repente, vem a mim o quão fácil será para um sudoer travar o kernel, então eu tentei algo assim:

#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);
}

Compreensivelmente, sem sudo , a execução do programa resulta em uma falha de segmento. No entanto , não tenho NADA quando o executo via sudo ./a.out ! Mesmo o hello world na primeira linha é suprimido sem nenhum erro ou aviso.

Alguém pode explicar o que está acontecendo?

    
por qweruiop 18.12.2013 / 10:14

2 respostas

12

É claro que ele não trava o kernel, você está gravando no espaço de memória virtual do seu próprio programa, não no espaço de memória do kernel real .

Saiba mais sobre a memória virtual aqui

P.S:

Por que printf não imprime nada? Por padrão, a saída padrão é com buffer de linha e seu hello world não contém um separador de linha.

Portanto, se o programa falhar, você não observará essa saída (tente usar puts ou adicionar \n em sua mensagem)

    
por 18.12.2013 / 10:23
3

Understandably, without sudo, running the program turns out a segment fault. I got NOTHING when execute it via sudo ./a.out!

Tem certeza de que funcionou?

#include <stdio.h>

int main (void) {
    fprintf(stderr,"Attempting out-of-bounds access.\n");
    int *p = (int*)0xffff000000000000;
    fprintf(stderr,"%d\n", *p);
    *p = 666;
    fprintf(stderr,"%d\n", *p);
    return 0;
}        

Este usa stderr , pois não é armazenado em buffer, para evitar os problemas descritos por warl0ck.

me@home> ./a.out
Attempting out-of-bounds access.
Segmentation fault
me@home> su root
Password:
root@home> ./a.out
Attempting out-of-bounds access.
Segmentation fault  

Exatamente o que deveria acontecer. O sistema nunca permitirá que alguém faça isso. Esta linha:

int *p = (int*)0xffff000000000000;

Quando compilado e executado, obtém um SIGSEGV, também conhecido como. uma "falha de segmentação".

    
por 18.12.2013 / 13:32

Tags