之前的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 | $ cd vmware/Ubuntu-12.04-64bit |
在配置文件的末尾加上debugStub.listen.guest64="TRUE"
。
3.将虚拟机的内核可执行文件提取出来:
1 | $ sudo ./extract-vmlinux /boot/vmlinuz-3.13.0-32-generic > vmlinux |
其中的extract-vmlinux是用于解压Linux内核可执行文件的。有个问题就是符号表被去掉了,有一个方法是自己编译安装一个内核,这样内核可执行文件的符号表就不会被去掉了。
4.连接gdb开始调试
VMware虚拟机的调试服务是在主机的回环端口8864(32位虚拟机是8832),用gdb连接服务,调试虚拟机。将上一步中提取出的内核可执行文件拷贝到主机中,启动虚拟机,虚拟机启动完成后,在主机中执行:
1 | $ gdb vmlinux |
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内核