1
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int good(int addr) {
    printf("Address of hmm: %p\n", addr);
}

int hmm() {
    printf("Win.\n");
    execl("/bin/sh", "sh", NULL);
}

extern char **environ;

int main(int argc, char **argv) {

    int i, limit;

    for(i = 0; environ[i] != NULL; i++) 
        memset(environ[i], 0x00, strlen(environ[i]));

    int (*fptr)(int) = good;
    char buf[32];

    if(strlen(argv[1]) <= 40) limit = strlen(argv[1]);

    for(i = 0; i <= limit; i++) {
        buf[i] = argv[1][i];
        if(i < 36) buf[i] = 0x41;
    }

    int (*hmmptr)(int) = hmm;

    (*fptr)((int)hmmptr);

    return 0;

}

我将上面的 C 程序编译为 root 没有任何类型的堆栈保护 (gcc -fno-stack-protector -o out test.c) 并作为普通用户进行利用。我未能获得 root shell。

这与我从“smashthestack”中利用的代码相同。

4

2 回答 2

1

你做了二进制suid吗?

以root身份工作:

# cd /your/working/directory/
# chmod +s ./out

如果所有堆栈粉碎保护都关闭并且您的代码是正确的,您将获得一个 root shell。否则(如果保护关闭且代码正确),您将只会获得一个用户 shell。

于 2011-12-28T13:53:42.580 回答
0

您只需要以下内容即可使用c程序访问 shell。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) 
{
    execl("/bin/sh", "sh", NULL);
    return 0;
}

在 root shell 中执行上述代码。

您仍然可以使用以下代码来清除新 shell 中的环境变量。

for(i = 0; environ[i] != NULL; i++) 
    memset(environ[i], 0x00, strlen(environ[i]));

但是为了执行你的代码,你必须改变

printf("Address of hmm: %p\n", addr);

printf("Address of hmm: %p\n", &addr);

我不明白您为什么要在该函数中打印变量的地址.. OTOH,该函数本身缺乏目标。

于 2011-12-28T12:32:03.960 回答