⽹络攻防技术——环境变量与set-uid实验
⼀、题⽬
本实验室的学习⽬标是让学⽣了解环境变量如何影响程序以及系统⾏为。环境变量是⼀组动态命名值,可以影响正在运⾏的进程将在计算机上运⾏。⼤多数操作系统都使⽤它们,因为它们是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的环境变量
环境变量path误删有影响吗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进⾏编译,运⾏后,可以看到并没有环境变量的输出。
2、查询函数execve()调⽤格式:
int execve(const char * filename,char * const argv[],char * const envp[])
其中第⼀个参数为⼀个可执⾏的有效的路径名。第⼆个参数系利⽤数组指针来传递给执⾏⽂件,argv
是要调⽤的程序执⾏的参数序列,也就是我们要调⽤的程序需要传⼊的参数。envp则为传递给执⾏⽂件的新环境变量数。样例程序赋予新进程的环境变量为空,⾃然印出环境变量结果为空。
故将execve()的调⽤改为以下内容execve("/usr/bin/env", argv, environ),重新保存和编译⽂件,得到如下结果。
3、新程序通过execve等函数运⾏新程序,可以在参数⾥指定环境变量指针来对新程序设置环境变量。
execve()产⽣的新进程的环境变量⼜调⽤时重新赋予,⽽fork()则是直接继承⽗进程环境变量。第⼀步设置新程序环境变量指针为空,所以新程序没有环境变量,也就没有输出;第⼆步中设置了环境变量,所以新程序有环境变量,所以有输出。
四、Task 4: Environment Variables and system()
1、编写task4.c⽂件如下,编译运⾏得到结果如下,观察到输出了环境变量。
2、system()的调⽤格式如下:
int system(const char * string)
System()通过运⾏ shell 程序来执⾏命令的,system()会调⽤fork()产⽣⼦进程,由⼦进程调⽤/bin/sh-c string来执⾏string的命令。此命令执⾏完后随即返回原调⽤的进程。环境变量从调⽤者传给了shell程序,再从shell程序传给了⼦进程 env,故显⽰如上图环境变量。
五、Task 5: Environment Variable and Set-UID Programs
1、编写样例程序如图,利⽤命令gcc -o task5 task5.c进⾏编译。运⾏后得到如下环境变量输出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。