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

时间:2017-01-30 01:53:20

标签: c unix permissions uid

所以我从here获得了以下代码。但是当我按照命令执行时:

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

2 个答案:

答案 0 :(得分:1)

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: %d\n", real, geteuid());
}

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

答案 1 :(得分:0)

显然正如@MarkPlotnick所说。

  

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

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

本网站here提供了有关如何执行该操作的详细说明。