qemu默认内存大小 qemu pwn_github

#!/bin/bash
while true
    do ./qemu-system-x86_64 -m 1024 -smp 2 -boot c -cpu host -hda ubuntu_server.qcow2 --enable-kvm -drive file=./blknvme,if=none,id=D22 -device nvme,drive=D22,serial=1234 -net user,hostfwd=tcp::2222-:22 -net nic && sleep 5
done

看得出来设备叫nvme

qemu默认内存大小 qemu pwn_ubuntu_02


然后发现有一堆函数

根据 2018 seccon pwn q-escape的经验
这么多函数估计是改某个qemu里面本来就有的设备改来的。

那么我们的处理办法就是找到改的是qemu的哪个设备,比对比对改了哪里,快速定位漏洞点。

首先我们要研究一下
这是改的哪个设备源码

在github的qemu源码仓库里

qemu默认内存大小 qemu pwn_数组_03

qemu默认内存大小 qemu pwn_ubuntu_04

然后就基本定位到了或者我们也可以直接看这里

qemu默认内存大小 qemu pwn_github_05


当然还顺手在realize函数里发现申请了两个mmio空间

qemu默认内存大小 qemu pwn_网络安全_06


qemu默认内存大小 qemu pwn_数组_07

然后来这看
booltin

我们比对的重点肯定还是要放在

qemu默认内存大小 qemu pwn_qemu默认内存大小_08


这四个函数上面nvme_mmio_read看到少了对addr检测的那一部分

qemu默认内存大小 qemu pwn_网络安全_09

这里显然就有个任意读nvme_mmio_write

qemu默认内存大小 qemu pwn_qemu默认内存大小_10


这里也有点不同,对addr的限制一个是直接写死0xfff,一个是用了n->bar

这不同会不会造成什么影响

那就往里面读一下

qemu默认内存大小 qemu pwn_qemu默认内存大小_11

在函数最后我们能通过addr来当做偏移往n->bar.cap数组里面读。

那么问题来了
这个数组容量是多少,能不能放得下0x1000

我们开始找

首先先找到n里面的bar

qemu默认内存大小 qemu pwn_数组_12


这个结构体叫NvmeBar_0

然后他是NvmeBar

qemu默认内存大小 qemu pwn_github_13

这个结构体只有0x40大小

显然存在越界写

所以到此我们的思路就比较明确了
cmb那个说实话也不用看了

我们思路就通过越界读,泄露程序基地址,泄露堆地址
走的还是劫持QEMUTime结构体的路子

来找找结构体

一个一个找

qemu默认内存大小 qemu pwn_github_14


最后在这发现的

qemu默认内存大小 qemu pwn_qemu默认内存大小_15


所以就直接劫持他就好了。然后我们找到一条这样的调用链

qemu默认内存大小 qemu pwn_qemu默认内存大小_16


qemu默认内存大小 qemu pwn_网络安全_17

qemu默认内存大小 qemu pwn_ubuntu_18

qemu默认内存大小 qemu pwn_ubuntu_19

qemu默认内存大小 qemu pwn_qemu默认内存大小_20


qemu默认内存大小 qemu pwn_数组_21


覆盖参数的话我们就正常申请个chunk放进去或者越界任意写写在个啥地方就行。