SROP
pwnable.kr-unexploitable
SROP:
可以用来控制所有的寄存器,进行stack pivot。
Sigreturn Oriented Programming (SROP),这个方法是用来攻击POSIX主机的信号处理机制的。
Linux系统上,Signal本质上是对中断机制的模拟
,Signal的来源主要有以下途径:
- 硬件来源:按下键盘或者其他故障
- 软件来源:
kill
等;非法操作
接收到Single之后,流程如下:
1 | +---------+ +---------+ +---------+ |
- 进入内核态
- 保存上下文
- 回到用户态执行相关信号处理函数
- 进入内核态恢复上下文
- 进程继续执行
在程序接受Signal后,内核将进程的上下文context(r8-r15, rax, rbx, rcx, rdx, rdi, rsi等)
保存在栈
上,称作Signal Frame
;当进程收到rt_sigreturn
会从栈上取Signal Frame
用来恢复进程的上下文。
1 | Signal Frame |
所以,可选的攻击方式就是构造一个fake signal frame
写入内存中,将然后将RSP
指向这段空间,再发送rt_sigreturn
信号。此时,内核会将构造好的fake signal frame
取出,恢复。恢复后类似于ROP的方式,为syscall调用execve
。
SROP(自主组装sig_frame):
1 | from pwn import * |
SROP(调用SigreturnFrame())
1 | #!/usr/bin/python |
ROP
1 | from pwn import * |
360/ichunqiu smallest
1 | .text:00000000004000B0 start proc near ; DATA XREF: LOAD:00000000004000180 |
srop + mprotect + shellcode
1 | # -*-coding:utf-8-*- |
srop + execve
1 | # -*-coding:utf-8-*- |
Backdoor CTF
1 | shellcode:0000000010000000 _shellcode segment byte public 'CODE' use64 |
srop + execve:
1 | #!/usr/bin/python |