SIGROP(SROP)
Sigreturn系统调用是为了多进程管理的一种内核机制。一般是和signal成对出现。在执行signal时,系统会在栈顶构建一个signal栈,随后在执行sigreturn时会从这个栈恢复数据。如果越过signal,直接调用sigreturn,那通过手动构建signal frame并push到栈顶,使其rip为addr(syscall),同时写入syscall需要的各寄存器数值到signal frame,那么在执行完sigreturn时,就能跳转到rip指定的地址执行系统调用。
signal frame的定义如下:
+--------------------+--------------------+
| rt_sigeturn() | uc_flags |
+--------------------+--------------------+
| &uc | uc_stack.ss_sp |
+--------------------+--------------------+
| uc_stack.ss_flags | uc.stack.ss_size |
+--------------------+--------------------+
| r8 | r9 |
+--------------------+--------------------+
| r10 | r11 |
+--------------------+--------------------+
| r12 | r13 |
+--------------------+--------------------+
| r14 | r15 |
+--------------------+--------------------+
| rdi | rsi |
+--------------------+--------------------+
| rbp | rbx |
+--------------------+--------------------+
| rdx | rax |
+--------------------+--------------------+
| rcx | rsp |
+--------------------+--------------------+
| rip | eflags |
+--------------------+--------------------+
| cs / gs / fs | err |
+--------------------+--------------------+
| trapno | oldmask (unused) |
+--------------------+--------------------+
| cr2 (segfault addr)| &fpstate |
+--------------------+--------------------+
| __reserved | sigmask |
+--------------------+--------------------+