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


现在来看看 ffffffffc023a382+1186 这行代码到底是什么 , 通过 dis 命令可以查看到对应的汇编 。 但当我们执行dis virtqueue_add+1186的时候 , 发现报错了 , 报错的内容是 symbol 有重复 。

我们可以通过 RIP 的值来计算出当前的 virtqueue_add 对应的是哪个 symbol , 计算方法很简单 , 只要把 RIP 的值减去偏移量 1186 即可 。

crash> p/x 0xffffffffc023a382-1186

$1 = 0xffffffffc0239ee0

通过 dis ffffffffc0239ee0 可以打印出 virtqueue_add 的汇编 , 找到 virtqueue_add+1186

该行汇编实际上是 ud2 , 这是一条 undefined 的语句 , 也正是因为这条语句让系统宕机了 。 这个时候通常应该往上找 , 看看之前执行过的指令是什么 。 这里上一条指令是 jmpq , 这是无条件跳转语句 , 跳转到 virtqueue_add+953 , 也就是说 ud2 指令的上一条指令一定不是 jmpq 这条 , 可以猜到应该是前面有某个跳转直接跳到这里来了 , 往上找找就可以找到

推荐阅读