rp-bf:一款Windows下辅助进行ROP gadgets搜索的Rust库

关于rp-bf

rp-bf是一款Windows下辅助进行ROP gadgets搜索的Rust库,该工具可以通过模拟Windows用户模式下的崩溃转储来爆破枚举ROP gadgets。

在很多系统安全测试场景中,研究人员成功劫持控制流后,通常需要将堆栈数据转移到他们所能够控制的内存区域中,以便执行ROP链。但是在劫持控制流时,找到合适的部分很大程度取决于研究人员对CPU上下文场景的控制。那么为了劫持具备任意值的控制流,我们需要找到合适的地址,但这个地址的寻找过程又非常的麻烦,需要涉及到各种地址值、代码指针、堆栈和汇编指令。

为了解决上述问题,rp-bf便应运而生,该工具能够有效地解决上述问题,并通过ROP gadgets搜索来辅助广大研究人员完成ROP链的执行。

依赖组件配置

在使用该工具之前,我们首先需要手动配置好bochscpu模拟器,它也是rp-bf的主要依赖组件。具体的配置方法如下:

1、点击【这里】下载对应操作系统平台的bochscpu组件版本;

2、使用下列命令克隆bochscpu项目代码:

git clone https://github.com/yrp604/bochscpu.git

3、将项目中的lib和bochs目录提取到解压后的bochscpu根目录;

4、使用下列命令验证bochscpu是否构建成功:

cargo build --release

工具下载

广大研究人员可以直接使用下列命令将rp-bf项目源码克隆至本地:

git clone https://github.com/0vercl0k/rp-bf.rs.git

然后切换到项目目录下,并使用cargo build命令完成代码构建:

cargo build --release

工具运行机制

rp-bf能够从根据一个进程快照来模拟目标代码,并能够迭代快照中找到的每一个内存区域,然后将其传递给用户模块。接下来,研究人员就可以用这个地址来执行其他的安全测试了:

pub trait Finder {

    fn pre(&mut self, emu: &mut Emu, candidate: u64) -> Result<()>;

    fn post(&mut self, emu: &Emu) -> Result<bool>;

}

工具使用

获取一个快照

该工具的使用方法适用于所有的操作系统和体系架构,但我们的使用样例会以Windows/Intel为例。

我们可以直接使用Windows调试器生成快照,在Windbg中运行你的目标,然后在所需状态下的所需位置生成崩溃转储(.dump/ma)即可。

搜索算法

rp-bf能够遍历崩溃转储中找到的所有内存区域,然后在模拟器中重新创建相同的执行环境。接下来,它会调用用户的pre条件,并持续执行,直到模拟器退出。此时,工具会调用post条件来让用户决定目标区域是否合适,模拟器的状态(即内存和CPU上下文)将被不断恢复和刷新。

pub fn explore(opts: &Opts, finder: &mut dyn Finder, ui: &mut dyn ui::Ui) -> Result<Vec<Candidate>> {

    // ...

    for (mem_address, mem_block) in dump.mem_blocks() {

        // ...

        'outer: for candidate in mem_block.range.start..mem_block.range.end {

            // ...

            // Invoke the `pre` callback to set-up state.

            trace!("Trying out {candidate:#x}");

            finder.pre(&mut emu, candidate)?;

 

            // Run the emulation with the candidate.

            let (res, stats) = emu.run()?;

            how_many_total += 1;

 

            // We found a candidate if it lead to a crash & the `post` condition

            // returned `true`.

            let crashed = matches!(res, TestcaseResult::Crash);

            let found_candidate = crashed && finder.post(&emu)?;

            

            // ...

            emu.restore()?;

            // ...

        }

    }

}

从用户模式Windows崩溃转储模拟代码

该工具所使用的模拟器都使用了bochscpu库的Bochs CPU模拟器。为了在Bochs中重新创建执行环境,rp-bf将构建页面表以重新创建用户模式转储中可用的相同虚拟环境。

编写一个Finder模块

Finder模块需要提供一个pre方法和一个post方法:

pub trait Finder {

    fn pre(&mut self, emu: &mut Emu, candidate: u64) -> anyhow::Result<()>;

    fn post(&mut self, emu: &Emu) -> anyhow::Result<bool>;

}

pre方法接收一个指向模拟器的可变引用,以及候选内存区域,我们可以在运行时环境中的某个位置“注入”候选区域。它能够将寄存器设置为候选值,或者将其写入内存中的某个位置:

impl Finder for Pwn2OwnMiami2022_2 {

