SROP
Principle
sigreturn
是一个系统调用,在类 unix 系统发生 signal 的时候会被间接地调用。
当软中断发生,原进程挂起,进入内核态。内核保存进程的上下文,将寄存器、signal信息以及指向 sigreturn 的系统调用地址 压入栈中。然后由 signal handler 处理相应的 signal ,执行完后执行 sigreturn。
- Signal Frame 被保存在用户的地址空间中,所以用户是可以读写的。
- 由于内核与信号处理程序无关 (kernel agnostic about signal handlers),它并不会去记录这个 signal 对应的 Signal Frame,所以当执行 sigreturn 系统调用时,此时的 Signal Frame 并不一定是之前内核为用户进程保存的 Signal Frame。
只要控Signal Frame就能劫持控制流。
Requirement
- 可以通过栈溢出来控制栈的内容
- 需要知道相应的地址
- “/bin/sh”
- Signal Frame
- syscall
- sigreturn
- 需要有够大的空间来塞下整个 sigal frame
Exploit
目前的 pwntools 中已经集成了对于 srop 的攻击。
1 | from pwn import * |
更多系统调用参考http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
Sample
题目直接就是一个栈溢出且很大,开启了NX不能执行shellcode
题目中没有现成的/bin/sh,但是由于溢出的空间很大,可以伪造两个帧。
思路 :read ‘/bin/sh’ 到data段,然后system(‘/bin/sh’)
1 | #read(0,data,0x400) |
1 | #execve /bin/sh |