先吐槽一下ubuntu下新浪微博发博文的这个排版。。不能忍啊。。tab键各种不好用。。还各种不让我调字体调缩进。。= =字体还一会儿一变。。既不让我手动排版,自动排版还各种不好用。。= =
这次的实验分三个部分,第一个部分是在Ubuntu下配置chroot环境并搭建ftp服务器,第二个部分是利用chroot工具来实现bash或ps的配置使用和修改系统内核,配置capability的能力位,实现几种能力位的设置可验证。
前两各部分都很简单就不说了,主要说第三个部分,以下是实验要求。
------------------------------------分割线-------------------------------------------
实验要求:
passwd程序功能的实现
1 、 passwd 程序功能描述在Linux中,passwd程序是可信任的,修改存储经过加密的密码的影子密码文件(/etc/shadow),passwd程序执行它自己内部的安全策略,允许普通用户修改属于他们自己的密码,同时允许root修改所有密码。为了执行这个受信任的作业,passwd程序需要有移动和重新创建shadow文件的能力,在标准Linux中,它有这个特权,因为passwd程序可执行文件在执行时被加上了setuid位,它作为root用户(它能访问所有文件)允许,然而,许多程序都可以作为root允许(实际上,所有程序都有可能作为root允许)。这就意味着任何程序(当以root身份运行时)都有可能能够修改shadow文件。
2、实验要求
自己编制文件和程序,仿制passwd程序修改/etc/shadow的功能,包括:
自己设置一个类/etc/shadow文件aaa,该文件中约定好内容格式,和读取该文件的程序相配合,文件中包括超级用户及其内容、普通用户及其内容
编制程序使得:Root用户能够读取和修改aaa文件中所有用户的内容
普通用户仅能够读取和修改aaa文件中属于自己用户的内容
普通用户能以root身份执行所编制的类passwd程序
-----------------------------------------分割线----------------------------------------------
先来理一理基本思路吧。我们需要做的事有:1.创建一个aaa文件。2.创建一个c语言程序test.c。
aaa文件是一个类/etc/shadow的文件,该文件中应该按照一定的格式,使里面包含超级用户及其内容,普通用户及其内容。
我的aaa是这样写的。
在这里,我的aaa是按照行来分的(此处仿照了passwd文件),总共只写了四行。。
第一行表示root,后面的xxxx...表示root用户的内容。
第二行表示普通用户奥利奥(oreo),后面的asdf是奥利奥的内容。剩下的依次类推。冒号后面都表示冒号前面用户的内容。这些内容是我随便敲的。。
接下来再来想想要写的代码需要实现的具体功能:
根据实验要求的第二个条件:
Root用户能够读取和修改aaa文件中所有用户的内容,普通用户仅能够读取和修改aaa文件中属于自己用户的内容。
那么我们要做的事就很清晰了。首先,我们要判断当前的用户是root用户还是普通用户。如果是root用户,我们应当允许他修改所有用户的内容,而如果是普通用户,我们应当只允许他修改自己所对应的内容。
获取当前用户的方法:struct passwd * getpwuid(uid_t uid);
参数获取方式:uid_t uid = getuid();
具体使用方法自己man吧。
先上代码:
代码结束。。。恩。。感觉没啥可讲的了。。= =
之后编译。。
之后运行。。
运行的时候这样。如果当前是普通用户:
正常会输出当前的用户名:(代码里那句printf)
接着我们来看看aaa文件的内容:用cat aaa命令可得到
接下来我们再试试root用户。root用户可以修改所有人的内容。
输出结果应该是这样:
继续用cat命令查看结果:
结果很不错,root用户改了自己的内容。
结果也是十分的理想呀。成功的改了sss的内容。至此,我们的实验也完成了大半了。
接下来再来看看实验要求,实验要求是要做一个类shadow文件,所以我们还需要将aaa文件的拥有者改成root。这里用chown命令修改。
最后,我们还要给编译生成的可执行文件test设置suid位。用chmod +s命令。这个具体就不细讲了,应该大家都会。到这里,实验才算是真正完成了。总共也就不到一百行的代码,非常简单。