2021-2022-1 20212814《Linux内核原理与分析》第十二周作业

一、在实验楼上进行实验出现错误

如图所示:

所以接下来的实验在自己的虚拟机上完成。

二、在自己的虚拟机上完成实验

安装32位c语言程序编译器,sudo apt-get lib32z1 libc6-dev-i386sudo apt-get install lib32readline6-dev准备32位实验环境

 

 在实际中为了防范缓冲区溢出等攻击,通常会降低shell程序的权限,即无法保持root权限,为了绕过这个问题,我们使用另一个shell程序,zsh来代替/bin/bash 。并且上面说过,现在为了防止代码的注入,操作系统对于代码所分配的堆栈地址都是随机的,这也不利于我们找到之后我们需要找到的/bin/sh``system函数``exit函数的地址完成地址注入,所以我们要事先关闭掉地址随机化

新建 retlib.c 文件

 编译该程序,并设置 SET-UID。命令如下:

上述程序有一个缓冲区溢出漏洞,它先从一个叫 badfile 的文件里把 40 字节的数据读取到 12 字节的 buffer,引起溢出。fread() 函数不检查边界所以会发生溢出。由于此程序为 SET-ROOT-UID 程序,如果一个普通用户利用了此缓冲区溢出漏洞,他有可能获得 root shell。应该注意到此程序是从一个叫做badfile的文件获得输入的,这个文件受用户控制。现在我们的目标是为 badfile 创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个 root shell。

我们还需要用到一个读取环境变量的程序,新建 getenvaddr.c 文件,文件内容如下:

 编译一下:

新建 exploit.c 文件,内容如下:

代码中“0x11111111”、“0x22222222”、“0x33333333”分别是 BIN_SH、system、exit 的地址,需要我们接下来获取。

用刚才的 getenvaddr 程序获得 BIN_SH 地址:

gdb 获得 system 和 exit 地址:

 修改 exploit.c 文件,填上刚才找到的内存地址:

 删除刚才调试编译的 exploit 程序和 badfile 文件,重新编译修改后的 exploit.c:

先运行攻击程序 exploit,再运行漏洞程序 retlib:

 此时并没有出现预期的结果,原因可能是/bin/sh没有指向zsh。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值