从虚拟化前端Bug学习分析Kernel Dump( 八 )

打印出的信息并结合之前的分析 , 可以知道:1. virtqueue_add 的前五个参数分别是 struct virtqueue、struct scatterlist、 unsigned int、 unsigned int、 unsigned int 类型的 , 对应的是 RDI RSI RDX RCX R8 这五个寄存器的值 。 2. 触发 bug 的语句是第 278 行的 BUG_ON(total_sg > vq->vring.num);
通过 struct virtqueue ffff917c6c67d000 可以解析出第一个参数的结构:

回到刚刚我们讨论的 %eax 和 [%rdi + 0x38
, [%rdi + 0x38
实际上就是 virtqueue 中偏移量为 0x38 的值 , 通过 struct -o virtqueue 可以打印出 virtqueue 各成员的偏移:

这里又出现了一个问题 , 0x38 是十进制的 56 , 而这个结构体的大小总共只有 56 个字节 , 难道是“溢出”了?仔细阅读代码后发现 , 代码里有一句 struct vring_virtqueue *vq = to_vvq(_vq); , to_vvq 是一个宏 , 定义如下 #define to_vvq(_vq) container_of(_vq struct vring_virtqueue vq)

推荐阅读