作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第十一周作业> |
这个作业的目标 | <Linux安全实验> |
作业正文 | 本文连接 |
实验
初始设置
关闭地址空间随机化设置:
/bin/sh 实际是指向 /bin/bash 或 /bin/dash 的一个符号链接,使用另一个 shell 程序(zsh)代替 /bin/sh,来指向/bin/bash 或 /bin/dash。
由于虚拟机本身是32位系统,所以不需要再使用Linux32来进入32位环境。
shellcode
观察相应的代码,并生成汇编版本:
对应的汇编版本为:
x31xc0x50x68"//sh"x68"/bin"x89xe3x50x53x89xe1x99xb0x0bxcdx80
漏洞程序
在/tmp目录下建立stack.c文件:
通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
编译该程序,并设置 SET-UID。
GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。 而 -z execstack 用于允许执行栈。
攻击程序
在 /tmp 目录下新建一个 exploit.c 文件:
目的是攻击刚才的漏洞程序,并通过攻击获得 root 权限。
注意代码中,x??x??x??x?? 处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。
要得到shellcode在内存中的地址,输入命令进入gdb调试:
esp中就是str的起始地址,所以我们在地址0x080484ee处设置断点:
之后运行调试,并且观察相应的esp寄存器中的内容。
根据语句 strcpy(buffer + 100,shellcode);
计算 shellcode 地址为 0xbfffee30 + 0x64 = 0xbfffee94.
现在修改 exploit.c 文件,将 x??x??x??x?? 修改为计算的结果 x94xeexffxbf,注意顺序是反的。
编译 exploit.c 程序
攻击结果
出现错误:
修改相应的栈内存分配:
实现提权。