高级栈溢出技术—ROP实战(ret2csu)

本文详细介绍了高级栈溢出技术中的ret2csu,涉及ROP(返回导向编程)原理,ret2csu的相关知识点,包括radare2、汇编、gdb、ROPGadget、pwntools等工具的使用,以及如何在缺乏特定gadgets时解决问题。通过一个具体的实验案例,阐述了如何通过return to csu技巧来设置rdx寄存器,最终完成目标函数的调用。文章还提供了实验目的、环境和详细步骤,帮助读者深入理解并实践ROP技术。

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

预备知识

关于ROP

ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。
ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。

本系列rop实战题目的背景

来自ROPEmporium,旨在通过解决一系列挑战来一步步进阶学习ROP利用技术。

ret2csu涉及知识点

1)radare2使用(相关专栏:radare2实战)。
2)汇编程序(阅读、分析,要求熟悉相关指令、寄存器等)。
3)gdb使用。
4)ROPGadget使用。
5)pwntools使用(相关实验:基于pwntools编写pwn代码)。
6)操作系统保护机制。
7)IDA使用。
8)缺少合适的rop gadgets时的处理技巧。
9)Blackhat2018议题(return to csu)。

实验目的

通过该实验学习ROP概念及其思路,了解高级栈溢出时需要注意的事项,并掌握解决方法,同时通过练习给出的关卡来增强实践能力。

实验环境

服务器:kali,IP地址:随机分配
题目文件与源码请在实验机内下载使用:http://tools.hetianlab.com/tools/ROP/8.zip

实验步

<think>嗯,用户问的是CTFShow平台上PWN类别的第25题的解题思路或者Writeup。首先,我需要回忆一下相关的题目内容。根据用户提供的引用[1],题目中存在一个函数writesomething(),里面有一个缓冲区buf[128],但read函数读取了0x200uLL的数据,这明显超过了缓冲区的容量,造成了栈溢出漏洞。这说明这题可能是一个典型的栈溢出利用题。 接下来,我需要确认题目的保护机制,比如NX、Canary、PIE是否开启。通常CTF的PWN题可能会关闭部分保护机制,例如如果没有Canary的话,直接溢出覆盖返回地址即可。根据常见的解题步骤,可能需要利用ret2csu技术,因为引用[1]中提到了这个提示。ret2csu通常用于在无法找到足够gadgets的情况下,通过__libc_csu_init中的gadgets来构造ROP链,控制rdx等寄存器,进而执行系统调用。 然后,用户可能需要泄露libc地址。常见的做法是通过溢出执行puts或write函数,输出某个函数的got表地址,从而计算libc基址。例如,可以覆盖返回地址为puts的plt条目,参数设置为read的got地址,这样就能泄露read的实际地址,再根据libc版本计算偏移得到system和/bin/sh的地址。 在构造ROP链时,需要注意栈的布局。首先溢出到返回地址,执行泄露libc的步骤,然后再次触发溢出,执行system("/bin/sh")。这里可能需要两次输入,第一次泄露地址,第二次发送最终的payload。 另外,需要确认题目提供的二进制文件中是否有可用的gadgets,特别是pop rdi; ret这样的常用gadget,用于设置参数。如果没有,可能需要依赖csu中的gadgets来设置rdx、rsi等寄存器。 用户可能需要使用工具如checksec查看保护措施,用ROPgadget寻找gadgets,用pwntools编写exp脚本。在编写过程中,要注意地址的对齐和填充的正确性,确保覆盖到返回地址的位置。此外,可能需要处理栈的偏移,确定buf到返回地址的距离,比如题目中的buf位于[rbp-0x80],所以可能需要填充0x80字节加上rbp的8字节,总共0x88字节才能覆盖到返回地址。 如果题目中使用了ret2csu,那么可能需要利用两次csu的gadget,第一次设置寄存器,第二次调用函数。例如,设置rdi、rsi、rdx的值,然后调用read或execve函数。这里需要注意寄存器的正确设置,以及参数传递的顺序。 最后,用户可能需要参考CTF Wiki中的相关章节,比如ret2csu的利用方法,或者查阅已有的Writeup来获取更详细的信息。引用[2]中提到的CTF Wiki资源可能会有帮助,用户可以去该网站查找具体的利用技巧和示例。</think>根据题目描述和代码分析,CTFShow PWN 第25题属于典型的栈溢出+ret2csu类型题目。以下是解题思路: ### 一、漏洞分析 1. 关键函数`writesomething()`中定义栈缓冲区: ```c char buf[128]; // [rsp+0h] [rbp-80h] return read(0, buf, 0x200uLL); // 允许读取512字节数据[^1] ``` 2. 缓冲区大小128字节(0x80),但允许读取0x200字节数据,存在明显的栈溢出漏洞 ### 二、利用步骤 1. **计算偏移量**: - 缓冲区起始地址为`rbp-0x80` - 需要覆盖的返回地址位于`rbp+8` - 填充长度 = 0x80 + 8 = 136字节 2. **利用ret2csu技术**: ```python # 通用csu gadget结构 pop_rbx_rbp_r12_r13_r14_r15 = 0x4008DA # gadget1 mov_rdx_r13_rsi_r14_edi_r15 = 0x4008C0 # gadget2 ``` 3. **构造ROP链**: ```python payload = flat([ b'A'*136, # 第一次csu调用:设置寄存器值 pop_rbx_rbp_r12_r13_r14_r15, 0, 1, func_ptr, arg1, arg2, arg3, mov_rdx_r13_rsi_r14_edi_r15, # 第二次csu调用:执行目标函数 ... ]) ``` ### 三、完整利用流程 1. 泄露libc地址:通过`write(1, got_entry, 8)` 2. 计算`system`地址:`libc_base = leaked_addr - libc.symbols['write']` 3. 获取`/bin/sh`字符串地址:`next(libc.search(b'/bin/sh'))` 4. 最终执行`system("/bin/sh")`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值