沙箱,用来控制shellcode的。在函数中会有sandbox函数。
我们用Newstar的一个题为例子讲解。
如何查看沙箱
安装:
sudo apt install gcc ruby-dev
sudo gem install seccomp-tools
使用:
seccomp-tools dump ./pwn
这样可以看到我们被禁止使用的函数有3个:sendfile、execve、exeveat
题目例子
Easy_Shellcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| ┌──(kali㉿Alex-KaliServer)-[/mnt/c/Users/Lenovo/Downloads] └─$ seccomp-tools dump ./Easy_Shellcode Welcome to Shellcode World!
line CODE JT JF K ================================= 0000: 0x20 0x00 0x00 0x00000004 A = arch 0001: 0x15 0x00 0x07 0xc000003e if (A != ARCH_X86_64) goto 0009 0002: 0x20 0x00 0x00 0x00000000 A = sys_number 0003: 0x15 0x00 0x01 0x0000003b if (A != execve) goto 0005 0004: 0x06 0x00 0x00 0x00000000 return KILL 0005: 0x15 0x00 0x01 0x00000142 if (A != execveat) goto 0007 0006: 0x06 0x00 0x00 0x00000000 return KILL 0007: 0x15 0x00 0x01 0x00000002 if (A != open) goto 0009 0008: 0x06 0x00 0x00 0x00000000 return KILL 0009: 0x15 0x00 0x01 0x00000101 if (A != 257) goto 0011 //openat 0010: 0x06 0x00 0x00 0x7fff0000 return ALLOW 0011: 0x15 0x00 0x01 0x000001b5 if (A != 437) goto 0013 0012: 0x06 0x00 0x00 0x00000000 return KILL 0013: 0x15 0x00 0x01 0x00000000 if (A != 0) goto 0015 //read 0014: 0x06 0x00 0x00 0x00000000 return KILL 0015: 0x15 0x00 0x01 0x00000013 if (A != 19) goto 0017 //readv 0016: 0x06 0x00 0x00 0x00000000 return KILL 0017: 0x15 0x00 0x01 0x00000127 if (A != 295) goto 0019 //preadv 0018: 0x06 0x00 0x00 0x00000000 return KILL 0019: 0x15 0x00 0x01 0x00000147 if (A != 327) goto 0021 0020: 0x06 0x00 0x00 0x7fff0000 return ALLOW 0021: 0x15 0x00 0x01 0x00000011 if (A != 17) goto 0023 //pread64 0022: 0x06 0x00 0x00 0x00000000 return KILL 0023: 0x15 0x00 0x01 0x00000001 if (A != 1) goto 0025 //write 0024: 0x06 0x00 0x00 0x00000000 return KILL 0025: 0x15 0x00 0x01 0x00000014 if (A != 20) goto 0027 //writev 0026: 0x06 0x00 0x00 0x7fff0000 return ALLOW 0027: 0x06 0x00 0x00 0x7fff0000 return ALLOW
|
直接看系统调用表找到对应的函数(本人为了方便,已经手动添加)
我们可以看到我们被禁用了execve
和 execveat
所以我们只能使用ORW(open read write)来得到 flag
同时,程序也禁用了常规的 open
read
write
,需要我们找到他们的替代品
- 对于
open
,我们可以选择使用 openat
或者 openat2
(本题已禁用)
- 对于
read
,我们可以选择使用 readv
、preadv
、preadv2
(本题可用),pread64
或者 mmap
(本题可用)
- 对于
write
,我们可以选择使用 writev
(本题可用),sendfile
(本题可用,且能省略read
)等
关于orw:Seccomp学习(2) | D0wnBe@t
本处使用了原题解的函数openat和sendfile
如果你需要运行成功的回应,请使用root用户在根目录新建flag文件,写入一个伪造的flag即可。(大概率你以后也会用的上。)