QEMU Linux 内核调试环境搭建

admin 2023年6月1日10:27:51评论37 views字数 2986阅读9分57秒阅读模式

环境 

虚拟机 :CentOS7.9

QEMU:5.2

编译内核版本:5.0

GCC版本:9.3.0

GDB版本:8.2.1

 

0x01 QEMU

QEMU安装

官网直接下载最新的5.2版本


wget https://download.qemu.org/qemu-5.2.0.tar.xz
tar xvJf qemu-5.2.0.tar.xz
cd qemu-5.2.0
./configure
make
make install

执行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


wget https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz
tar xvJf gcc-9.2.0.tar.xz
cd gcc-9.2.0
./contrib/download_prerequisites # 下载依赖gmp/mpc/mpfr/isl
# 编译依赖项需要有gcc,机器上没有gcc的yum install gcc安装一下就好,然后分别编译安装依赖项,需要先安装m4
wget https://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.xz
tar xvJf m4-1.4.18.tar.xz
cd m4-1.4.18
./configure
make && make install
# 安装gmp, 其他类似,分别安装即可,有报错的话注意看错误信息
./configure
make -j8
make install
创建编译目录进行编译
mkdir build
cd build
../configure --enable-threads=posix --disable-checking --disable-multilib
make -j8
make install

 

Ninja安装

先安装re2c,官网下载最新版本,官网地址 http://re2c.org/index.html


wget https://github.com/skvadrik/re2c/releases/download/2.0.3/re2c-2.0.3.tar.xz
tar xvJf re2c-2.0.3.tar.xz
cd re2c-2.0.3/
autoreconf -i -W all(没有configure可以先执行Autotools)
./configure
make
make install

 

0x02 编译Linux内核


wget https://github.com/torvalds/linux/archive/v5.0.tar.gz
tar zxvf v5.0.tar.gz
cd linux-5.0

执行make menuconfig,提示需要安装ncurses、flex、bison、libelf、openssl-devel,按提示安装即可

安装完后再次执行make menuconfig,如下所示

QEMU Linux 内核调试环境搭建

这里默认已经选上了编译时带调试信息,可以什么都不改,直接保存.config信息就好,直接开始编译make -j8,等待编译完成

编译完成后会在arch/x86/boot/目录下生成bzImage文件(压缩文件),同时会生成vmlinux文件(未压缩,带调试信息)

 

0x03 调试

这里某些版本gdb需要先对源文件进行patch,然后重新编译安装,否则可能会报Remote 'g' packet reply is too long的错误

改源码gdb/remote.c 8030行左右


if (buf_len > 2 * rsa->sizeof_g_packet){
    /* 需要注释的原版代码 */
    //error (_("Remote 'g' packet reply is too long (expected %ld bytes, got %d "
    // "bytes): %s"), rsa->sizeof_g_packet, buf_len / 2, rs->buf);
    
    /* 新增补丁代码 */
    rsa->sizeof_g_packet = buf_len ;
    for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
        if (rsa->regs[i].pnum == -1)
            continue;
        if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
            rsa->regs[i].in_g_packet = 0;
        else  
            rsa->regs[i].in_g_packet = 1;
    }
  }

修改完后重新make && make install

我使用8.2版本gdb,修改完直接编译安装就好


wget https://ftp.gnu.org/gnu/gdb/gdb-8.2.1.tar.xz
tar xvJf gdb-8.2.1.tar.xz
cd gdb-8.2.1
mkdir build
../configure
make -j8
make install

 

至此,全部环境准备完毕,用qemu-system-x86_64来启动编译好的内核,参数如下,具体用处不再赘述。

QEMU Linux 内核调试环境搭建

 

要加载内核,只需要qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage即可,因为此处需要链接gdb进行调试,所以需要添加其他参数,如下


qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -append="nokaslr" -s -S

其中append中的参数为内核启动参数,nokaslr表示关闭内核地址随机化,否则gdb设置断点无法正确工作,gdb连接连接调试的时候,带上-s -S参数,内核会在最开始启动的位置停止,等待gdb连接

此时再启动gdb vmlinux,设置target remote localhost:1234进行连接,再在start_kernel函数处下断点即可,某些环境下,可能需要使用硬件断点hb start_kernel,否则无法断在start_kernel处

QEMU Linux 内核调试环境搭建

环境搭建完成,开始内核调试吧


原文始发于微信公众号(PWN2LUKA):QEMU Linux 内核调试环境搭建

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月1日10:27:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   QEMU Linux 内核调试环境搭建https://cn-sec.com/archives/602051.html

发表评论

匿名网友 填写信息