C语言 为什么有效 UID 仍然不为 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: %dn", 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 存储在实变量中。

因此,在调用 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: %dn", 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标志的情况下重新挂载文件系统的那部分。

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

相关内容

  • 没有找到相关文章

最新更新