ROP与SROP技术在Linux Pwn中的应用分析
字数 1535 2025-12-20 12:02:58

ROP与SROP技术在Linux Pwn中的应用分析

一、ROP技术基础

1.1 ROP保护机制RELRO详解

RELRO(Relocation Read-Only)重定位段只读保护分为三个等级:

NO RELRO

  • 保护未开启状态
  • 所有重定位段均可写,包括.dynamic、.got、.got.plt

Partial RELRO

  • GCC编译的默认配置
  • .dynamic、.got被标记为只读
  • 强制将ELF内部数据段.got、.got.plt放到外部数据段.data、.bss之前
  • 防止程序数据段溢出改变内部数据段的值
  • .got.plt仍然可写,可改写GOT表劫持控制流

Full RELRO

  • 继承Partial RELRO的所有保护
  • .got.plt也被标记为只读
  • 延迟绑定技术被禁止
  • 所有外部函数地址在程序装载时解析、装入并标记为只读
  • GOT表中link_map和dl_runtime_resolve项置为0

1.2 特殊参数利用技巧

在Unix/Linux系统中,除了常见的sh参数外,还存在其他可达到RCE效果的参数:

# 示例:利用$0获取shell
# 当sh参数被过滤时,可以使用$0作为替代方案
payload = b'\x24\x30'  # '$0'的小端序表示

1.3 端序处理与内存布局

小端序处理

# 内存中的写入效果:\x24\x30\x00\x73\x91
# 在gdb中呈现:0x4049d0 ◂◂— 0x9173003024 /* '$0' */
# 使用pwntools打包:
p8(0x24) + p8(0x30) + p8(0x00) + p8(0x73) + p8(0x91)

二、SROP技术深入分析

2.1 32位SROP技术

信号帧结构特点

  • sigreturn调用需要80字节(0x50)长度
  • 32位系统调用号较大
  • read函数有足够写入空间,利用read返回值无需提前布局

32位寄存器控制

0x80497d8 <func+22> lea edx, [ebp - 0x12]    ; EDX => 0x80ed9ee
0x80497db <func+25> push edx
0x80497dc <func+26> push 0
0x80497de <func+28> mov ebx, eax             ; EBX => 0x26
0x80497e0 <func+30> call read <read>

利用要点

  • 聚焦栈空间控制而非寄存器
  • 利用压栈操作控制参数
  • 当ebp地址已知时可实现精确控制
  • syscall调用需要0x54字节长度

2.2 64位SROP技术

信号帧完整结构

0byte       | 8byte
syscall     | uc_flags
&uc         | uc_stack.ss_sp
uc_stack.ss_flags | uc_stack.ss_size
r8          | r9
r10         | r11
r12         | r13
r14         | r15
rdi         | rsi
rbp         | rbx
rdx         | rax
rcx         | rsp
rip         | eflags
cs/gs/fs    | err
trapno      | oldmask
(unused)    | cr2 (segfault addr)
&fpstate    | __reserved
sigmask     |

三、高级利用技术

3.1 libc劫持技术

环境配置

# 安装glibc-all-in-one
# 安装patch工具
# 使用patchelf自动切换libc
patchelf --set-interpreter /path/to/ld ./binary
patchelf --set-rpath /path/to/libc ./binary

libc GOT表劫持

  • 劫持libc函数内部的GOT表
  • 利用libc.so.6中函数实现,如puts调用j_strlen()
  • 跳转地址为libc.address + offset
  • 可修改为one-gadget或特定gadget

多次劫持技术

  • 第一次劫持:执行gadget设置one-gadget条件
  • 第二次劫持:执行one-gadget
  • 示例:mov rdx, r10(当r10为0时可设置rdx=0满足ogg条件)

3.2 栈地址泄露技术

利用环境变量

# Python实现栈地址泄露
import os
# 通过环境变量布局获取栈地址信息

四、实战例题分析

4.1 例题一:only_read

gadget查找与利用

0x0000000000401187 : add eax, 0x2ebb ; add dword ptr [rbp - 0x3d], ebx ; nop ; ret

栈帧布局

  • open函数栈帧铺垫
  • read函数栈帧铺垫
  • write函数栈帧铺垫

利用流程

  1. 全部数据写入
  2. 通过leave_ret指令依次执行
  3. 完整的exp编写

4.2 例题二:强网杯stack

关键技术点

  • 连续SROP技术应用
  • 信号帧的精确构造
  • 系统调用链的构建

五、调试与问题解决

5.1 常见问题处理

