1

c语言中将用户从root更改为nobody之后,我确定程序核心转储,但始终无法生成核心文件。我确定没有人有权在当前目录中生成文件。并且 ulimit -c 是无限的,我使用:

system("echo 'tesstestestestestetestestet!!!!!!' >  hahahahhaahahah");

将用户从root更改为nobody后,创建了文件hahahahhaahahah!

所以,我很困惑!

这是我的c文件:

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

int main()
{
#if 1
    struct passwd *pw;

    //char *username = "root";
    char *username = "nobody";
    if (getuid() == 0 || geteuid() == 0)
    {
        if (username == 0 || *username == '\0')
        {
            fprintf(stderr, "can't run as root without the -u switch\n");
            exit(-1);
        }
        if ((pw = getpwnam(username)) == NULL)
        {
            fprintf(stderr, "can't find the user %s to switch to\n", username);
            exit(-1);
        }
        if (setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0)
        {
            fprintf(stderr, "failed to assume identity of user %s\n", username);
            exit(-1);
        }
    }
#endif

    printf("now user change to group id %d, user id %d\n", getgid(), getuid());

    system("echo 'tesstestestestestetestestet!!!!!!' >  hahahahhaahahah");
    char *test_a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    char *test_b;
    strcpy(test_b, test_a);
    *(char *)1=1;
    printf("test_b:%s\n", test_b);
}
4

1 回答 1

2

仔细 阅读core(5)手册页:

有多种情况不会生成核心转储文件:

....从手册页中跳过一些文本....

  • 进程正在执行一个用户(组)拥有的设置用户ID(set-group-ID)程序,而不是进程的真实用户(组)ID。

所以基本上,在成功的setuid(2)系统调用之后,核心不会被转储。(出于安全原因)

另请参阅 Linux 特定的prctl(2)系统调用,带有PR_SET_DUMPABLE.

另请阅读http://advancedlinuxprogramming.com/

注意。有一个nobody可写的目录可能是个坏主意。nobody用户通常不应该拥有任何文件或目录!

于 2013-06-20T05:42:45.773 回答