Kernel Pwn 学习(一)
kernel pwn 环境搭建
# 编译内核
首先到 linux 内核官网下载一份内核源代码并解压
选择一个版本下载,我选的是 4.9 [tallball],
之后安装需要的依赖
1 | sudo apt-get update |
解压源码后进入内核目录,输入命令 sudo make menuconfig 进入内核设置
进入 kernel hacking,检查保证勾选了以下选项 (其实默认都是勾选的,只是进去看一眼而已)
- Kernel debugging
- Compile-time checks and compiler options —> Compile the kernel with debug info 和 Compile the kernel with frame pointers
- KGDB: kernel debugger
保存并退出
sudo make bzImage
生成 bzImage,过程挺久的,完成后在 boot 下生成了一个 bzImage 文件
注:
在过程中可能报错
没有规则可制作目标debian/certs/debian-uefi-certs.pem由certs/x509_certificate_list需求停止
解决方法:在主目录 /usr/src/linux… 中修改.config 文件,去掉上述内容(如果还是不行就修改 linux.4.9 中的.config 对应部分为空
重新编译即可
# 编译 busybox 构建文件系统
在 busybox 官网下载 busybox 文件,最新版的就行
解压后进入目录, make menuconfig
,同样会进入图形界面,在 Settings 上勾选 Build static binary (no shared libs), 然后保存退出
编译,执行 make install
,根目录下会生成一个 _install
文件夹,进入文件夹配置
1 | cd _install |
编辑 init 文件,用于内核初始化
1 | #!/bin/sh |
几个常见指令
- insmod: 指定模块加载到内核中
- rmmod: 从内核中卸载指定模块
- lsmod: 列出已经加载的模块
在 packet 中写入,用于将 FileSystem 打包成映像
1 | #!/bin/sh |
运行 packet 将得到 rootfs.img 文件
# 运行内核
安装 qemu
1 | 安装QEMU的依赖库 |
之后写一个 shell 脚本启动 qemu, 将前面生成的 bzImage,rootfs.img 一起放到_install 文件夹下,运行 boot.sh,结果如下
如果显示权限不够则 chmod +x boot.sh 并在 root 下运行即可
shell 中参数的含义:
1 | -m 是指定RMA大小(默认384) |
到这里也说明了为什么 kernel pwn 题目一般都会给出这 3 个文件 .sh ,bzImage,rootfs.cpio
,分别是启动脚本,kernel 镜像以及文件系统映像
一般来说 kernel pwn 里面,漏洞通常是出现在 ko 文件,也就是模块文件,驱动 文件中,而 kernel pwn 的最终目标一般是提权,拿到 root 才能读取 flag
# 参考文章
Kernel Pwn 学习(一)