使用virtualbox和gdb调试内核
2017-06-29 15:00
447 查看
前言
最近终于打算着手开始学习内核的pwn了,基础知识接触了一些,但是问题最大的是,kernel的运行环境和一般的用户空间程序不一样,调试方法也不一样,所以打算记录一下自己学习如何进行kernel的调试,这才算是进入kernel exploit的第一步。另外,我发现了网上的教程或多或少都存在一些没说清楚的地方,导致不能完整的复现以达到目的,所以决定自己研究一下。
光是一个kernel是没办法调试的,还需要一些其他的东西,比如一个能用的shell。但是鉴于添加这些东西比较麻烦,所以最终我决定使用virtualbox进行虚拟化,直接使用ubuntu的镜像
环境
manjaro linux(arch linux based)virtualbox
ubuntu iso
准备工作
安装virtualbox、gdb、socat
由于我在archlinux下,所以可以用pacman安装。sudo pacman -S gdb socat
至于virtualbox可以使用aur:
yaourt virtualbox
然后选择合适的版本安装即可
编译linux内核
我们需要自己编译一个debug的内核,下载源码可以直接在github的linux repo下载最新版本。下载的时候建议用git clone,虽然有点大,但是至少是正确的,如果下载zip包不知道是什么原因,我这边编译会出错。
之后进行配置:
make menuconfig
配置的时候我关闭了selinux,并且打开了kgdb,方便之后的exploit调试,以及在
Kernel Hacking选项中的
compile time的选项里打开了
compile kernel with debug info,这是为了能够进行源码级的调试,第一次编译我忘记打开这个选项导致没有符号,所以一定要记得打开这个选项。其他选项没做改动。然后就可以开始编译了。
make -j4
-j4是指定为4线程编译,我是4核的cpu,所以是
-j4,目的是加快速度,是多少核的cpu就用多少,可以使得速度更快一点。
虚拟机安装ubuntu和新编译的kernel
这一点没啥好说的,我们的目的是在虚拟机里调试ubuntu系统内核。编译好之后通过共享文件夹可以在source里
make install就可以安装内核了,重启就可以通过
uname -r看到效果了。
设置virtualbox串口
在virtualbox的settings里面选择serial port,勾选enable serial port,之后取消勾选
connect to existing pipe/socket。port number、irq、I/O port就使用默认,port mode选择
HOST PIPE,下面的目录填上
/tmp/serial。其实这个目录你填哪个都可以,不过需要注意一点:一定要有权限,否则会创建文件不成功,启动的时候报VER_FILE_NOT_FOUND的错误。
更改grub文件配置
因为我们需要使用kgdb进行调试,所以需要在启动的时候多向kernel传入两个参数,所以需要更改配置文件。ubuntu下,文件位于
/etc/default/grub,需要root权限进行编辑。
在
GRUB_CMDLINE_LINUX_DEFAULT选项后面增加
kgdboc=ttyS0,115200 kgdbwait,我的这个选项最终变成了这样:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash kgdboc=ttyS0,115200 kgdbwait"
然后保存,
sudo grub-update,重启,如果一切正常,你会发现启动卡住了,显示等待connection from remote gdb。
启动socat
好了现在我们的内核已经等着我们attach了,接下来就是需要attach上去:sudo socat -d -d /tmp/serial PTY
这里的路径是你刚才填入的路径,运行之后保持这个终端不要关闭。注意这里的终端会显示这样的东西:
2017/06/29 14:50:16 socat[3840] N opening connection to AF=1 "/tmp/serial" 2017/06/29 14:50:16 socat[3840] N successfully connected from local address AF=1 "ZZZZZZZZZZZZZZ\xEE\xEE\xEE\xEE \xEE\xEE\xEE\xEE\xEE\xEE" 2017/06/29 14:50:16 socat[3840] N successfully connected via <anon> 2017/06/29 14:50:16 socat[3840] N PTY is /dev/pts/1 2017/06/29 14:50:16 socat[3840] N starting data transfer loop with FDs [5,5] and [6,6]
我们需要记下来这个
/dev/pts/1,下一步会用到
启动gdb
到我们刚才编译linux内核的目录下,如果编译成功会有一个vmlinux,gdb这个文件:gdb vmlinux
之后就可以attach到远程了
target remote /dev/pts/1
很显然这里的路径就是刚才socat的路径了。如果运气足够好,没有任何问题,我们就已经attach到了虚拟机里的内核上,之后continue,会发现虚拟机已经开始正常运行,就说明我们的调试开始了。
不过现在有个问题,我们已经可以调试了,可是当我们continue之后,怎么再断下来呢?答案就是:
echo g > /dev/sysrq-trigger
在虚拟机里执行这句话,执行之后会发现卡住了!然后回到gdb,就可以看到已经断下来了。
相关文章推荐
- 如何使用gdb调试android webkit内核代码
- 如何使用gdb调试android webkit内核代码
- 使用Qemu+gdb来调试内核
- 使用bochs和gdb联合调试Linux内核
- 使用VirtualBox和KGDB调试内核
- 如何使用Qemu+gdb来调试内核
- 如何在安卓系统上使用arm-linux-gdb调试内核
- 内核panic后使用GDB调试
- 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】
- 使用 GDB 调试 uCLinux 内核
- 使用Bochs和GDB对内核进行源代码级调试
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
- 使用gdb跟踪调试内核从start_kernel到init进程启动
- 使用 GDB 和 KVM 调试 Linux 内核与模块
- 使用 GDB 和 KVM 调试 Linux 内核与模块
- 使用gdb调试内核错误信息
- Linux内核分析之三——使用gdb跟踪调试内核从start_kernel到init进程启动
- 构造一个简单的Linux系统MenuOS,使用gdb调试内核
- [转贴]使用 GDB 调试 uCLinux 内核
- 使用Qemu+gdb来调试内核