1

C言語でユーザーをrootからnobodyに変更した後、プログラムのコアダンプは確かですが、常にコアファイルを生成できません。現在のディレクトリにファイルを生成する権利は誰にもないと確信しています。そして ulimit -c は無制限で、私は以下を使用します:

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

ユーザーを root から nobody に変更した後、ファイル haha​​hahhaahahah が作成されました。

だから、私は非常に混乱しています!

ここに私の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)の man ページをよく 読んでください:

コア ダンプ ファイルが生成されないさまざまな状況があります。

.... man ページからいくつかのテキストをスキップします....

  • プロセスは、プロセスの実ユーザー (グループ) ID 以外のユーザー (グループ) が所有する set-user-ID (set-group-ID) プログラムを実行しています。

基本的に、setuid(2)システムコールが成功した後、コアはダンプされません(セキュリティ上の理由から)。

Linux 固有のprctl(2) syscall も参照してくださいPR_SET_DUMPABLE

http://advancedlinuxprogramming.com/もお読みください。

注意。nobody書き込み可能なディレクトリを持つことは、おそらく悪い考えです。ユーザーは通常、nobodyファイルやディレクトリを所有するべきではありません!

于 2013-06-20T05:42:45.773 に答える