CTF-pwn-虚拟化-qemu前置知识

文章目录

  • 参考
  • 地址相关
  • 交互相关
  • 配置相关
  • 调试
  • 待完善(以后做题用到啥再加吧)

参考

https://xz.aliyun.com/t/6562?time__1311=n4%2bxnD0DRDBAi=GkDgiDlhjmYh2xuCllx7whD&alichlgref=https://www.bing.com/#toc-3

地址相关

每个qemu虚拟机都是宿主机上的一个进程,在进程中用mmap分配出大小为0x40000000字节的宿主机的虚拟内存来作为虚拟机的物理内存

GVA:guest virtual address(虚拟机中的虚拟地址)
GPA:guest physical address(虚拟机中的物理地址)
HVA:host virtual address(宿主机中的虚拟地址)
HPA: host physical address(宿主机中的物理地址)

GVA通过客户机的页表得到GPA,GPA实际是由宿主机进程mmap出来的空间内的偏移。再加上起始地址就是HVA(mmap分配出相应虚拟机申请大小的内存,用于给该虚拟机当作物理内存)

  1. 设备可以申请两类空间,memory mapped I/O(MMIO)和port mapped I/O(PMIO),并在配置空间中用Base Address Registers(BAR)来标记内存地址信息
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <assert.h>
#include <inttypes.h>#define PAGE_SHIFT  12
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#define PFN_PRESENT (1ull << 63)
#define PFN_PFN     ((1ull << 55) - 1)int fd;uint32_t page_offset(uint32_t addr)
{return addr & ((1 << PAGE_SHIFT) - 1);//虚拟地址addr在其所在页面内的偏移量
}uint64_t gva_to_gfn(void *addr)
{uint64_t pme, gfn;size_t offset;offset = ((uintptr_t)addr >> 9) & ~7;//页表条目相对于文件开始的偏移量(GFN, Guest Physical Frame Number)lseek(fd, offset, SEEK_SET);//移动文件指针到计算出的偏移量处,准备读取PTE。read(fd, &pme, 8);  //从文件中读取8字节到pme变量即物理块起始地址if (!(pme & PFN_PRESENT))return -1;gfn = pme & PFN_PFN;return gfn;
}uint64_t gva_to_gpa(void *addr)
{uint64_t gfn = gva_to_gfn(addr);assert(gfn != -1);return (gfn << PAGE_SHIFT) | page_offset((uint64_t)addr);
}int main()
{uint8_t *ptr;uint64_t ptr_mem;// uint64_t ptr_malloc;fd = open("/proc/self/pagemap", O_RDONLY);if (fd < 0) {perror("open");exit(1);}ptr = malloc(256);strcpy(ptr, "Where am I?");printf("%s\n", ptr);ptr_mem = gva_to_gpa(ptr);printf("Your physical address is at 0x%"PRIx64"\n", ptr_mem);// ptr_malloc = gva_to_gpa(&malloc);// printf("malloc physical address 0x%"PRIx64" \n",ptr_malloc);getchar();return 0;
}

在这里插入图片描述
gdb attach后vmmap可以查看到启动脚本中的-M指定的分配大小

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

交互相关

每个PCI设备有一个总线号、一个设备号、一个功能标识,存在PCI域,PCI域最多可以承载256条总线, 每条总线最多可以有32个设备,每个设备最多可以有8个功能

lspci 可以查看设备所在的域、总线号、设备号、功能号,不同版本lspci 显示的内容不一样

其中对于形如0000:00:03.0的数据,0000是域,00是总线号,03是设备号,0是功能号
在这里插入图片描述
resource中的pmio端口和mmio起始地址是固定的
mmio:将设置的寄存器映射到端口,访问端口来访问寄存器
pmio:将设置的寄存器映射到内存, 访问内存来访问寄存器

  • hexdump /sys/devices/pci0000:00/0000:00:03.0/config查看配置信息如deviceid和vendorid
  • 访问memory mapped I/O内存:打开获取fd后用mmap映射内存地址,直接操作内存
