ctf环境配置
前言 为了方便,将CTF的环境配置进行总结,方便日后快速恢复环境等
PWN环境 由于一般PWN题目涉及到各种Glibc版本,这里搭建多个虚拟机,下面给出主要版本下的虚拟机安装
ubuntu16.04 其安装脚本如下所示 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596#!/bin/shset -x# apt mirrorsudo tee /etc/apt/sources.list <<EOFdeb https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiversedeb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial m ...
virtio简介
前言在传统的设备模拟中,Qemu仿真完整的物理设备,每次guest的I/O操作都需要vm_exit和vcpu irq,如下所示
为了提高虚拟机的I/O效率,virtio协议被制定出来。在该方案中,guest能够感知到自己处于虚拟化环境,并且会加载相应的virtio总线驱动和virtio设备驱动与virtio设备进行通信,避免了guest的每次I/O操作都需要vm_exit和vcpu irq(仍然需要vm_exit和vcpu irq,但是将传统模拟中极多的vm_exit转换为virtio shared memory通信),如下所示
virtio协议根据virtio标准2.中的内容,virtio设备往往包含如下组件
One or more virtqueues
Device Configuration space
Notifications
Device status field
Feature bits
virtqueuevirtio设备和guest批量数据传输的机制被称为virtqueue,驱动和virtio设备共享virtqueue内存,整体如下所示(这里仅仅介绍split vi ...
qemu的PCI设备
前言PCI(Peripheral Component Interconnect)是一种连接电脑主板和外部设备的总线标准,其从1992年提出之后就逐渐取代了其他各种总线,被各种处理器所支持,在x86硬件体系结构中几乎所有设备都以各种形式连接到PCI设备树上。因为,想要更好的了解Qemu设备模拟的细节就需要从PCI入手。
PCI基础PCI总线结构下图是一个经典的PCI总线架构图
可以看到,PCI总线由三个基本组件构成
PCI设备(PCI device) 符合PCI总线标准(这里额外说明一下,PCI标准文档只允许PCI-SIG成员访问,可以尝试用公司邮箱登录访问)的设备就称为PCI设备,其能按照PCI总线标准进行交互。
PCI总线(PCI bus) 用以连接多个PCI设备/PCI桥的通信干道
PCI桥(PCI bridge) 总线之间的链接枢纽,可以连接CPU与PCI总线、PCI主总线与PCI次总线等
PCI设备编号每个PCI设备在系统中的位置由总线编号(Bus Number)、设备编号(Device Number)和功能编号(Function Number)唯一确定
PCI配置空 ...
qemu设备模型
前言Qemu支持种类繁多的外部设备,并且支持多种架构,这些架构和设备的模拟在Qemu的代码中占了大头。
这里简单介绍一下Qemu中用于设备模拟的模型,主要分为总线、设备前端和设备后端。
总线实际上,PC中各组件是通过总线互联通信的。再具体的说,设备与总线是交替的,总线下面只能连接设备,设备也只能连接到总线上,总线与总线、设备与设备之间是不能直接连接的,如下图所示。
参考之前的qemu基本知识中对象初始化内容,根据总线的TypeInfo,即bus_info,即可了解总线对象的相关信息。1234567891011121314static const TypeInfo bus_info = { .name = TYPE_BUS, .parent = TYPE_OBJECT, .instance_size = sizeof(BusState), .abstract = true, .class_size = sizeof(BusClass), .instance_init = qbus_initfn, .instance_finalize = ...
qemu内存模型
前言这里简单介绍一些QEMU的内存模型,即QEMU是如何管理gpa到hva的映射关系。
其内存模型主要由RAMBlock、MemoryRegion、AddressSpace和FlatView等结构构成。
RAMBlock无论如何,Qemu都需要申请一段内存空间用来存放虚拟机内存的真实数据,而这部分内存空间由struct RAMBlock来管理。
struct RAMBlock1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465struct RAMBlock { struct rcu_head rcu; struct MemoryRegion *mr; uint8_t *host; uint8_t *colo_cache; /* For colo, VM's ram cache */ ram_addr_t offset; ram_addr_t u ...
网卡与网络栈
前言偶然看到了arthurchiao大佬写的Linux 网络栈接收数据(RX):原理及内核实现(2022)文章,从中学习到了许多中断子系统和网络子系统的知识,收获颇丰,特别记录一下。
数据包处理流程下图是一个数据包从网卡通过内核网络栈到达用户空间的流程
网卡通过DMA写入数据到设备驱动预留的ring buffer中
网卡产生IRQ硬件中断
软中断处理线程ksoftirq基于ring buffer生成内核协议栈的数据包skb
内核链路层协议栈处理
内核网络层协议栈处理
内核传输层协议栈处理
参考
Linux 网络栈接收数据(RX):原理及内核实现(2022)
Linux 内核网络栈