SROP详解
字数 1598 2025-08-20 18:17:41

SROP (Sigreturn Oriented Programming) 技术详解

1. SROP 概述

SROP (Sigreturn Oriented Programming) 是一种高级ROP攻击技术,利用Linux系统中的信号处理机制进行漏洞利用。它通过伪造Signal Frame来控制程序执行流程,实现任意代码执行。

1.1 基本原理

  • sigreturn系统调用:Linux中的15号系统调用(64位下为rt_sigreturn)
  • signal机制:当进程收到信号时,内核会保存当前上下文(寄存器状态)到用户空间栈中
  • 漏洞点:内核在恢复上下文时不验证Signal Frame的合法性

1.2 攻击条件

  1. 程序存在溢出漏洞,能够控制返回地址
  2. 可以触发sigreturn系统调用(直接或间接)
  3. 能够知道关键地址(如/bin/sh地址)
  4. 溢出长度足够构造完整的Signal Frame
  5. 知道syscall指令的地址

2. Linux Signal机制详解

2.1 Signal处理流程

  1. 保存上下文:内核向进程发送signal,进程被挂起,进入内核态
  2. 保存寄存器:将所有寄存器压入栈中,包括signal信息和sigreturn地址
  3. 执行handler:跳转到注册的signal handler处理signal
  4. 恢复上下文:handler执行完后执行sigreturn恢复上下文

2.2 Signal Frame结构

Signal Frame包含以下关键部分:

  • 所有寄存器值
  • signal信息
  • 指向sigreturn系统调用的地址

3. SROP利用技术

3.1 基本利用方法

  1. 伪造Signal Frame
  2. 设置关键寄存器:
    • rax = 系统调用号(如59对应execve)
    • rdi = 参数1(如"/bin/sh"地址)
    • rsi = 参数2
    • rdx = 参数3
    • rip = syscall地址
  3. 触发sigreturn系统调用

3.2 SROP链构造

通过连续构造多个Signal Frame可以实现更复杂的攻击:

  1. 第一个Signal Frame设置栈指针(rsp)指向下一个Frame
  2. 每个Frame的rip都指向syscall;ret指令
  3. 通过ret指令连接多个Frame

4. 实战案例分析

4.1 ciscn_2019_s_3 (简单SROP)

漏洞点

  • 存在栈溢出
  • 提供了syscall和"/bin/sh"地址

利用步骤

  1. 泄露栈地址计算偏移
  2. 构造execve的Signal Frame
  3. 触发sigreturn

4.2 rootersctf_2019_srop (SROP链)

特点

  • 无法直接泄露栈地址
  • 需要构造SROP链

利用步骤

  1. 第一个Frame调用read读取后续payload
  2. 第二个Frame调用execve执行shell

4.3 V&N2020 babybabypwn (ORW+SROP)

特点

  • 存在沙箱限制
  • 需要ORW绕过

利用步骤

  1. 泄露libc地址
  2. 构造SROP Frame调用read读取ORW链
  3. 执行ORW链读取flag

5. 防御措施

  1. 内核验证:检查Signal Frame的合法性
  2. 栈保护:加强栈保护机制
  3. 地址随机化:增强ASLR效果
  4. 沙箱限制:限制危险系统调用

6. 参考资源

  • CTF Wiki SROP章节
  • 相关CTF比赛题目解析
  • Linux内核signal机制文档

附录:关键系统调用号

调用号 系统调用
15 rt_sigreturn
59 execve
0 read
1 write
2 open
SROP (Sigreturn Oriented Programming) 技术详解 1. SROP 概述 SROP (Sigreturn Oriented Programming) 是一种高级ROP攻击技术,利用Linux系统中的信号处理机制进行漏洞利用。它通过伪造Signal Frame来控制程序执行流程,实现任意代码执行。 1.1 基本原理 sigreturn系统调用 :Linux中的15号系统调用(64位下为 rt_sigreturn ) signal机制 :当进程收到信号时,内核会保存当前上下文(寄存器状态)到用户空间栈中 漏洞点 :内核在恢复上下文时不验证Signal Frame的合法性 1.2 攻击条件 程序存在溢出漏洞,能够控制返回地址 可以触发sigreturn系统调用(直接或间接) 能够知道关键地址(如 /bin/sh 地址) 溢出长度足够构造完整的Signal Frame 知道syscall指令的地址 2. Linux Signal机制详解 2.1 Signal处理流程 保存上下文 :内核向进程发送signal,进程被挂起,进入内核态 保存寄存器 :将所有寄存器压入栈中,包括signal信息和sigreturn地址 执行handler :跳转到注册的signal handler处理signal 恢复上下文 :handler执行完后执行sigreturn恢复上下文 2.2 Signal Frame结构 Signal Frame包含以下关键部分: 所有寄存器值 signal信息 指向sigreturn系统调用的地址 3. SROP利用技术 3.1 基本利用方法 伪造Signal Frame 设置关键寄存器: rax = 系统调用号(如59对应execve) rdi = 参数1(如"/bin/sh"地址) rsi = 参数2 rdx = 参数3 rip = syscall地址 触发sigreturn系统调用 3.2 SROP链构造 通过连续构造多个Signal Frame可以实现更复杂的攻击: 第一个Signal Frame设置栈指针(rsp)指向下一个Frame 每个Frame的rip都指向syscall;ret指令 通过ret指令连接多个Frame 4. 实战案例分析 4.1 ciscn_ 2019_ s_ 3 (简单SROP) 漏洞点 : 存在栈溢出 提供了syscall和"/bin/sh"地址 利用步骤 : 泄露栈地址计算偏移 构造execve的Signal Frame 触发sigreturn 4.2 rootersctf_ 2019_ srop (SROP链) 特点 : 无法直接泄露栈地址 需要构造SROP链 利用步骤 : 第一个Frame调用read读取后续payload 第二个Frame调用execve执行shell 4.3 V&N2020 babybabypwn (ORW+SROP) 特点 : 存在沙箱限制 需要ORW绕过 利用步骤 : 泄露libc地址 构造SROP Frame调用read读取ORW链 执行ORW链读取flag 5. 防御措施 内核验证 :检查Signal Frame的合法性 栈保护 :加强栈保护机制 地址随机化 :增强ASLR效果 沙箱限制 :限制危险系统调用 6. 参考资源 CTF Wiki SROP章节 相关CTF比赛题目解析 Linux内核signal机制文档 附录:关键系统调用号 | 调用号 | 系统调用 | |--------|----------| | 15 | rt_ sigreturn | | 59 | execve | | 0 | read | | 1 | write | | 2 | open |