gpt4 book ai didi

c - C 中的 setgid() 调用不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:37 25 4
gpt4 key购买 nike

我正试图放弃 C 程序中的特权,但无论我做什么,GID 都保持为 0。经过数小时的研究,我一无所知:(

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <grp.h>

int main(int argc, char *argv[]) {

initgroups("nobody", 65534);
setresuid(65534,65534,65534);
setresgid(65534,65534,65534);
setegid(65534);
printf("gid: %d\n", getegid());
execv("/usr/bin/id", argv);

}

返回这个:

gid: 0
uid=65534(nobody) gid=0(root) groups=65534(nogroup)

当我将所有三个(R、E 和 SGID)明确设置为 65534 时,为什么 GID 为 0?

最佳答案

要设置 GID 值,进程需要一个有效的 UID 0(root),但是您的代码在调用 setresgid() 之前通过将 UID 值设置为 65534 来小心地放弃 root 特权,所以调用失败了——如果你测试了函数的返回值,你就会知道。

颠倒调用 setresuid()setresgid() 的顺序(当然也删除多余的 setegid() ,以及额外的 printf())。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> // Archaic: shouldn't be needed (but Linux docs list it)
#include <grp.h>

int main(int argc, char **argv)
{
if (initgroups("nobody", 65534) == 0 &&
setresgid(65534, 65534, 65534) == 0 &&
setresuid(65534, 65534, 65534))
execv("/usr/bin/id", argv);
fprintf(stderr, "Oops!\n");
return 0;
}

如果您愿意,您可以在错误报告中更加小心。请记住,execv() 如果成功则不会返回;无需测试其返回值。

关于c - C 中的 setgid() 调用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45089486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com