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

news/2024/9/23 8:41:41/

随着 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 函数所以这个函数一定会存在。


http://www.ppmy.cn/news/1474288.html

相关文章

Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成

Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 题目: 将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 举个例子:输入[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”] 输出…

缓存-缓存使用2

1.缓存击穿、穿透、雪崩 1.缓存穿透 指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此纪录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询&a…

迅为RK3588开发板RKNPU2项目实战2SORT目标追踪

1.介绍和视频演示2.在模拟器实现图片的目标追踪3.连板推理和嵌入式部署4.视频目标追踪的实现(python)5.C实现目标追踪性能强--iTOP-3588开发板采用瑞芯微RK3588处理器,是全新一代ALoT高端应用芯片,采用8nm LP制程,搭载八核64位CPU&#xff0c…

反弹球python小游戏

1.准备图片(可以替换) 2.python Pygame类 class Ls(pygame.sprite.Sprite):def __init__(self,pos):#pos 鼠标点击的位置super().__init__()self.image pygame.image.load(ji.png)self.dx2self.dx r.randint(20,500)self.image pygame.transform.scale(self.image,(self.dx…

Node.js实现一个文章生成器

前言 本文将从零开始,讲解如何使用Node.js来实现一个文章生成器 node里面有很多优秀的模块,现在我们就借助node的fs模块来操控文本,来实现我们想要的效果 效果展示 体验 fs 首先我们先创建一个json文件 里面放一些内容 接下来我们书写代码…

pytorch-RNN实战-正弦曲线预测

目录 1. 正弦数据生成2. 构建网络3. 训练4. 预测5. 完整代码6. 结果展示 1. 正弦数据生成 曲线如下图: 代码如下图: 50个点构成一个正弦曲线随机生成一个0~3之间的一个值(随机的原因是防止每次都从相同的点开始,50个点的正弦曲…

CLIP-EBC:通过增强的逐块分类,CLIP能够准确计数

摘要 https://arxiv.org/pdf/2403.09281v1 CLIP(Contrastive Language-Image Pretraining,对比语言-图像预训练)模型在识别问题中表现出了卓越的性能,如零样本图像分类和对象检测。然而,由于其固有的挑战——即将计数(一项回归任务)转化为识别任务,CLIP在计数方面的能…

python 10个自动化脚本

目录 🌟 引言 📚 理论基础 🛠️ 使用场景与代码示例 场景一:批量重命名文件 场景二:自动下载网页内容 场景三:数据清洗 场景四:定时执行任务 场景五:自动化邮件发送 场景六…