2020-2021-1 20209309《Linux内核原理与分析》第十一周作业

作业信息

这个作业属于哪个课程 <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 程序

攻击结果

出现错误:

修改相应的栈内存分配:

实现提权。

原文地址:https://www.cnblogs.com/yanzs/p/14163557.html