文章目录
-
- 一、实验题目
- 二、实验步骤及结果
-
- Task1:Manipulating Environment Variables
- Task 2: Inheriting environment variables from parents
- Task 3: Environment variables and execve()
- Task 5: Environment variable and Set-UID Programs
- Task 6: The PATH Environment variable and Set-UID Programs
- Task 7: The LD PRELOAD Environment Variable and Set-UID Programs
- Task8:Invoking External Programs Using system() versus execve()
- Task9:Capability Leaking
一、实验题目
本实验室的学习目标是让学生了解环境变量如何影响程序以及系统行为。环境变量是一组动态命名值,可以影响正在运行的进程将在计算机上运行。大多数操作系统都使用它们,因为它们是1979年引入Unix。尽管环境变量会影响程序行为,但它们是如何实现的这一点很多程序员都不太理解。因此,如果程序使用环境变量程序员不知道它们被使用,程序可能有漏洞。
在本实验室中,学生将了解环境变量是如何工作的,它们是如何从父进程到子进程,以及它们如何影响系统/程序行为。我们特别感兴趣的是如何环境变量影响Set-UID程序的行为,这些程序通常是特权程序。
本实验室涵盖以下主题:
•环境变量
•SET-UID程序
•安全地调用外部程序
•能力泄漏
•动态加载程序/链接器
二、实验步骤及结果
Task1:Manipulating Environment Variables
(1)使用printenv命令输出环境变量输入命令printenv,得到如下结果(截取部分):
使用printenv命令查看PATH环境变量,得到如下结果:
(2)使用export和unset设置或删除环境变量:
① 使用export设置环境变量,使用echo显示,$符号实际作用是将变量转换成字符,方便输出。
② 使用unset删除环境变量
Task 2: Inheriting environment variables from parents
(1)编译C文件,将结果保存为a.out文件将代码保存为demo.c文件并放在桌面。进入桌面路径,编译C文件。
执行保存结果的a.out文件,查看代码的运行结果,发现为各个环境变量的值(截取部分):
(2)按题意,将child process中printenv()注释,将process中parent printenv()取消注释,重新保存编译C文件
执行保存结果的b.out文件,查看代码的运行结果,发现为各个环境变量的值(截取部分)。
(3)比较两者结果:
将a.out、b.out文件的结果分别保存为child和parent文件,再使用diff命令比较,发现两者除了文件名外完全相同。这说明子进程环境变量会继承父环境变量。进一步查阅资料了解到,子进程自父进程继承到进程的资格、环境、堆栈、内存等,但子进程所独有的是不同的父进程号、自己的文件描述符和目录流的拷贝、在tms结构中的系统时间、不继承异步输入和输出等。
Task 3: Environment variables and execve()
(1)编译并运行以下程序。描述观察到的实验结果。该程序简单地调用了/usr/bin/env,该系统调用能够打印出当前进程的环境变量。
保存和编译文件,发现执行结果为空: