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 ...
中断简介
前言最近计划学习一下cpu虚拟化相关内容,其中一个重要内容就是中断虚拟化。
在学习中断虚拟化之前,首先需要对中断有基本的了解认识,虽然之前在linux内核硬中断分析中有了解,但比较片面,这里对中断会进行更深入的学习
中断硬件本质上,内核是操作系统控制硬件的接口,其逻辑实现紧密遵循硬件规范。这种硬件强相关的特性,使得研究cpu的中断硬件机制成为理解内核中断子系统的关键点。
下面介绍一下cpu的中断硬件机制的发展
pic(Programmable Interrupt Controller)pic,也就是8259A,其是最早的cpu的中断管理芯片,其实物图和结构图如下所示
中断设置按照8259A的手册,一般通过pio的方式完成ICW(Initialization Command Words)和OCW(Operation Command Words)寄存器的读取和设置,从而完成中断触发方式、中断向量基址、中断状态等8259A工作状态的查询和设置,这里不详细介绍了,感兴趣可以查看8259A的手册
中断处理根据8259A的手册,一个典型的中断处理流程如下所示
一个或多个IR引脚发送中断信号(触发 ...
热迁移简介
前言工作中经常涉及到libvirt下qemu虚拟机的热迁移场景,这里简单介绍一下热迁移的整体流程
热迁移由virsh的migrate命令发起,最终调用virDomainMigrateVersion3Full()进行热迁移
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091//#0 virDomainMigrateVersion3Full// (domain=0x55555567a690, dconn=0x5555556731d0, xmlin=0x0, dname=0x0, uri=0x0, bandwidth=0, params=0x0, nparams=0, useParams=true, flags=1)// at ../src/libvirt-domain.c:3224// ...
libvirt基础知识
前言前面glib的事件循环博客简单介绍了libvirtd的事件循环,这里再介绍一些libvirt的基本知识,方便后续继续更深入的研究libvirt
libvirt架构下图是libvirt架构的整体架构图
具体来说,整个libvirt由virsh命令行工具、libvirtd守护进程和libvirt api库实现三部分构成
virsh命令行其将libvirt api封装并以命令行的形式供用户使用,代码位于tools/virsh.c路径
libvirtd守护进程其基于libvirt api以守护进程的形式管理本机虚拟化资源,并处理本机/远程virsh发送的rpc请求,其代码位于src/remote/remote_daemon.c路径
libvirt api库及其driver实现其将各个虚拟化组件的不同虚拟化技术抽象成统一的api,并以driver的形式调用具体的api实现。其中api定义在src路径的driver-$driver.h文件中,而具体的实现形式则在src的$driver文件夹中
driver根据前面libvirt架构章节内容,driver是libvirt功能的基本构建模块, ...
glib的事件循环
前言QEMU和libvirt等虚拟化组件的事件循环架构都是基于glib的事件循环机制实现的,这里一同分析一下
glib整个glib的事件循环架构由三个概念构成,即GMainLoop、GMainContext和GSource
GSourceglib用GSource表示每一个需要处理的事件源,其源代码如下所示1234567891011121314151617181920212223struct _GSourceFuncs{ GSourceFuncsPrepareFunc prepare; /* Can be NULL */ GSourceFuncsCheckFunc check; /* Can be NULL */ GSourceFuncsDispatchFunc dispatch; GSourceFuncsFinalizeFunc finalize; /* Can be NULL */ /*< private >*/ /* For use by g_source_set_closure */ GSourceFunc closure_ca ...
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 ...