利用 GDB、KGDB 调试 Linux 内核 驱动模块及应用程序.PDF
利用 GDB、KGDB 调试 Linux 内核
驱动模块及应用程序
目录
目标2
1 基础环境搭建3
1.1 资源环境 4
1.2 安装 vmware 虚拟机及 ubuntu 操作系统 4
2 编译内核5
2.1 配置内核参数5
2.2 编译内核7
3 配置双机通信 8
3.1 双机串口通信8
3.2 验证串口通信配置 10
4 配置串口调试 11
4.1 客户机调试配置 11
4.2 目标机调试配置12
5 GDB 双机调试环境14
5.1 驱动代码及编译 15
5.2 应用程序及编译17
5.3 验证驱动程序18
6 调试应用程序及驱动程序调用接口19
6.1 配置驱动调试19
6.2 调试应用程序 22
6.3 调试驱动程序 24
备注 26
1
目标
这几天看了一下 linux 内核提权的一个漏洞,里面涉及到了驱动程序漏洞及驱动调试内
容,由于各类 linux 操作系统版本的不同,如果不能在自己机器上亲自调试驱动程序,可以
说即使给了漏洞利用的 POC 源码也根本无法成功利用。因为内核漏洞的利用涉及到指令集
的 POC 构造,不同内核版本模块加载指令地址不同,导致即使有 POC 也根本无法利用,
只有在自己系统中亲自调试,才能做出相应的修改,达到内核漏洞利用的效果。这样就要求
我们对 linux 内核驱动的调试过程,调试方法有个深入了解。经过两天的各处查找 ,配置,
调试,终于弄清楚了内核调试的基本方法,为之后内核调试,漏洞分析提供技术支持。
在驱动程序开发或是内核漏洞分析过程中经常需要对内核模块进行调试。在通常情下对
于驱动程序的调试是利用最直接的方式即打印调试的方式,在驱动程序中通过 printk ,加入
调试信息。同时通过动态加载模块的方式,即可实现对驱动的动态调试,这也是最简单的调
试方式。而对于内核漏洞的分析,由于 linux 系统是开源项目,所有不管对于应用程序的调
试还是对内核驱动程序的调试都可以通过查看源码找到漏洞的触发点。
那如果想像调试用户态应用程序一样对内核驱动做动态的源码即调试或是更进一步的
对驱动程序进行汇编级调试或是开发内核漏洞利用程序那又该怎么办呢?也许有人会说一
般没有必要进行汇编级调试。但是在对内核漏洞利用过程中经常需要调试内核驱动程序,并
且需要对内核驱动进行汇编指令级单步跟踪,这样才能确定程序的走向。或是我们需要构造
特殊的指令块来完成某项功能。这样就对我们调试内核带来的新的挑战。
那内核里面又是怎么实现的呢,又该如果能够去跟进内核内部去调试呢?
本文就是要解决这个问题:在动态汇编调试用户态应用程序的同时,能够跟进应用程序
2
的的系统调用接口,直接源码级或是汇编级的调试(如果没有符号表)调试驱动程序。
本文演示的程序是通过一个应用程序 demo ,调用自己写的一个驱动程序接口,通过在
调试应用程序的是时候能够跟进调试驱动程序。搭建这样的环境我们使用了 vmware 虚拟机,
该虚拟机使用普遍,安装简单。为了能够调试程序,需要一个目标机和一个客户机。
目标机是用来安装驱动程序,同时运行应用程序,应用程序会调用驱动程序中的接口。
同时目标机自己调试应用程序(用户态使用 GDB 调试 )。
客户机是用来连接客户机,同时在客户机中调试目标机中的驱动程序(使用 GDB 调试)。
需要注意几点:
1. 为了能够能够调试目标机的驱动程序,要求目标机需要支持 KGDB 调试。
2. 为了能让客户机与目标机通信,我们在 vmware 中配置这两台机器通过串口通信调试。
3. 客户机如果要支持驱动的源码级调试需要将驱动程序的符号表加载的客户机的调试器
中。
4. 本文用的 vmware 虚拟机需要将目标机和客户机同时安装在虚拟机中。
5. 由于在文章中会包含客户机和目标机的操作过程和调试过程,本文中会使用绿框表示客
户机相关操作,使用红框表示目标机上的相关操作。
1 基础环境搭建