lun4t1c@home:~$

SROP

# Signal 机制

在 signal handler 返回之后,sigreturn 系统调用处理函数会根据当前的栈指针 esp / rsp 指向的 Signal Frame 对进程上下文进行恢复。

# signal frame 的结构

# 利用原理

  • Signal Frame 被保存在用户的地址空间中,所以用户是可以读写的。

  • 内核处理 sigreturn 系统调用时不会检查当前的 Signal Frame 是否是由内核所创建。

# 创建 signal frame

sigframe = SigreturnFrame()
sigframe.rax = constants.SYS_read
sigframe.rdi = 0
sigframe.rsi = leak_stack
sigframe.rdx = 0x400
sigframe.rsp = leak_stack
sigframe.rip = syscall_retn
io.send(str(sigframe))

pwntools 中集成了对于 srop 的攻击。SigreturnFrame() 会创建一个完整的 signal frame(包括 rt_sigreturn)且 rt_sigreturn 初始化为 0。

# 一些技巧

  • 以 read 的返回值设置 eax / rax。