10.pwn ROP(栈溢出攻击的核心)

随着 NX (Non-eXecutable) 保护的开启,传统的直接向栈或者堆上直接注入代码的方式难以继续发挥效果,由此攻击者们也提出来相应的方法来绕过保护。

目前被广泛使用的攻击手法是 返回导向编程 (Return Oriented Programming),其主要思想是在 栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。

gadgets 通常是以 ret 结尾的指令序列,通过这样的指令序列,我们可以多次劫持程序控制流,从而运行特定的指令序列,以完成攻击的目的。

返回导向编程这一名称的由来是因为其核心在于利用了指令集中的 ret 指令,从而改变了指令流的执行顺序,并通过数条 gadget “执行” 了一个新的程序。

使用 ROP 攻击一般得满足如下条件:

  • 程序漏洞允许我们劫持控制流,并控制后续的返回地址。

  • 可以找到满足条件的 gadgets 以及相应 gadgets 的地址。

作为一项基本的攻击手段,ROP 攻击并不局限于栈溢出漏洞,也被广泛应用在堆溢出等各类漏洞的利用当中。

需要注意的是,现代操作系统通常会开启地址随机化保护(ASLR),这意味着 gadgets 在内存中的位置往往是不固定的。但幸运的是其相对于对应段基址的偏移通常是固定的,因此我们在寻找到了合适的 gadgets 之后可以通过其他方式泄漏程序运行环境信息,从而计算出 gadgets 在内存中的真正地址。

很多情况下,程序中我们能够利用的只有栈,也就是说,程序中没有一个可读可写可执行的区域让我们输入shellcode。同时,大多数题目也不会那么好心给你留一个后门函数直接执行system。那么这个时候,我们就要利用ROP

ROP全称Return Oriented Programming,也就是返回导向编程
说人话,就是程序中以一堆ret来完成代码逻辑
由于我们不能运行shellcode,也没有后门函数一步到位。
我们可以利用程序中的一些指令片段,一点点拼接起来,:拼成我们想要的样子,
怎么拼?

拿system(“/bin/sh”);举例
我们要将rdi改成/bin/sh这个字符串的地址,然后call system。
不能执行shellcode,怎么改?
我们有栈!
pop rdi ret + /bin/sh addr

不能shellcode,怎么cali?
我们有ret!
所以,我们构造的payload就是
padding + pop rdi; ret + /bin/sh + system

ROP就是搭积木,用一个个小小的片段来完成复杂的工作,基本只需要用到栈这些小小的积木,我们称之为gadget
怎么找gadget呢?
ropper & ROPgadgets

通用ROP:
在 64 位程序中,!函数的前6个参数是通过寄存器传递的,但是大多数时候,我们很难找到每-个寄存器对应的 gadgets。
这时候,我们可以利用x64下的 libc csu init 中的 gadgets。
这个函数是用来对 libc 进行初始化操作的,而一般的程序都会调用 libc 函数所以这个函数一定会存在。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网安+硬件

生活不易,但愿极客精神与你同在

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值