Linux内核编译与qemu-gdb调试
内核下载
官方下载链接https://mirrors.edge.kernel.org/pub/
清华源https://mirrors.tuna.tsinghua.edu.cn/kernel/
我下载的是4.4版本的内核,因为准备要复现一下dirty-cow脏牛的漏洞
内核编译
- 下载到本地,解压,然后进入linux-4.4目录
1 | |
- 设置架构信息,根据自己的需求,如果是别的架构需要用交叉编译工具
1 | |
- 设置配置信息,选择我们需要的“菜单”,选择对应架构的“菜单”,这样内核才不会上错菜是吧
1 | |
- 配置内核
1 | |
然后就会出现一个界面

这一步其实是对第2步的菜单进行微调,我们需要内核支持ramdisk驱动,所以需要选中如下配置:
1 | |
这里是ramdisk相关介绍https://www.cnblogs.com/chen-farsight/p/6119901.html
如果要启动debug,关闭地址随机化,不然断点处无法停止。
1 | |
- 编译内核
1 | |
编译成功后的内核位于:arch/x86_64/boot/bzImage

编译busybox
下载地址
https://busybox.net/downloads/
我下载的是1.34.1版本
-
解压busybox
1
tar xvf busybox-1.34.1.tar.bz2 -
配置busybox源码
1
2
3
4
5make menuconfig Settings ---> [*] Build BusyBox as a static binary (no shared libs) 因为busybox是最小的文件系统,是不带C库的,所以这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作。make报错看https://www.cnblogs.com/rose-/p/12991456.html,原因是版本太老,要改Makefile
-
编译和安装
1
make && make install -
编译好了会放在根目录的_install里边,我们可以看到文件都指向了_install里边的bin文件夹下的busybox

然后可以看到busybox是个ELF可执行文件,实际上上面那些文件就是软连接到busybox这个文件,然后busybox根据名字判断调用相对应的函数

我们还需要补充一些必要的文件或目录,因为现在我们只有一些目录,并不是一个完整的文件系统,内核启动的时候它是无法识别目录的,所以我们还要将_install下面的这些目录打包成内核可以识别的文件系统:
1 | |
这样busybox文件系统就编译好了
制作根文件系统镜像文件
-
先制作一个空的镜像文件;
-
然后把此镜像文件格式化为ext3格式;
-
然后把此镜像文件挂载,并把根文件系统复制到挂载目录;
-
卸载该镜像文件。
-
打成gzip包。
要在busybox目录下运行脚本
1 | |
最终生成的文件系统镜像名字为:rootfs.img.gz
用QEMU启动内核和文件系统
安装qemu模拟器sudo apt install –install-suggests qemu
1 | |
1 | |
Ctrl+A 松开后按 X 退出qemu
内核函数调试
启动命令中添加-s参数与-S参数启动qemu
1 | |
运行完发现QEMU没有启动系统,因为要在gdb调试vmlinux才能运行
1 | |
然后在qemu里输入ls触发new_sync_read