使用virtualbox和gdb调试内核

前言

最近终于打算着手开始学习内核的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,就可以看到已经断下来了。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读