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 攻击条件
- 程序存在溢出漏洞,能够控制返回地址
- 可以触发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 |