2017-05-25 17 views
0

我想了解緩衝區溢出和setuid。我用這個來源:試圖理解緩衝區溢出和setuid。我沒有獲得特權

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void){ 
    char prog[]="/bin/ls -hal"; 
    char in[8]={0}; 
    printf("Name of a dir to list : "); 
    gets(in); 
    char *cmd; 
    cmd=malloc(strlen(prog)+strlen(in)+2); 
    strcat(cmd, prog); 
    strcat(cmd, " "); 
    strcat(cmd, in); 
    return system(cmd); 
} 

編譯它之後,我改變與店主:

sudo chown root:root a.out 

我設置的權限:

sudo chmod 4755 a.out 

現在a.out的樣子:

-rwsr-xr-x 1 root root 7544 mai 01:24 a.out 

我啓動它與我curren t用戶(而不是root)和ps aux | grep a.out:

root 4656 0.0 0.0 4084 684 pts/0 S+ 01:52 0:00 ./a.out 

所以這沒問題。 如果我輸入的是:

aaaaaaaaaaaaaaaa/bin/bash; 

我得到一個新的外殼,但我不就行了根我登錄我的當前用戶,我不明白爲什麼。因爲所有者是root用戶,所以我把setuid放在了這個新的bash上,並且它的root權限不會啓動?

+0

緩衝區溢出在炭[8] = {0};我把幾個「a」,我用/ bin/bash覆蓋/ bin/ls。在我的電腦上,我必須寫16「a」和/ bin/bash; – wammder

+3

'bash'檢測它是否正在運行setuid並刪除權限。 – Barmar

+1

請參閱https://unix.stackexchange.com/questions/74527/setuid-bit-seems-to-have-no-effect-on-bash – Barmar

回答

1

可執行問題上的setuid標誌設置euid(有效的UID)。你的uid,而不是你的euid被傳遞給子進程。調用system()命令之前做

setuid(geteuid());