    fn pre(&mut self, emu: &mut Emu, candidate: u64) -> Result<()> {

        // Here, we continue where we left off after the gadget found in |miami1|,

        // where we went from constrained arbitrary call, to unconstrained arbitrary

        // call. At this point, we want to pivot the stack to our heap chunk.

        //

        // ```

        // (1de8.1f6c): Access violation - code c0000005 (first/second chance not available)

        // For analysis of this file, run !analyze -v

        // mfc140u!_guard_dispatch_icall_nop:

        // 00007ffd`57427190 ffe0            jmp     rax {deadbeef`baadc0de}

        //

        // 0:011> dqs @rcx

        // 00000000`1970bf00  00000001`400aed08 GenBroker64+0xaed08

        // 00000000`1970bf08  bbbbbbbb`bbbbbbbb

        // 00000000`1970bf10  deadbeef`baadc0de <-- this is where @rax comes from

        // 00000000`1970bf18  61616161`61616161

        // ```

        self.rcx_before = emu.rcx();

 

        // Fix-up @rax with the candidate address.

        emu.set_rax(candidate);

 

        // Fix-up the buffer, where the address of the candidate would be if we were

        // executing it after |miami1|.

        let size_of_u64 = std::mem::size_of::<u64>() as u64;

        let second_qword = size_of_u64 * 2;

        emu.virt_write(Gva::from(self.rcx_before + second_qword), &candidate)?;

 

        // Overwrite the buffer we control with the `MARKER_PAGE_ADDR`. Skip the first 3

        // qwords, because the first and third ones are already used to hijack flow

        // and the second we skip it as it makes things easier.

        for qword_idx in 3..18 {

            let byte_idx = qword_idx * size_of_u64;

            emu.virt_write(

                Gva::from(self.rcx_before + byte_idx),

                &MARKER_PAGE_ADDR.u64(),

            )?;

        }

 

        Ok(())

    }

    // ...

}

模拟完成后便会调用post方法,我们可以在这里找到你想要的内容,即堆栈数据和可控制的@rip值等数据,这里还允许我们指定需要实现的特定需求:

impl Finder for Pwn2OwnMiami2022_2 {

    // ...

    fn post(&mut self, emu: &Emu) -> Result<bool> {

        // Let's check if we pivoted into our buffer AND that we also are able to

        // start a ROP chain.

        let wanted_landing_start = self.rcx_before + 0x18;

        let wanted_landing_end = self.rcx_before + 0x90;

        let pivoted = has_stack_pivoted_in_range(emu, wanted_landing_start..=wanted_landing_end);

 

        let mask = 0xffffffff_ffff0000;

        let rip = emu.rip();

        let rip_has_marker = (rip & mask) == (MARKER_PAGE_ADDR.u64() & mask);

        let is_interesting = pivoted && rip_has_marker;

 

        Ok(is_interesting)

    }

}

post方法返回值之后,模拟器会恢复内存和CPU寄存器,并继续寻找下一个候选区域。

工具运行演示

许可证协议

本项目的开发与发布遵循MIT开源许可证协议。

项目地址

rp-bf:【GitHub传送门】

参考资料

Competing in Pwn2Own ICS 2022 Miami: Exploiting a zero click remote memory corruption in ICONICS Genesis64

GitHub - yrp604/bochscpu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iZotope RX 10.4.2 mac激活版 音频修复和增强工具

iZotope RX 10 for Mac是一款专业的音频修复软件&#xff0c;旨在提供强大、精确的工具&#xff0c;让用户能够清晰、纯净地处理音频。以下是其主要功能和特点&#xff1a; 软件下载&#xff1a;iZotope RX 10.4.2 mac激活版下载 强大的降噪功能&#xff1a;iZotope RX 10采用了…

P1228 地毯填补问题

地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里&#xff0c;有一座宫殿。宫殿里有个四四方方的格子迷宫&#xff0c;国王选择驸马的方法非常特殊&#xff0c;也非常简单&#xff1a;公主就站在其中一个方格子上&#xff0c;只要谁能用地毯将除公主站立的地方外的所有地…

IMX6LL|打造自己的驱动总线

xbus&#xff1a;打造自属的驱动总线 驱动总线 软件与硬件代码分离&#xff0c;提高程序的复用性 device–关联硬件代码driver_devices–关联软件代码bus_type–统一管理、设置match匹配规则 设备驱动模型体现分离思想 bus-xbus-devices-drivers 总线管理 buses_init()函…

贪吃蛇---C语言---详解

引言 C语言已经学了不短的时间的&#xff0c;这期间已经开始C和Python的学习&#xff0c;想给我的C语言收个尾&#xff0c;想起了小时候见过别人的老人机上的贪吃蛇游戏&#xff0c;自己父母的手机又没有这个游戏&#xff0c;当时成为了我的一大遗憾&#xff0c;这两天发现C语…

C++ 之LeetCode刷题记录(二十四)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 119. 杨辉三角 II 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowI…

基于stm32F4卷积神经网络手写数字识别项目

加我微信hezkz17 可以申请加入嵌入式人工智能技术研究开发交流答疑群&#xff0c;赠送企业嵌入式AI 图像理解/音/视频项目核心开发资料 1 采用CNN BP反向传播算法更新权重系数 2 原理解析 3 实现策略 训练与识别分离&#xff0c;先在电脑上训练好CNN BP神经网络的模型&#…

音视频数字化(数字与模拟-音频广播)

在互联网飞速发展的今天,每晚能坐在电视机前面的人越来越少,但是每天收听广播仍旧是很多人的习惯。 从1906年美国费森登在实验室首次进行无线电广播算起,“广播”系统已经陪伴人们115年了。1916年,收音机开始上市,收音机核心是“矿石”。1920年开始“调幅”广播,1941年开…

