前言
- 关于ROP
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)
ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。 - 本系列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