int mmio_fd = open("/sys/devices/pci0000:00/0000:00:04.0/resource0", O_RDWR | O_SYNC);
mmio_mem = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, mmio_fd, 0);
  • 访问port mapped I/O内存:申请访问端口权限后用in、out访问
iopl(3);// iopl(3) 表示打开对全部IO端口的访问权限
inb(port); //从端口读一个字节
outb(val,port); //往端口写一个字节val

设备会注册自己的MMIO和PMIO读写函数,当检测到访问其所在的内存或端口时调用注册的读写函数,实现对设备内存的读写功能

当对设备其所在的内存访问时,会调用注册的读mmio函数d3dev_mmio_read,读的位置是基地址+0x128,是4字节。被d3dev_mmio_read识别为了rsi为0x128(偏移),rdx为4

在这里插入图片描述
在这里插入图片描述
当对设备其所在的内存写时,会调用注册的写mmio函数d3dev_mmio_write
在这里插入图片描述

#include <assert.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include<sys/io.h>unsigned char* mmio_mem;void die(const char* msg)
{perror(msg);exit(-1);
}void mmio_write(uint32_t addr, uint32_t value)
{*((uint32_t*)(mmio_mem + addr)) = value;
}uint32_t mmio_read(uint32_t addr)
{return *((uint32_t*)(mmio_mem + addr));
}int main(int argc, char *argv[])
{// Open and map I/O memory for the strng deviceint mmio_fd = open("/sys/devices/pci0000:00/0000:00:03.0/resource0", O_RDWR | O_SYNC);//O_SYNC标志表示同步I/O操作,确保对文件的写操作在返回前完成if (mmio_fd == -1)die("mmio_fd open failed");mmio_mem = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, mmio_fd, 0);//PROT_READ | PROT_WRITE:指定映射区域的访问权限,这里允许读写。//MAP_SHARED:映射类型,共享映射意味着对映射区域的修改会反映到设备上,其他映射同一资源的进程也能看到修改。//mmio_fd:之前通过open获得的文件描述符。//0:文件偏移量,从资源的起始位置开始映射。if (mmio_mem == MAP_FAILED)die("mmap mmio_mem failed");printf("mmio_mem @ %p\n", mmio_mem);mmio_read(0x128);mmio_write(0x128, 1337);mmio_read(0x128);}

在这里插入图片描述
可以发现rsi会被设置成偏移
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#include <assert.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include<sys/io.h>void die(const char* msg)
{perror(msg);exit(-1);
}uint32_t pmio_base=0xc040;uint32_t pmio_write(uint32_t addr, uint32_t value)
{outl(value,addr);
}uint32_t pmio_read(uint32_t addr)
{return (uint32_t)inl(addr);
}int main(int argc, char *argv[])
{if (iopl(3) !=0 )die("I/O permission is not enough");pmio_read(pmio_base+4);pmio_write(pmio_base+4,1);pmio_read(pmio_base+4);}
  • qemu中执行其中的程序时,当涉及到设备读写此时进行的操作会是qemu进程执行的,不是虚拟中的,就是对qemu进程上的虚拟地址相关进行操作,不是mmap出来作为宿主机的那部分(就和平常用户态一样了)
  • 注册的相关读写函数中的addr是偏移,mmio范围是0x800,pmio是0x20

配置相关

PCI设备有其配置空间来保存设备信息,头部最开始的数据为Device id和Vendor id

在初始化设备时会初始化四个比较重要的结构体:TypeInfo -> TypeImpl -> ObjectClass -> Object,每个 Object对应一个具体的device,其构造函数在qemu启动用-device参数加载设备时调用

设备读写操作函数的第一个参数是这个Object类的指针

调试

打包exp到文件系统

gcc -static exp.c -o   exp
find . | cpio -o --format=newc > ../rootfs.img

启动qemu

./launch.sh
touch .gdbinit
往里面写入断点
b*d3dev_pmio_write
b*d3dev_pmio_read
b*d3dev_mmio_write
b*d3dev_mmio_read
ps -ef | grep qemu
一般是最下面的那个进程
sudo gdb attach -p 进程号

在qemu中

./exp

此时gdb会断在断点上,然后开始调试

成功attach之后即可下断点调试,开启了pie保护,且没有符号表可以用pwndbg的$rebase()根据ida中的地址确定进程中的真实地址

待完善(以后做题用到啥再加吧)

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

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

相关文章

JVM的类加载机制

Java中类的加载阶段 类加载 Java中的类加载机制是Java运行时环境的一部分&#xff0c;确保Java类可以被JVM&#xff08;Java虚拟机&#xff09;正确地加载和执行。类加载机制主要分为以下几个阶段&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;这个阶段&#x…

AI助手,办公提效好工具!

随着人工智能AI技术的发展&#xff0c;AI工具已经成为我们提高工作效率的重要工具。无论是日常办公、学习还是生活娱乐&#xff0c;AI工具都能为我们提供支持和帮助。下面小编就来和大家分享几款AI助手&#xff0c;方便大家了解和使用AI工具。 1. Kimi智能助手 Kimi智能助手是…

H3C综合实验

实验拓扑 实验要求 1、按照图示配置IP地址 2、sw1和sw2之间的直连链路配置链路聚合 3、 公司内部业务网段为VLAN10和VLAN20; VLAN 10是市场部&#xff0c;vlan20是技术部&#xff0c;要求对VLAN进行命名以便识别&#xff1b;PC1属于vlan10&#xff0c;PC2属于vlan20&#xf…

神经网络模型的量化简介(工程版)

1.量化简介 模型量化&#xff08;Model Quantization&#xff09;是深度学习中一种优化技术&#xff0c;旨在减少模型的计算和存储需求&#xff0c;同时尽量保持模型的性能。具体来说&#xff0c;模型量化通过将模型的权重和激活值从高精度&#xff08;通常是32位浮点数&#…

数学建模整数规划学习笔记

与线性规划的本质区别在于决策变量是否取整。 &#xff08;1&#xff09;分支定界法 若不考虑整数限制先求出相应松弛问题的最优解&#xff1a; 若松弛问题&#xff08;线性规划&#xff09;无解&#xff0c;则ILP&#xff08;整数规划&#xff09;无解。 若求得的松弛问题最…

phar反序列化及绕过

目录 一、什么是phar phar://伪协议格式&#xff1a; 二、phar结构 1.stub phar&#xff1a;文件标识。 格式为 xxx; *2、manifest&#xff1a;压缩文件属性等信息&#xff0c;以序列化存 3、contents&#xff1a;压缩文件的内容。 4、signature&#xff1a;签名&#…

视频云存储平台LntonCVS国标视频平台功能和应用场景详细介绍

LntonCVS国标视频融合云平台基于先进的端-边-云一体化架构设计&#xff0c;以轻便的部署和灵活多样的功能为特点。该平台不仅支持多种通信协议如GB28181、RTSP、Onvif、海康SDK、Ehome、大华SDK、RTMP推流等&#xff0c;还能兼容各类设备&#xff0c;包括IPC、NVR和监控平台。在…

等保2.0中,如何确保云服务提供商的数据主权合规?

等保2.0&#xff08;网络安全等级保护2.0&#xff09;为了确保云服务提供商的数据主权合规&#xff0c;提出了若干关键措施和要求&#xff0c;主要包括但不限于以下几点&#xff1a; 1. 数据地理位置要求&#xff1a;明确规定云服务提供商必须保证所有基础设施位于中国境内&am…

海外云手机自动化管理,高效省力解决方案

不论是企业还是个人&#xff0c;对于海外社媒的营销都是需要自动化管理的&#xff0c;因为自动化管理不仅省时省力&#xff0c;而且还节约成本&#xff1b; 海外云手机的自动化管理意味着什么&#xff1f;那就是企业无需再投入大量的人力和时间去逐一操作和监控每一台设备。 通…

容器之滚动条窗体演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDO…

【经验分享】Ubuntu 24.04 安装搜狗输入法(亲测有效)

【经验分享】Ubuntu 24.04 安装搜狗输入法&#xff08;亲测有效&#xff09; 先用如下Ubuntu22.04的安装方法进行安装 Ubuntu 22.04安装搜狗输入法 发现存在闪屏问题&#xff0c;那解决闪屏问题不就好了。 解决方法如下&#xff1a; 解决方法1 Ubuntu 24.04安装搜狗输入法-解…

20212416 2023-2024-2 《移动平台开发与实践》综合实践

移动平台开放综合实践 1.实验内容2.实验过程2.1 确定基础功能2.2 设计UI界面2.3 编写程序运行代码2.4 在基本功能的基础上丰富功能 3. 代码分析3.1设置按钮的点击事件监听器3.2 比分更新模块3.3 比分存储模块 4. 运行结果5.实践中遇到的问题及解决6.学习感悟与思考参考资料 1.实…

【原创】springboot+mysql员工工资管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Wilcom PE 威尔克姆绣花软件下载安装;Wilcom PE 广大绣花制版师必备软件!

Wilcom PE这款软件不仅具备强大的设计功能&#xff0c;更在用户体验上下足了功夫&#xff0c;使得刺绣图案的创作变得更为简单、高效。 在Wilcom PE的丰富工具箱中&#xff0c;用户可以发现各种精心设计的工具&#xff0c;它们如同刺绣师手中的魔法棒&#xff0c;将创意变为现…

云邮件推送服务如何配置?有哪些优势特点?

云邮件推送的性能怎么优化&#xff1f;如何选择邮件推送服务&#xff1f; 云邮件推送服务是一种基于云计算的邮件发送解决方案&#xff0c;能够帮助企业和个人高效地发送大规模邮件。AokSend将详细介绍如何配置云邮件推送服务&#xff0c;以便你能够充分利用其优势。 云邮件推…

深度学习500问——Chapter12:网络搭建及训练(3)

文章目录 12.3.5 Caffe有哪些接口 12.4 网络搭建有什么原则 12.4.1 新手原则 12.4.2 深度优先原则 12.4.3 卷积核size一般为奇数 12.4.4 卷积核不是越大越好 12.5 有哪些经典的网络模型值得我们去学习的 12.6 网络训练有哪些技巧 12.6.1 合适的数据集 12.6.2 合适的预…

VMware连接XShell保姆教程

打开虚拟机后进入终端在终端中 1.配置静态IP 在终端中输入 ifconfig回车&#xff0c; 注意这里需要记住这个IP每个电脑的都不一样 在输入ip addr 2.接着输入cd /etc/sysconfig/network-scripts/进入配置网络文件夹 3.通过Vim编辑器编辑内容 vim ifconfig-ens33 进入界面…

《窄门》情不知所起,而一往情深

《窄门》情不知所起&#xff0c;而一往情深 安德烈纪德&#xff08;1869-1951&#xff09;&#xff0c;法国作家。纪德一生著有小说、剧本、论文、散文、日记、书信多种&#xff0c;主要作品有小说《背德者》《窄门》《田园交响曲》《伪币制造者》等&#xff0c;戏剧《康多尔王…

信息学奥赛初赛天天练-31-CSP-J2022基础题-指针、数组、链表、进制转换、深度优先搜索、广度优先搜索、双栈实现队列应用

PDF文档公众号回复关键字:20240621 2022 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 3.运行以下代码片段的行为是 ( ) int x 101; int y 201; int * p &x; int * q &y;…

C51与MDK共存版本安装教程

目录 一、安装准备 1.1 新建文件夹 1.2 网盘链接-加Q 667198390 二、 双版本共存安装教程 2.1 安装Keil5 C51 2.2 安装Keil5 MDK 2.3 C51和MDK的共存 2.4 生成许可证 2.5 安装STM32Pack包 一、安装准备 1.1 新建文件夹 如下图&#xff1a; 在合适的网盘里&#xff08…