Srop
Srop 的全称是Sigreturn Oriented Programming
Srop 可以理解成一种高级的ROP,利用了linux下15号系统调用的->rt_sigreturn
Signal
Signal是Unix系统中的一种通信机制,通常用于在进程之间传递信息,也可以说是软中断信息
常见于在一个进程中,内核向其发送发送软中断信号,该进程将暂时被挂起,系统进入内核态
因为是暂时被挂起,所以系统会保留该进程的上下文 (部分内容摘自ctf-wiki)
将所有的寄存器压入栈中,以及signal信息和指向sigreturn的系统调用地址在栈顶上放置rt_sigreturn
此时栈上的内存分布:
这一段内存也被称为Signal Frame
漏洞利用点
Signal Frame 被放置在用户进程的内存空间中,也就说Signal Frame是可以读写的
在恢复Signal信号的时候没有检测,也就是说我们可以通过改变Signal Frame中的信息来劫持控制流
例如:
1 | rax = 59//对应59号系统调用-> exceve
2 | rdi = ‘/bin/sh’
3 | rsi = 0
4 | rdx = 0
这样就能进行一个最简单的Srop
Srop链
有时候我们希望执行一系列的操作,此时可以通过syscall ret;这个gadget去串联起我们我们的Srop链
执行完一个SignalFrame接着执行下一个SignalFrame。