【⽹络攻防技术】实验六——环境变量与set-uid实验
⽂章⽬录
⼀、实验题⽬
本实验室的学习⽬标是让学⽣了解环境变量如何影响程序以及系统⾏为。环境变量是⼀组动态命名值,可以影响正在运⾏的进程将在计算机上运⾏。⼤多数操作系统都使⽤它们,因为它们是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,该系统调⽤能够打印出当前进程的环境变量。
保存和编译⽂件,发现执⾏结果为空:
查询函数execve()的作⽤,其调⽤格式如下:
int execve(const char * filename,char * const argv[],char * const envp[])
第⼀个参数为⼀个可执⾏的有效的路径名。第⼆个参数系利⽤数组指针来传递给执⾏⽂件,argv是要调⽤的程序执⾏的参数序列,也就是我们要调⽤的程序需要传⼊的参数。envp则为传递给执⾏⽂件的新环境变量数。
所以在此处,我们赋予新进程的环境变量为空,⾃然印出环境变量结果为空。
(2)把execve()的调⽤改为以下内容,观察结果
将原语句换为:execve("/usr/bin/env", argv, environ);
重新保存和编译⽂件,得到如下结果:
(3)从以上实验可以看出,execve()产⽣的新进程的环境变量⼜调⽤时重新赋予,⽽fork()则是直接继承⽗进程环境变量。
4.Task 4: Environment variables and system()
(1)保存代码⾄task4.c并编译得到结果:
环境变量path误删有影响吗
(2)查阅资料得system()的调⽤格式如下:
system()会调⽤fork()产⽣⼦进程,由⼦进程来调⽤/bin/sh-c string来执⾏参数string字符串所代表的命令,此命>令执⾏完后随即返回原调⽤的进程。在调⽤system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
具体个描述为这样三个步骤:调⽤fork()函数新建⼀个⼦进程;在⼦进程中调⽤exec函数去执⾏command;在⽗进程中调⽤wait去等待⼦进程结束。
返回值 =-1:出现错误 =0:调⽤成功但是没有出现⼦进程 >0:成功退出的⼦进程的id 如果system()在调⽤/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回⾮零值>。如果system()调⽤成功则最后会返回执⾏shell命令后的返回值,但是此返回值也有可能为 system()调⽤/bin/sh失败所返回的127,因此最好能再检查errno 来确认执⾏成功。
Task 5: Environment variable and Set-UID Programs int system (const char * string )
1

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