MIPS架构下缓冲区溢出实战(GDB版)
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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寄存器和
t9寄存器和gp寄存器来找数据,地址等。而我们跳转的地址修改了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
以上是关于MIPS架构下缓冲区溢出实战(GDB版)的主要内容,如果未能解决你的问题,请参考以下文章