环境
虚拟机 :CentOS7.9
QEMU:5.2
编译内核版本:5.0
GCC版本:9.3.0
GDB版本:8.2.1
0x01 QEMU
QEMU安装
官网直接下载最新的5.2版本
执行configure的时候会提示,需要python3.6以上版本,直接yum安装3.6.8
需要如下依赖,依次安装gcc9.2、Ninja、re2c、zlib、zlib-devel、SDL2,这里qemu5.2不安装SDL2可能会出现vnc
安装过程中的报错,以此根据报错信息安装必要依赖即可
GCC9.2安装
方式1
yum -y install centos-release-sclyum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutilsscl enable devtoolset-9 bash
需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。如果要长期使用gcc 9.3的话:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
方式2
选择安装gcc9.2版本,因为要编译linux 5.0内核,所以选了稍微新点的gcc版本,别的版本可能会报错,自行根据报错信息搜索解决(源码安装时间非常长,另外需要注意编译的时候内存可能不足)
下载源码https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz
Ninja安装
先安装re2c,官网下载最新版本,官网地址 http://re2c.org/index.html
0x02 编译Linux内核
执行make menuconfig,提示需要安装ncurses、flex、bison、libelf、openssl-devel,按提示安装即可
安装完后再次执行make menuconfig,如下所示
![QEMU Linux 内核调试环境搭建 QEMU Linux 内核调试环境搭建]()
这里默认已经选上了编译时带调试信息,可以什么都不改,直接保存.config信息就好,直接开始编译make -j8,等待编译完成
编译完成后会在arch/x86/boot/目录下生成bzImage文件(压缩文件),同时会生成vmlinux文件(未压缩,带调试信息)
0x03 调试
这里某些版本gdb需要先对源文件进行patch,然后重新编译安装,否则可能会报Remote 'g' packet reply is too long
的错误
改源码gdb/remote.c 8030行左右
修改完后重新make && make install
我使用8.2版本gdb,修改完直接编译安装就好
至此,全部环境准备完毕,用qemu-system-x86_64来启动编译好的内核,参数如下,具体用处不再赘述。
![QEMU Linux 内核调试环境搭建 QEMU Linux 内核调试环境搭建]()
要加载内核,只需要qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage即可,因为此处需要链接gdb进行调试,所以需要添加其他参数,如下
其中append中的参数为内核启动参数,nokaslr表示关闭内核地址随机化,否则gdb设置断点无法正确工作,gdb连接连接调试的时候,带上-s -S参数,内核会在最开始启动的位置停止,等待gdb连接
此时再启动gdb vmlinux,设置target remote localhost:1234进行连接,再在start_kernel函数处下断点即可,某些环境下,可能需要使用硬件断点hb start_kernel,否则无法断在start_kernel处
![QEMU Linux 内核调试环境搭建 QEMU Linux 内核调试环境搭建]()
环境搭建完成,开始内核调试吧
原文始发于微信公众号(PWN2LUKA):QEMU Linux 内核调试环境搭建
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论