#!/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
然后发现有一堆函数
根据 2018 seccon pwn q-escape的经验
这么多函数估计是改某个qemu里面本来就有的设备改来的。
那么我们的处理办法就是找到改的是qemu的哪个设备,比对比对改了哪里,快速定位漏洞点。
首先我们要研究一下
这是改的哪个设备源码
在github的qemu源码仓库里
然后就基本定位到了
或者我们也可以直接看这里
当然还顺手在realize函数里发现申请了两个mmio空间
然后来这看
booltin
我们比对的重点肯定还是要放在
这四个函数上面
nvme_mmio_read看到少了对addr检测的那一部分
这里显然就有个任意读
nvme_mmio_write
这里也有点不同,对addr的限制一个是直接写死0xfff,一个是用了n->bar
这不同会不会造成什么影响
那就往里面读一下
在函数最后我们能通过addr来当做偏移往n->bar.cap数组里面读。
那么问题来了
这个数组容量是多少,能不能放得下0x1000
我们开始找
首先先找到n里面的bar
这个结构体叫NvmeBar_0
然后他是NvmeBar
这个结构体只有0x40大小
显然存在越界写
所以到此我们的思路就比较明确了
cmb那个说实话也不用看了
我们思路就通过越界读,泄露程序基地址,泄露堆地址
走的还是劫持QEMUTime结构体的路子
来找找结构体
一个一个找
最后在这发现的
所以就直接劫持他就好了。
然后我们找到一条这样的调用链
覆盖参数的话我们就正常申请个chunk放进去或者越界任意写写在个啥地方就行。