QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 842|回复: 7

请教关于C中setuid()的问题

[复制链接]
发表于 2004-9-27 16:12:46 | 显示全部楼层 |阅读模式
我看了很久帮助文档,还是不太明白。请问setuid()函数应该如何用?比如,在程序中需要往一个属主是root的文件写入内容,而运行程序的一般都是普通用户。用setuid()能把运行程序的普通用户变成根用户吗?如果能,代码应该怎么写?谢谢。
发表于 2004-9-27 16:19:43 | 显示全部楼层
http://www.linuxfans.org/nuke/mo ... mp;highlight=setuid麻烦楼主看看有没有帮助。
回复

使用道具 举报

 楼主| 发表于 2004-9-27 17:33:17 | 显示全部楼层
谢谢. 我试了一下, 成功了. 我的做法如下:
[code:1]
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>

int main(void)
{
    FILE *fp;
    setuid(0);
    if(fp=fopen("hell.txt","w"))
    {
        printf("OK\n");
        fputs("hell, hello, tintin",fp);
        fclose(fp);
    }

    else
        printf("Wrong\n");
    setuid(getuid());
    return 0;
}
[/code:1]

有三个问题想情教: 1)setuid()中的参数是进程需要的有效uid吗?
                  2)setuid(0)中0是什么意思?
                  3)我没有设置文件hell.txt的setuid位却成功了. 是不是可以不用                     设置setuid位?

谢谢帮助.
回复

使用道具 举报

 楼主| 发表于 2004-9-27 18:16:26 | 显示全部楼层
我知道第三个问题的原因了. 应该是因为hell.txt文件的模式是777. 可是我把它的模式改为755, 然后用 chmod u+s hell.txt , 接着运行代码总是显示 Wrong . 请问这是什么原因? 谢谢.
回复

使用道具 举报

发表于 2004-9-27 19:38:57 | 显示全部楼层
setuid中的0指根权限。
第一个问题和第三个    没明白。
说说你的具体步骤和用什么身份做这件事的?
回复

使用道具 举报

 楼主| 发表于 2004-9-28 08:48:32 | 显示全部楼层
我的步骤如下:
1)编写、编译上述代码和生成二进制文件。
2)切换到根用户,新建一个名为hell.txt的文件,然后用chmod命令把模式改为4755。
3)切换回普通用户,执行二进制文件,结果是显示“Wrong”。说明用写的方式不能打开hell.txt 文件。

对于第三个问题,是因为我把文件的模式改为777所致。
请问根用户的uid是0吗?
回复

使用道具 举报

发表于 2004-9-28 10:27:52 | 显示全部楼层
根用户是0
实际上你的操作没有意义。
setuid的典型用法是让一个需要特权的程序也能在无特权用户下运行。比如 ping。其典型步骤:

1.当你的程序要执行特权时setuid(0;
2.执行特权指令
3.setuid(getuid()),这样你的程序就无特权了。
4.编译为a.out
5.su
6.chown uroot  a.out
7.chown u+s  a.out
8exit退出特权
这样你的程序就可以在普通权限下执行特权指令。
回复

使用道具 举报

 楼主| 发表于 2004-9-28 12:14:11 | 显示全部楼层
我明白你的意思了. 你是说setuid()可以让普通用户执行只有root用户才能执行的文件. 而这个文件是由源代码生成的二进制文件. 对吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 09:31 , Processed in 0.051285 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表