VMware上进行Linux Kernel调试

之前的Linux内核调试都是编译内核源码后,用qemu启动来调试,但是实际一些Linux的发行版还是需要用其他的虚拟机软件来进行调试,这里记录一下VMware调试环境的搭建过程。 主机是Ubuntu14.04 x86_64
VMware Workstation 12.5.6
虚拟机是Ubuntu12.04.5 x86_64
主机选择Ubuntu是因为需要用gdb对VMware中的Linux Kernel进行调试,选择这个版本的虚拟机是因为有一篇关于内核ROP的文章用到的这个版本,为了方便后面做实验选择这个版本。 配置过程如下:
1.安装Ubuntu12.04.5 x86_64虚拟机,安装vmware-tools。
2.修改虚拟机的配置文件:

1
2
3
4
$ cd vmware/Ubuntu-12.04-64bit
$ vim Ubuntu-12.04-64bit.vmx
...
debugStub.listen.guest64="TRUE"

在配置文件的末尾加上debugStub.listen.guest64="TRUE"
3.将虚拟机的内核可执行文件提取出来:

1
2
3
$ sudo ./extract-vmlinux /boot/vmlinuz-3.13.0-32-generic > vmlinux
$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=0x32143d561875c4e5f3229003aca99c880e2bedb2, stripped

其中的extract-vmlinux是用于解压Linux内核可执行文件的。有个问题就是符号表被去掉了,有一个方法是自己编译安装一个内核,这样内核可执行文件的符号表就不会被去掉了。
4.连接gdb开始调试
VMware虚拟机的调试服务是在主机的回环端口8864(32位虚拟机是8832),用gdb连接服务,调试虚拟机。将上一步中提取出的内核可执行文件拷贝到主机中,启动虚拟机,虚拟机启动完成后,在主机中执行:

1
2
3
4
5
6
$ gdb vmlinux
(gdb) set architecture i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) target remote :8864
Remote debugging using :8864
...

gdb中c继续运行,ctrl+c暂停。接下来就可以VMware中随意调试Linux Kernel了!
补充
前面介绍的是在Linux主机上的调试,但是Mac上就很不方便,gdb不能识别elf文件,所以我用了IDA来调试VMware上的Linux Kernel。方法和上面差不多,就是在虚拟机启动后,用IDA打开内核映像,选择Debugger为Remote GDB debugger,点击运行,配置host为127.0.0.1,port为8864(32位为8832)。
reference
Linux Kernel Debugging with VMware and GDB
Vmware+gdb调试Linux内核