您的位置:首页 > 其它

使用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,就可以看到已经断下来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: