signal 机制 

signal 机制是类 unix 系统中进程之间相互传递信息的一种方法。一般,我们也称其为软中断信号,或者软中断。比如说,进程之间可以通过系统调用 kill 来发送软中断信号。一般来说,信号机制常见的步骤如下图所示:

  1. 内核向某个进程发送 signal 机制,该进程会被暂时挂起,进入内核态。

  2. 内核会为该进程保存相应的上下文,主要是将所有寄存器压入栈中,以及压入 signal 信息,以及指向 sigreturn 的系统调用地址。此时栈的结构如下图所示,我们称 ucontext 以及 siginfo 这一段为 Signal Frame。**需要注意的是,这一部分是在用户进程的地址空间的。**之后会跳转到注册过的 signal handler 中处理相应的 signal。因此,当 signal handler 执行完之后,就会执行 sigreturn 代码。

  3. signal handler 返回后,内核为执行 sigreturn 系统调用,为该进程恢复之前保存的上下文,其中包括将所有压入的寄存器,重新 pop 回对应的寄存器,最后恢复进程的执行。其中,32 位的 sigreturn 的调用号为 119(0x77),64 位的系统调用号为 15(0xf)。 漏洞利用点

`rax = 59``//对应59号系统调用-> exceve`

`rdi =` `'/bin/sh'`

`rsi = 0`

`rdx = 0`

Srop链 可以通过syscall ret;这个gadget去串联起我们我们的Srop链 执行完一个SignalFrame接着执行下一个SignalFrame。 需要注意的是,我们在构造 ROP 攻击的时候,需要满足下面的条件

例题:ciscn_s_3

这里存在write()read() 在gadgets这段汇编里有两个rax,十进制值为15和59,分别是sys_rt_sigreturn和sys_execve的系统调用号 > 这里贴一下64位以及32位的系统调用表

64位: 传参方式:首先将系统调用号 传入 rax,然后将参数 从左到右 依次存入 rdi,rsi,rdx寄存器中,返回值存在rax寄存器

调用号:sys_read 的调用号 为 0 ,sys_write 的调用号 为 1 ,stub_execve 的调用号 为 59, stub_rt_sigreturn 的调用号 为 15 调用方式: 使用 syscall 进行系统调用

Stage1泄露地址