2019 强网杯 pwn final ExecChrome

在这里插入图片描述

#!/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放进去或者越界任意写写在个啥地方就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值