繁体   English   中英

为什么有效的 UID 仍然不是 0?

[英]Why is effective UID still not 0?

所以我从这里得到了下面的代码。 但是,当我按照以下命令进行操作时:

sudo chown root:root a.out
sudo chmod u+s a.out

它仍然不会在有效 uid 为 0 的情况下运行。

这是代码:

#define _POSIX_C_SOURCE 200112L // Needed with glibc (e.g., linux).
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

void report (uid_t real) {
    printf ("Real UID: %d Effective UID: %d\n", real, geteuid());
}

int main (void) {
    uid_t real = getuid();
    report(real);
    seteuid(real);
    report(real);
    return 0;
}

输出是:

Real UID: 1000 Effective UID: 1000
Real UID: 1000 Effective UID: 1000

我认为它应该是:

Real UID: 1000 Effective UID: 0
Real UID: 1000 Effective UID: 1000

getuid 函数仅返回真实用户 ID。 用户进程的真实用户id仍然是1000。1000存储在real变量中。

因此,在调用 seteuid 函数时,您再次将 1000 设置为有效用户 ID。但实际上您必须在该位置设置 0。 所以只有有效的用户 ID 不会改变。

试试下面的它会工作正常。

#define _POSIX_C_SOURCE 200112L // Needed with glibc (e.g., linux).
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

void report (uid_t real) {
    printf ("Real UID: %d Effective UID: %d\n", real, geteuid());
}

int main (void) {
    uid_t real = getuid();
    report(real);
    seteuid(0);
    report(real);
    return 0;
}

显然正如@MarkPlotnick 所说。

cd 到 a.out 所在的目录。 运行 df 。 获取挂载点。 运行挂载 | grep 挂载点并查看文件系统类型和挂载选项是什么。

如果有什么说nosuid那么你需要重新挂载没有 nosuid 标志的文件系统的那部分。

这个网站在这里很好地解释了如何做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM