理解并掌握基本的SROP理论以及其攻击方法,这里主要结合freebuf的文章http://www.freebuf.com/articles/network/87447.html,以及i春秋360杯和2017广东省红帽杯的题目路整理一下思路。
0x01 原理
SROP的全称是Sigreturn Oriented Programming。在这里
sigreturn
是一个系统调用,它在unix系统发生signal的时候会被间接地调用。Signal这套机制在1970年代就被提出来并整合进了UNIX内核中,它在现在的操作系统中被使用的非常广泛,比如内核要杀死一个进程(
kill -9 $PID
),再比如为进程设置定时器,或者通知进程一些异常事件等等。当内核向某个进程发起(deliver)一个signal,该进程会被暂时挂起(suspend),进入内核(1),然后内核为该进程保存相应的上下文,跳转到之前注册好的signal handler中处理相应signal(2),当signal handler返回之后(3),内核为该进程恢复之前保存的上下文,最后恢复进程的执行(4)。
在这里我们主要理解sigreturn的意义是,去执行一段pop函数将堆栈中的值全部pop到寄存器中,相当于一个恢复现场的作用(攻击的时候主要运用的这一点)。
在这四步过程中,第三步是关键,即如何使得用户态的signal handler执行完成之后能够顺利返回内核态。在类UNIX的各种不同的系统中,这个过程有些许的区别,但是大致过程是一样的。这里以Linux为例:
在第二步的时候,内核会帮用户进程将其上下文保存在该进程的栈上,然后在栈顶填上一个地址rt_sigreturn
,这个地址指向一段代码,在这段代码中会调用sigreturn
系统调用。因此,当signal handler执行完之后,栈指针(stack pointer)就指向rt_sigreturn
,所以,signal handler函数的最后一条ret
指令会使得执行流跳转到这段sigreturn代码,被动地进行sigreturn
系统调用。下图显示了栈上保存的用户进程上下文、signal相关信息,以及rt_sigreturn
:
我们将这段内存称为一个Signal Frame
。