又涨又跌 近期现货黄金价格波动怎么看?

踏入2024年一月的下旬&#xff0c;现货黄金价格可以说没了之前火热的状态&#xff0c;盘面上是又涨又跌。面对这样的行情&#xff0c;很多投资者不知道如何看了。下面我们就来讨论一下怎么把握近期的行情。 先区分走势类型。在现货黄金市场中有两种主要的走势类型&#xff0c;一…

WebAssembly核心编程[1]:wasm模块实例化的N种方式

当我们在一个Web应用中使用WebAssembly&#xff0c;最终的目的要么是执行wasm模块的入口程序&#xff08;通过start指令指定的函数&#xff09;&#xff0c;要么是调用其导出的函数&#xff0c;这一切的前提需要创建一个通过WebAssembly.Instance对象表示的wasm模块实例(源代码…

基于flask的个人博客项目从0到1

项目展示(持续完善中…) 首页 文章时间线页面 笔记页面 留言页面 关于页面 后台页面-文章管理 后台页面-笔记页面 后台页面-分类 后台管理-新增标签 后台管理-标签页面 后台管理-新增标签 后台管理-关于页面 2.项目详述 该博客开源地址点击跳转&#xff0c;该项目已部署上…

【代码随想录19】235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

目录 235.二叉搜索树的最近公共祖先题目描述参考代码 701.二叉搜索树中的插入操作题目介绍参考代码 450.删除二叉搜索树中的节点题目描述参考代码 235.二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖…

自治系统 AS 、路由选择协议、

目录 路由算法分类&#xff08;自适应&#xff09; 分层次的路由选择协议 自治系统 AS (Autonomous System) 2 大类路由选择协议 自治系统和内部网关协议、外部网关协议 路由选择协议属于网络层控制层面的内容 路由算法分类&#xff08;自适应&#xff09; 分层次的路由选…

vue3中多个表格怎么同时滚动并且固定表头

说明&#xff1a;这里需分为两种情况来做。第一种亲情况就是没有修改过el-table这个组件的样式&#xff1b;第二种情况就是修改过el-table组件的样式。第一种较为简单就简单略过&#xff0c;这里主要提及第二种做法。 1.需求效果 2.第一种没有修改过el-table这个组件的样式的做…

存内计算技术—解决冯·诺依曼瓶颈的AI算力引擎

文章目录 存内计算技术背景CSDN首个存内计算开发者社区硅基光电子技术存内计算提升AI算力知存科技存算一体芯片技术基于存内计算的语音芯片的实现挑战 参考文献 存内计算技术背景 存内计算技术是一种革新性的计算架构&#xff0c;旨在克服传统冯诺依曼架构的瓶颈&#xff0c;并…

详讲api网关之kong的基本概念及安装和使用(二)

consul的服务注册与发现 如果不知道consul的使用&#xff0c;可以点击上方链接&#xff0c;这是我写的关于consul的一篇文档。 upstreamconsul实现负载均衡 我们知道&#xff0c;配置upstream可以实现负载均衡&#xff0c;而consul实现了服务注册与发现&#xff0c;那么接下来…

防御第五次作业-防火墙综合实验(nat、双机热备、带宽、选路)

目录 拓扑图 要求 1 2 3 4 5 办公区上网用户限制流量不超过60M 销售部限流 6 7 拓扑图 说明&#xff1a;基本配置完成。所有设备均可出网。 要求 1.办公区设备可以通过电信和移动两条链路上网&#xff0c;且需要保留一个公网ip不能用来转换。 2.分公司设备可以通…

CANoe实际项目中文件夹的规划

本人&#xff0c;之前设计了一个CANoe工程&#xff0c;由于工程设计之初没有设计好文档的归纳分类&#xff0c;导致文件查找起来非常费劲。 为了避免以后出现文件混乱&#xff0c;不可查找的问题&#xff0c;故特此归纳说明。 建立工程时&#xff1a; 第1步就应该设计好文档…

InputNumber数字输入框(antd-design组件库)简单使用

1.InputNumber数字输入框 通过鼠标或键盘&#xff0c;输入范围内的数值。 2.何时使用 当需要获取标准数值时。 组件代码来自&#xff1a; 数字输入框 InputNumber - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-demo:hello-world react项目antd组件-demo:hello…

采用GaussDB(for MySQL)完成商场会员卡管理系统设计

这篇文章介绍了如何购买、配置、连接、测试 GaussDB数据库&#xff0c;并且最终采用Qt开发了一个具体的软件演示了数据库的具体应用&#xff0c;演示了数据库整体的使用过程。 一、什么是GaussDB&#xff1f; GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布…

排序链表---归并--链表OJ

https://leetcode.cn/problems/sort-list/submissions/499363940/?envTypestudy-plan-v2&envIdtop-100-liked 这里我们直接进阶&#xff0c;用时间复杂度O(nlogn)&#xff0c;空间复杂度O(1)&#xff0c;来解决。 对于归并&#xff0c;如果自上而下的话&#xff0c;空间复…