一、题目
本实验室的学习目标是让学生了解环境变量如何影响程序以及系统行为。环境变量是一组动态命名值,可以影响正在运行的进程将在计算机上运行。大多数操作系统都使用它们,因为它们是1979年引入Unix。尽管环境变量会影响程序行为,但它们是如何实现的这一点很多程序员都不太理解。因此,如果程序使用环境变量程序员不知道它们被使用,程序可能有漏洞。
在本实验室中,学生将了解环境变量是如何工作的,它们是如何从父进程到子进程,以及它们如何影响系统/程序行为。我们特别感兴趣的是如何环境变量影响Set-UID程序的行为,这些程序通常是特权程序。
本实验室涵盖以下主题:
•环境变量
•SET-UID程序
•安全地调用外部程序
•能力泄漏
•动态加载程序/链接器
二、过程
一、Task 1: Manipulating Environment Variables
1、使用printenv命令输出环境变量。输入命令printenv,得到结果如下:

使用printenv PWD命令查看PATH环境变量:

2、使用export设置环境变量,输入命令export MY123=456设置环境变量MY123为456,$符号实际作用是将变量转换成字符,方便输出。

3、输入命令env | grep MY 查看环境变量,可以找到名为MY123的环境变量

4、输入命令unset MY123进行取消设置环境变量操作,再查看环境变量已经无法找到。

二、Task 2: Passing Environment Variables from Parent Process to Child Process
1、编译并运行以下程序,利用命令gcc -o myprintenv myprintenv.c进行编译,运行后得到以下结果:

2、将myprintenv.c文件作出如下修改。


3、利用命令gcc -o myprintenv2 myprintenv.c进行编译,运行后得到以下结果:

5、观察或者利用diff命令查看均可发现两者除了文件名外完全相同,这说明子进程环境变量会继承父环境变量。说明在Fork后,父子进程有着相同的环境变量。这是 Fork 本身的特性导致的,Fork 后的父子进程除了返回值不一样以外基本所有东西都一样,包括栈和堆,且修改互不影响,但描述符是共享的,修改会相互影响。进一步查阅资料了解到,子进程自父进程继承到进程的资格、环境、堆栈、内存等,但子进程所独有的是不同的父进程号、自己的文件描述符和目录流的拷贝、在tms结构中的系统时间、不继承异步输入和输出等。

三、Task 3: Environment Variables and execve()
1、编译并运行以下程序,利用命令gcc -o myenv myenv.c进行编译,运行后,可以看到并没有环境变量的输出。

这篇博客介绍了一个关于环境变量和Set-UID程序的实验,旨在让学生理解环境变量如何影响程序行为,特别是它们如何影响Set-UID程序。实验涵盖了环境变量、SET-UID程序、安全调用外部程序、能力泄漏等方面,并通过一系列任务展示了环境变量在Fork、execve()、system()函数中的传递和影响,以及在Set-UID程序中的安全问题。
最低0.47元/天 解锁文章
1573

被折叠的 条评论
为什么被折叠?