段错误调试

  • 检查内核架构设置
  • 验证信号帧结构完整性
  • 确认寄存器值正确性

IDA使用技巧

  • 在options→general中开启16进制显示
  • 手动查找特定字节
  • 分析代码段布局

5.2 脚本开发要点

字节查找脚本

# 用于定位特定字节的脚本模板
# 支持小端序效果研究
# 内存映射关系分析

利用脚本结构

  • 参数传递处理
  • 内存布局分析
  • 利用链构造
  • 调试信息输出

六、技术发展趋势

6.1 防护绕过技术

  • 针对Full RELRO的利用方法
  • libc段写入技术发展
  • 新型gadget发现技术

6.2 自动化工具

  • 利用链自动生成
  • 防护检测与绕过
  • 漏洞利用框架集成

本教学文档涵盖了ROP和SROP技术的核心知识点,从基础概念到高级利用技术,包括32位和64位系统的差异处理,以及实际例题的详细分析。重点突出了信号帧构造、libc劫持、防护绕过等关键技术,为深入理解Linux Pwn技术提供了完整的知识体系。

ROP与SROP技术在Linux Pwn中的应用分析 一、ROP技术基础 1.1 ROP保护机制RELRO详解 RELRO(Relocation Read-Only)重定位段只读保护分为三个等级: NO RELRO : 保护未开启状态 所有重定位段均可写,包括.dynamic、.got、.got.plt Partial RELRO : GCC编译的默认配置 .dynamic、.got被标记为只读 强制将ELF内部数据段.got、.got.plt放到外部数据段.data、.bss之前 防止程序数据段溢出改变内部数据段的值 .got.plt仍然可写,可改写GOT表劫持控制流 Full RELRO : 继承Partial RELRO的所有保护 .got.plt也被标记为只读 延迟绑定技术被禁止 所有外部函数地址在程序装载时解析、装入并标记为只读 GOT表中link_ map和dl_ runtime_ resolve项置为0 1.2 特殊参数利用技巧 在Unix/Linux系统中,除了常见的 sh 参数外,还存在其他可达到RCE效果的参数: 1.3 端序处理与内存布局 小端序处理 : 二、SROP技术深入分析 2.1 32位SROP技术 信号帧结构特点 : sigreturn调用需要80字节(0x50)长度 32位系统调用号较大 read函数有足够写入空间,利用read返回值无需提前布局 32位寄存器控制 : 利用要点 : 聚焦栈空间控制而非寄存器 利用压栈操作控制参数 当ebp地址已知时可实现精确控制 syscall调用需要0x54字节长度 2.2 64位SROP技术 信号帧完整结构 : 三、高级利用技术 3.1 libc劫持技术 环境配置 : libc GOT表劫持 : 劫持libc函数内部的GOT表 利用libc.so.6中函数实现,如puts调用j_ strlen() 跳转地址为libc.address + offset 可修改为one-gadget或特定gadget 多次劫持技术 : 第一次劫持:执行gadget设置one-gadget条件 第二次劫持:执行one-gadget 示例:mov rdx, r10(当r10为0时可设置rdx=0满足ogg条件) 3.2 栈地址泄露技术 利用环境变量 : 四、实战例题分析 4.1 例题一:only_ read gadget查找与利用 : 栈帧布局 : open函数栈帧铺垫 read函数栈帧铺垫 write函数栈帧铺垫 利用流程 : 全部数据写入 通过leave_ ret指令依次执行 完整的exp编写 4.2 例题二:强网杯stack 关键技术点 : 连续SROP技术应用 信号帧的精确构造 系统调用链的构建 五、调试与问题解决 5.1 常见问题处理 段错误调试 : 检查内核架构设置 验证信号帧结构完整性 确认寄存器值正确性 IDA使用技巧 : 在options→general中开启16进制显示 手动查找特定字节 分析代码段布局 5.2 脚本开发要点 字节查找脚本 : 利用脚本结构 : 参数传递处理 内存布局分析 利用链构造 调试信息输出 六、技术发展趋势 6.1 防护绕过技术 针对Full RELRO的利用方法 libc段写入技术发展 新型gadget发现技术 6.2 自动化工具 利用链自动生成 防护检测与绕过 漏洞利用框架集成 本教学文档涵盖了ROP和SROP技术的核心知识点,从基础概念到高级利用技术,包括32位和64位系统的差异处理,以及实际例题的详细分析。重点突出了信号帧构造、libc劫持、防护绕过等关键技术,为深入理解Linux Pwn技术提供了完整的知识体系。