PWN! PWN! PANG! Part6
呼~好久没有玩PWNPWN车了 (又再次摆烂的PGR)
本篇文章给大家来谈谈ROP
什么是ROP
ROP寄存器(?
不存在的啦 233 = =
ROP是Return Oriented Programming(返回导向编程)的简称
“又是专业术语?? 整天术语!术语!术语!”
ww,别打了(, 这就简单讲解嘛= =
ROP是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。通过前几篇文章的介绍,我们可以发现栈溢出的控制点是ret处(也就是子函数的ret addr),那么ROP的核心思想就是利用以ret结尾的指令序列(gadgets)把栈中的应该返回EIP的地址更改成我们需要的值,从而控制程序的执行流程。
还不够简单?
QAQ, 我们首先了解一下为什么要用到ROP
为什么需要ROP
我们很容易就发现,前几次的PWN攻击都是通过栈溢出篡改函数返回地址来一次性使程序跳转到某个恶意地址(后门函数或者shellcode),从而getshell
然而,并不是每一次都是有那么好的运气的,程序猿写后门函数的肯定少,在加上各种程序的保护机制,导致想要跳转到shellcode也不大可能
这个时候,就该ROP上场了
ROP的过程的简单介绍
我们思考一下,我们之前通过栈溢出覆盖掉了函数的返回地址,那么既然是溢出,我们也可以溢出覆盖更多数据,从而控制更多内容。
栈溢出的目的是控制程序执行流,如果一次不能实现返回到一个恶意地址来getshell,那么就需要让程序执行流在我们的控制之中,通过多次操作,让程序反复横跳多次跳转并执行恶意指令
现在来看一看手上能用的东西
-
乖乖躺在一边任凭我们折腾的栈
-
程序本身的一些代码小片段(即下文提到的gadget)
gadget
谈到ROP就必须讲到gadgets, gadget指程序的一些代码片段
我们可以通过返回到含有pop
和ret
(比如pop eax; ret;
)的gadgets的地址来实现特定操作而又使程序的执行流还在我们的控制中
由于栈是受我们的控制的,我们可以在栈中写入任意的内容
不妨设我们在覆盖了ret addr后又覆盖了一些内容
ret addr – gadget A(
pop eax; ret;
)地址0xb
gadget B 地址
这样我们就构造了一个简单的ROP链
来模拟一下此时被搞得不成样子的程序的执行过程= =
由于ret addr被覆盖掉了w, 程序下一步会去执行gadget A
首先执行pop eax
,这个时候栈中的0xb
就会被弹到eax寄存器中
然后是ret, 程序又被强迫去执行gadget B了.UwU.
由此类推,接下来攻击者可以让程序执行更多的gadget, 从而getshell
害,又是一个被骗入传销组织的小程序,可怜啊 bushi)
实际上, gadget可以理解成一个一个小的积木块,通过构造ROP链把一个个gadget拼凑起来,就构成了完成整个攻击流程的payload
如何获取gadget
上面扯了这么多,在最后我推荐几个好用的获取gadget的工具
ROPgadget
这款工具主要是帮助你找到合适的gadget
安装方法
sudo apt install python3-pip
sudo -H python3 -m pip install ROPgadget
获取使用指南
ROPgadget --help
简单举例几个常用命令
ROPgadget --binary 程序 --ropchain
#直接构造一个ROP链
ROPgadget --binary 程序 --only "pop|ret"
#只寻找含有pop ret的gadgets
Onegadget(有一点鸡肋,需要运气成分)
怎么说。。。还是运气不好的时间多= =
这款工具就有点魔法了,它能够帮你找到可能帮助你一次性getshell的gadget
一定注意啊!!是可能
它列出的gadget要能getshell必须满足一定的条件
至于能不能满足这个条件,,
你就一个一个放上去试试呗…
当然没有一个可以用也是非常常见的
安装Onegadge需要提前装好ruby,下面是各Linux安装ruby的方法
deb(Debian 或 Ubuntu)
sudo apt-get install ruby-full
yum(CentOS、Fedora 或 RHEL)
sudo yum install ruby
portage(Gentoo)
sudo emerge dev-lang/ruby
# 安装指定的版本,要在 make.conf 文件中设置 RUBY_TARGETS。详见 Gentoo Ruby Project 网站。
pacman(Arch Linux)
sudo pacman -S ruby
安装Onegadget
gem install one_gadget
使用
one_gadget 程序名
ref
GitHub - david942j/one_gadget: The best tool for finding one gadget RCE in libc.so.6