少女祈祷中...

沙箱,用来控制shellcode的。在函数中会有sandbox函数。
我们用Newstar的一个题为例子讲解。

如何查看沙箱

检测工具seccomp-tools

安装:

sudo apt install gcc ruby-dev
sudo gem install seccomp-tools

使用:

seccomp-tools dump ./pwn
2024-12-25-164132.png
这样可以看到我们被禁止使用的函数有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,我们可以选择使用 readvpreadvpreadv2(本题可用),pread64 或者 mmap(本题可用)
  • 对于 write,我们可以选择使用 writev(本题可用),sendfile(本题可用,且能省略read)等
    关于orw:Seccomp学习(2) | D0wnBe@t
    本处使用了原题解的函数openat和sendfile

如果你需要运行成功的回应,请使用root用户在根目录新建flag文件,写入一个伪造的flag即可。(大概率你以后也会用的上。)