SROP攻击流程
字数 1661 2025-08-29 22:41:24
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结构是防御此类攻击的关键。