所以我从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
答案 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提供了有关如何执行该操作的详细说明。