SROP攻击流程
字数 1661 2025-08-29 22:41:24

SROP攻击原理与利用技术详解

1. Signal机制基础

1.1 Signal机制概述

Signal机制是类Unix系统中进程间通信的一种方法,也称为软中断信号或软中断。进程可以通过系统调用kill发送软中断信号。

1.2 Signal处理流程

  1. 内核向进程发送signal,进程被暂时挂起,进入内核态
  2. 内核为该进程保存上下文:
    • 将所有寄存器压入栈中
    • 压入signal信息
    • 压入指向sigreturn的系统调用地址
  3. 跳转到注册过的signal handler处理signal
  4. signal handler返回后,内核执行sigreturn系统调用恢复之前保存的上下文

1.3 Signal Frame结构

Signal Frame是内核在用户进程地址空间保存的上下文信息,包含:

  • ucontext结构
  • siginfo结构
  • 指向sigreturn的系统调用地址

不同架构的sigcontext结构不同:

  • x86架构
  • x64架构

2. SROP攻击原理

2.1 核心漏洞

  1. Signal Frame保存在用户地址空间,用户可读写
  2. 内核不记录signal对应的Signal Frame
  3. 执行sigreturn时,内核不验证Signal Frame的真实性

2.2 攻击思路

通过伪造Signal Frame并调用sigreturn系统调用,可以控制所有寄存器的值:

  1. 控制栈内容(通常通过栈溢出)
  2. 伪造Signal Frame
  3. 触发sigreturn系统调用(x64系统调用号15)

2.3 关键条件

  1. 能控制栈内容(通常需要栈溢出漏洞)
  2. 知道关键地址:
    • "/bin/sh"字符串地址
    • Signal Frame地址
    • syscall指令地址
    • sigreturn系统调用地址
  3. 有足够空间存放整个Signal Frame

3. SROP利用技术

3.1 基本利用方法

  1. 伪造Signal Frame结构:

    • 设置rax=59(execve系统调用号)
    • 设置rdi指向"/bin/sh"
    • 设置rsi=0, rdx=0
    • 设置rip指向syscall指令
  2. 触发sigreturn系统调用:

    • 设置rax=15(sigreturn系统调用号)
    • 执行syscall指令

3.2 System Call Chains技术

通过构造多个Signal Frame实现连续系统调用:

  1. 控制栈指针
  2. 将rip指向"syscall; ret" gadget
  3. 每个Signal Frame执行后,栈指针指向下一个Frame

3.3 控制rax的技巧

由于sigreturn需要rax=15,常用方法:

  1. 利用read函数返回值(读取字节数存入rax)
  2. 利用write函数返回值(写入字节数存入rax)

4. 实例分析:smallest题目

4.1 题目分析

6条汇编指令的极简程序:

  1. xor rax, rax
  2. mov edx, 400h
  3. mov rsi, rsp
  4. mov rdi, rax
  5. syscall
  6. ret

4.2 利用步骤

  1. 第一次输入:

    • 输入1字节,rax=1
    • 执行write泄漏栈地址
  2. 第二次输入:

    • 构造伪造的Signal Frame
    • 输入15字节,rax=15
    • 执行sigreturn系统调用
  3. 最终效果:

    • 恢复伪造的寄存器值
    • 执行execve("/bin/sh", 0, 0)
    • 获取shell

4.3 关键点

  1. cs/gs/fs字段的低2字节必须为0x33(恢复cs段寄存器)
  2. 栈布局要精确计算Signal Frame位置
  3. 利用read返回值控制rax值

5. 防御措施

  1. 内核验证Signal Frame的真实性
  2. 使用栈保护技术(如Stack Canary)
  3. 限制sigreturn系统调用的使用
  4. 地址随机化(ASLR)增加利用难度

6. 总结

SROP攻击利用内核不验证Signal Frame的特性,通过伪造上下文实现任意代码执行。这种攻击方式简洁高效,但需要精确控制栈内容和寄存器值。理解Signal机制和Signal Frame结构是防御此类攻击的关键。

SROP攻击原理与利用技术详解 1. Signal机制基础 1.1 Signal机制概述 Signal机制是类Unix系统中进程间通信的一种方法,也称为软中断信号或软中断。进程可以通过系统调用kill发送软中断信号。 1.2 Signal处理流程 内核向进程发送signal,进程被暂时挂起,进入内核态 内核为该进程保存上下文: 将所有寄存器压入栈中 压入signal信息 压入指向sigreturn的系统调用地址 跳转到注册过的signal handler处理signal signal handler返回后,内核执行sigreturn系统调用恢复之前保存的上下文 1.3 Signal Frame结构 Signal Frame是内核在用户进程地址空间保存的上下文信息,包含: ucontext结构 siginfo结构 指向sigreturn的系统调用地址 不同架构的sigcontext结构不同: x86架构 x64架构 2. SROP攻击原理 2.1 核心漏洞 Signal Frame保存在用户地址空间,用户可读写 内核不记录signal对应的Signal Frame 执行sigreturn时,内核不验证Signal Frame的真实性 2.2 攻击思路 通过伪造Signal Frame并调用sigreturn系统调用,可以控制所有寄存器的值: 控制栈内容(通常通过栈溢出) 伪造Signal Frame 触发sigreturn系统调用(x64系统调用号15) 2.3 关键条件 能控制栈内容(通常需要栈溢出漏洞) 知道关键地址: "/bin/sh"字符串地址 Signal Frame地址 syscall指令地址 sigreturn系统调用地址 有足够空间存放整个Signal Frame 3. SROP利用技术 3.1 基本利用方法 伪造Signal Frame结构: 设置rax=59(execve系统调用号) 设置rdi指向"/bin/sh" 设置rsi=0, rdx=0 设置rip指向syscall指令 触发sigreturn系统调用: 设置rax=15(sigreturn系统调用号) 执行syscall指令 3.2 System Call Chains技术 通过构造多个Signal Frame实现连续系统调用: 控制栈指针 将rip指向"syscall; ret" gadget 每个Signal Frame执行后,栈指针指向下一个Frame 3.3 控制rax的技巧 由于sigreturn需要rax=15,常用方法: 利用read函数返回值(读取字节数存入rax) 利用write函数返回值(写入字节数存入rax) 4. 实例分析:smallest题目 4.1 题目分析 6条汇编指令的极简程序: xor rax, rax mov edx, 400h mov rsi, rsp mov rdi, rax syscall ret 4.2 利用步骤 第一次输入: 输入1字节,rax=1 执行write泄漏栈地址 第二次输入: 构造伪造的Signal Frame 输入15字节,rax=15 执行sigreturn系统调用 最终效果: 恢复伪造的寄存器值 执行execve("/bin/sh", 0, 0) 获取shell 4.3 关键点 cs/gs/fs字段的低2字节必须为0x33(恢复cs段寄存器) 栈布局要精确计算Signal Frame位置 利用read返回值控制rax值 5. 防御措施 内核验证Signal Frame的真实性 使用栈保护技术(如Stack Canary) 限制sigreturn系统调用的使用 地址随机化(ASLR)增加利用难度 6. 总结 SROP攻击利用内核不验证Signal Frame的特性,通过伪造上下文实现任意代码执行。这种攻击方式简洁高效,但需要精确控制栈内容和寄存器值。理解Signal机制和Signal Frame结构是防御此类攻击的关键。