MIPS架构下缓冲区溢出实战(GDB版)

文件下载地址:https://github.com/praetorian-code/DVRF
下载来后解压缩,发现有两个文件
在这里插入图片描述

我们可以使用binwalk来检查下.bin固件
在这里插入图片描述

从结果中我们可以看到这是squashfd文件系统,还可以知道字节序为小端格式
可以使用下图命令提取固件
在这里插入图片描述

这时在路径下将会新增一个文件夹,里面包含了我们解压出来的文件
在这里插入图片描述

进入这个文件夹可以看到有有一个名为squash-root的文件夹,里面就是该固件的文件系统
在这里插入图片描述

接下来我们来挑战一个项目,stack_bof_01,可通过栈溢出漏洞进行利用,当然了这是mips的架构,我们需要使用gchroot通过qemu-mipsel来模拟
文件路径如下,同时使用file命令查看
在这里插入图片描述

可知,这是32位mips小端可执行文件
接下来我们使用qemu做一个虚拟环境
如下所示将相关文件拷贝到当前目录下
在这里插入图片描述

我们使用下面的命令模拟执行,输入test123作为测试
在这里插入图片描述

可以看到程序打印出了you entered test123,try again

接下来再打开一个终端
原终端加上参数-g 1234同时输入AAAA,-g 1234表示该程序将被远程调试,端口为1234
即:sudo chroot . ./qemu-mipsel-static –g 1234 ./pwnable/Intro/stack_bof_01 AAAA
新开的终端命令如下如图,-multiartch是为了支持其他架构用的,比如我们这里的mips架构
在这里插入图片描述

设置架构为mips
在这里插入图片描述

设置ip和端口
在这里插入图片描述

按c继续执行,可以看到程序异常终止了,同时在另一个终端这儿也打印出了try again
在这里插入图片描述

第一次做mips下的题,我们先来看看源码吧
在这里插入图片描述

可以看到,这里出现了一个很危险的函数strcpy
这里调用 strcpy(buf,argv[0]) 函数,没有考虑到长度的问题,所以很明显存在栈溢出漏洞。
在左边的函数列表里,我们还可以发现其中的一个后门函数。这个函数直接调用了 system(“/bin/sh -c”) 来进行 getshell
所以这里很明显可以通过栈溢出来控制返回地址到这个函数,进行 getshell
再次调试
在这里插入图片描述在这里插入图片描述

为了确定需要填充的缓冲区长度,我们需要一个可以随机生成字符的脚本
在这里插入图片描述

我们先随机生成300个
在这里插入图片描述

将生成的字符串复制给那个程序,同时gdb配合调试
在这里插入图片描述

按c继续
在这里插入图片描述

报错了,看看寄存器
在这里插入图片描述

可以看到pc寄存器的值被0x41386741覆盖了
将该值转成为A8gA
考虑到小端序,实际为Ag8A
我们看看他的长度
在这里插入图片描述

可以看到偏移是204

那么现在的攻击思路就有了
:用前204个字符(Ag8A之前的所有字符)和函数dat_shell()的地址重写缓冲区
那就先生成204个
在这里插入图片描述

然后加上dat_shell的地址
反汇编dat_shell函数
在这里插入图片描述

得到地址为0x400950,如下图所示输入
调试看看
在这里插入图片描述

还是报错了,并没有像我们预期的一样
为什么会出错呢,我们看看寄存器的值
在这里插入图片描述

注意到gp寄存器(全局指针)的值被覆盖了
查询资料可知
我们访问了非法内存,异常了。原因在于,在MIPS中,函数内部会通过 t 9 寄 存 器 和 t9寄存器和 t9gp寄存器来找数据,地址等。而我们跳转的地址修改了gp寄存器。
回去看之前返汇编dat_shell的截图,注意到前三条指令中用到了gp寄存器,而我们并不希望此时使用这个指针,所以应该跳到/0x40095c
修改后可以看到如下图所示
在这里插入图片描述

漏洞利用成功了。
参考:
其他值得练习的小程序https://github.com/praetorian-code/DVRF
1.另一种漏洞利用的思路:https://p16.praetorian.com/blog/getting-started-with-damn-vulnerable-router-firmware-dvrf-v0.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值