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

于是可以控制寄存器

利用思路

希望执行一系列函数,只需要修改两处即可

  1. 控制栈指针
  2. 把原来rip指向的syscall gadget 换成 syscall;ret gadget
    (栈迁移)

利用条件

  • 可以通过栈溢出控制栈的内容
  • 需要知道相应的地址
    • “/bin/sh”(可以写入)
    • Signal Frame
    • syscal
    • sigreturn(64位下的系统调用号15,rax=15。如调用read函数时,返回值保存到rax,则可以使输入字符个数为15个即可使rax=15)
  • 需要足够大的空间来塞下整个signal frame