我需要编写一些代码,这些代码可以获得根优先级并执行系统级操作。下面是我所写的(这不是实际的代码,只是为了测试我做的事情是否正确):
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int current_uid = getuid();
printf("My UID is: %d. My GID is: %d\n", current_uid, getgid());
system("/usr/bin/id&
一些任意的帐户和root之间的根本区别是什么?仅仅是UID不是零吗?
那么,su二进制到底是做什么的,它如何将用户提升为根呢?我知道用户首先必须是sudo组的一部分,通过我们在/etc/sudoers中的发现。
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo
如果我在循环中调用setuid成为root用户并重置uid,这只起作用一次。我有以下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int my_func(int i) {
int current_uid = getuid();
int ret;
fprintf(stderr,
"### i=%d ###: My UID is: %d. My GID is: %d, before '
我正在编写一个访问Linux原始套接字的Qt应用程序,所以我需要root特权来运行这个程序。所以我做了这个:
在我的节目里,我一开始就有这样的想法:
if (getuid() != 0)
{
fprintf(stderr, "You must be root to run this program. UID = %i\n", getuid());
exit(-1);
}
然后,我以"chmod 6777 myProgram“作为根。
但是,当我试图以普通用户的身份运行它时,它会说:“您必须是运行此程序的根用户,UID = 1002",其中1002
我在C中创建了一个setuid程序,可执行文件如下所示:
-r-s-r-s--- 1 root users 13073 Jun 15 21:56 server
我以userA/users的形式执行程序,并尝试将uid/gid设置为userB/otherUsers。setgid()在不允许操作的情况下失败。userA不是otherUsers的一部分,我如何才能改变有效的gid?
这里的编辑是我所做工作的一个小总结。我的C程序作为userA执行,将uid和gid设置为userB并创建一个文件。不像预期的那样,该文件属于组根,因为setgid()失败。
[userA@node uid]$ id
u
我想将当前进程的有效uid设置为其他用户的uid (或任意值)。
struct passwd* pwHost = getpwnam(hostName);//hostName is another user's name
struct passwd* pwGuest = getpwnam(guestName);//guestName is the current log-in user's name
if(pwHost==NULL||pwGuest==NULL)
{
printf("User cannot be found\n");
exit(0)
我的任务是为系统上的所有用户列出用户所属的所有组。其想法是通过/etc/passwd,为每个用户打印自己的组。
编辑这个做了一个窍门:
if( getgrouplist(passwd->pw_name, passwd->pw_gid,
groups, &ngroups) < 0)
error_fatal ("getgrouplist ()");
但我还是很好奇它不起作用的原因。
输出:
User root is a member of: root
User daemon is a member of: roo
对于我正在开发的程序,没有理由使用setuid位集来运行它--它总是代表用户的配置错误。作为深入防御的一部分,我想在程序中检测并修复这个问题。
正如我所理解的那样,要真正做到这一点,我必须调用setuid两次,如下所示:
uid_t real_uid = getuid();
int ret = setuid(real_uid);
/* error checking here */
ret = setuid(real_uid);
/* error checking here */
据我所知,如果我只调用setuid一次,那么旧的有效UID将位于保存的set-user-ID中,因此任何注入的对se