实验6:环境变量与set-uid实验
在本实验室中,学生将了解环境变量是如何工作的,它们是如何从父进程到子进程,以及它们如何影响系统/程序行为。我们特别感兴趣的是如何环境变量影响Set-UID程序的行为,这些程序通常是特权程序。
使用fork()函数创建一个子进程,分别在父子进程中打印环境变量
使用`diff`命令发现父子进程的环境变量相同,说明子进程会继承父进程的环境变量,还包括父进程的堆栈、内存等,但进程id和fork()函数返回值不同
system()函数也可以用来执行新的程序,与`execve()`函数不同,system()函数实际上执行"/bin/sh -c命令",即打开了一个新的shell,并要求shell执行该命令
我们在seed用户下使用export命令设置环境变量,我们设置的Task5=Task5 被成功传入,但 LD_LIBRARY_PATH 传入失败;
由于/bin/sh默认链接到dash,而dash的保护机制会组织有效ID和真实ID不一致的程序的执行,所以需要将/bin/sh链接到zsh
把假的ls文件所在的目录添加到PATH环境变量的开头,这时再使用system()函数调用ls执行的就是我们写的ls程序
eid指的是用户的有效用户ID(effective user ID),也就是用户在执行特定进程时所拥有的权限
将我们编写的ls程序加上调用`id`命令的语句,发现打印的eid是root,证明文件执行时是以root权限执行的
这里只是修改了sleep函数,但实际攻击中可以放入恶意代码,当用户的正常程序链接到我们的恶意动态库时就会执行这些恶意代码
环境变量LD_PRELOAD用于在程序运行时强制优先加载指定的共享库文件。这个功能可以用来替换已经存在的库中的函数或者添加新的函数,修改这个环境变量到我们的动态链接库