SROP
Sigreturn Oriented Programming
这里的sigreturn是一个系统调用,在unix系统发生signal的时候会被间接地调用
signal机制
signal机制是类unix系统中进程之间相互传递信息的一种方法,一般称为软中断信号或软中断
比如进程之间可以通过系统调用kill来发送给软中断信号
信号机制常见步骤如下图
(进内核保存,出内核恢复)
SROP原理
内核会为该进程保存相应的上下文,主要是将所有寄存器压入栈中,以及压入signal信息,以及指向sigreturn的系统调用地址
称ucontext及siginfo这一段为Signal Frame。注意,这一部分是在用户进程的地址空间的。之后会跳转到注册过的signal handler中处理相应的signal。因此当signal handler执行完之后,就会执行sigreturn代码
此时栈结构如下图所示
原来的栈下面的ucontext和siginfo、sigreturn的信息拼起来如下图
(可以看到在栈里保存了各种寄存器的值等信息)
内核工作:为进程保存上下文并恢复上下文,变动在Signal Frame里
注意:
- Signal Frame被保存在用户的地址空间中, 所以用户是可以读写的
- 由于内核与信号处理程序无关(kernel agnostic about signal handlers),它不会记录这个signal对应的Signal Frame,所以当执行sigreturn系统调用时,此时的Signal Frame并不一定时之前内核为用户进程保存的Signal Frame
于是可以控制寄存器
利用思路
希望执行一系列函数,只需要修改两处即可
- 控制栈指针
- 把原来rip指向的
syscall gadget换成syscall;ret gadget
(栈迁移)
利用条件
- 可以通过栈溢出控制栈的内容
- 需要知道相应的地址
- “/bin/sh”(可以写入)
- Signal Frame
- syscal
- sigreturn(64位下的系统调用号15,rax=15。如调用read函数时,返回值保存到rax,则可以使输入字符个数为15个即可使rax=15)
- 需要足够大的空间来塞下整个signal frame
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 aYoung's Blog!
评论








