使用QEMU+GDB调试Linux内核
Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

Linux下交叉编译gdb,gdbserver+gdb的使⽤以及通过gdb调试core⽂件交叉编译gdb和gdbserver$ tar jxvf gdb-7.2.tar.bz2注:⼩技巧:Linux下⼀般压缩⽂件后缀为.tar.bz2和.tar.gz,它们解压命令有两三个选项是⼀致的:xf(v),前者再加上j选项,后者再加上z选项。
3、进⼊该⽬录$ cd gdb-7.2/4、配置$./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/usr/local/arm-gdb注:--target=arm-linux意思是说⽬标平台是运⾏于ARM体系结构的linux内核;--program-prefix=arm-linux-是指⽣成的可执⾏⽂件的前缀,⽐如arm-linux-gdb,--prefix是指⽣成的可执⾏⽂件安装在哪个⽬录,这个⽬录需要根据实际情况作选择。
如果该⽬录不存在,会⾃动创建,当然,权限⾜够的话。
5、编译、安装$ make$ make install幸运的话,会在--prefix指定的⽬录下⽣成三个⼦⽬录:bin、lib、share,我们需要的arm-linux-gdb就在其中的bin⽬录下。
如果你不⼩⼼查看它的⼤⼩的话,会发觉它有14MB那么⼤!天呐!怎么会占这么多空间?没关系,我们可以为它瘦⾝。
没错!就是使⽤strip命令!$ strip arm-linux-gdb -o arm-linux-gdb-stripped$ ls -lh总计 33M-rwxr-xr-x 1 latelee root 14M 12-14 16:16 arm-linux-gdb-rwxr-xr-x 1 latelee root 3.1M 12-14 16:25 arm-linux-gdb-stripped可以看到,strip后的⽂件⼤⼩只有3.1MB,瘦⾝效果明显!如果做⼴告的话,绝对有说服⼒。
Linux命令高级技巧使用gdb命令进行程序的调试与分析

Linux命令高级技巧使用gdb命令进行程序的调试与分析在Linux环境下,gdb(GNU调试器)是一个非常强大的工具,用于调试和分析程序的运行。
它提供了丰富的功能,能够帮助开发人员定位和解决程序中的错误。
本文将介绍一些使用gdb命令进行程序调试与分析的高级技巧。
一、安装gdb命令若系统中尚未安装gdb命令,可以通过以下方式安装:1. 打开终端窗口2. 输入命令“sudo apt-get install gdb”并按下回车键3. 输入用户密码并按下回车键4. 等待安装完成二、使用gdb调试程序调试程序是开发过程中非常重要的一环。
gdb提供了各种功能,可以帮助开发人员追踪代码的执行,查找变量的值,以及定位程序中的错误。
下面介绍一些常用的调试命令:1. 启动gdb调试使用命令“gdb <可执行文件>”启动gdb调试器,其中<可执行文件>是需要调试的程序的路径和文件名。
2. 设置断点在需要设置断点的代码行前面输入“break”命令,例如“break main”,即可在main函数入口处设置断点。
使用命令“info breakpoints”可以查看已设置的断点。
3. 运行程序输入“run”命令,即可开始运行程序。
程序运行到断点处会自动停止,等待用户进行调试操作。
4. 单步执行输入“next”命令可逐行执行程序,遇到函数调用时会直接跳过,并进入下一行。
若想进入函数内部进行调试,使用“step”命令。
5. 查看变量值使用“print <变量名>”命令可以查看变量的值,例如“print num”即可查看名为num的变量的值。
6. 修改变量值输入“set <变量名>=<新值>”命令可以修改变量的值,例如“setnum=10”即可将名为num的变量的值修改为10。
7. 继续执行使用“continue”命令可以让程序继续执行,直到遇到下一个断点或程序结束。
QEMU、GDB的安装及简单使用

2.4 实例—创建交叉编译环境1.从网上下载或使用开发板公司在附赠光盘中提供的交叉编译工具链(1)从网上下载arm-linux-gcc或arm-linux-tools压缩包(2)解压arm-linux-gcc-2.95.3.tar.bz2到/usr/local/arm/中# mkdir /usr/local/arm# tar -xjvf arm-linux-gcc-2.95.3.tar.bz2 -C /usr/local/arm/(u-boot)等。
(3)解压arm-linux-gcc-3.4.1.tar.bz2到/usr/local/arm/中# tar -xjvf arm-linux-gcc-3.4.1.tar.bz2 -C /BootLoader(u-boot)等。
在编译时如果所用的版本不行的话,可以试试其它的版本,可以在Makefile文件中指定。
(4)解压arm-linux-tools-20070808.tar.gz(4.2.1版本)# tar -xzvf arm-linux-tools-20070808.tar.gz -C /注意:经过上述安装步骤,本系统默认的arm-linux-gcc是arm-linux-gcc-4.2.1,如果要使用其它版本,可以在Makefile文件中指定。
2.5 实例—QEMU、GDB的安装及简单使用2.5.1 QEMU的安装1.在/下载QEMU最新版# wget /download/qemu-1.4.0.tar.bz2 2.解压qemu-1.4.0.tar.bz2# tar -xjvf qemu-1.4.0.tar.bz23.生成QEMU的Makefile# cd qemu-1.4.0# ./configure --target-list=arm-softmmu,arm-linux-user4.编译、安装QEMU# make -j 2 //双核的CPU# make install //命令安装在/usr/local/bin/5.查看QEMU版本6.查看QEMU命令2.5.2 GDB的安装1.在/software/gdb/下载GDB最新版# wget ftp:///pub/gdb/releases/gdb-7.5.1.tar.bz2 2.解压gdb-7.5.1.tar.bz2# tar -xjvf gdb-7.5.1.tar.bz23.生成GDB的Makefile# cd gdb-7.5.1# ./configure --target=arm-linux4.编译、安装GDB# make# make install两个命令安装在/usr/local/bin/:arm-linux-run、arm-linux-gdb。
[Linux学习gdb调试教程]
![[Linux学习gdb调试教程]](https://img.taocdn.com/s3/m/332c01fdfbb069dc5022aaea998fcc22bcd14318.png)
There is NO WARRANTY, to the extent permitted by law. Type
不应该怀疑代码而应该怀疑数据,因为第一次和第二次运行的都是同一段 "show copying"
代码,如果代码是错的,那为什么第一次的结果能对呢?然而第一次和第
and "show warranty" for details.
files -- Specifying and examining files
to "word".
internals -- Maintenance commands
Command name abbreviations are allowed if unambiguous.
在编译时要加上-g 选项,生成的可执行文件才能用 gdb 进行源码级 件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到
调试:
可执行文件中,所以在调试时必须保证 gdb 能找到源文件。gdb 提供一个
第 2 页 共 10 页
本文格式为 Word 版,下载可任意编辑,页眉双击删除即可。
第一个结果正确[20],第二个结果显然不正确,在小学我们就听说过
This is free software: you are free to ch的故事,从 1 加到 100 应该是 5050。一段代码,第一次运行 it.
结果是对的,第二次运行却不对,这是很常见的一类错误现象,这种情况
#include <stdio.h> int add_range(int low, int high) { int i, sum; for (i = low; i <= high; i++) sum = sum + i; return sum; } int main(void) { int result[100]; result[0] = add_range(1, 10); result[1] = add_range(1, 100); printf("result[0]=%d\nresult[1]=%d\n", result[0], result[1]); return 0;
6.1.1 QEMU运行ARM Linux内核[共3页]
![6.1.1 QEMU运行ARM Linux内核[共3页]](https://img.taocdn.com/s3/m/59599ac6f18583d048645940.png)
第6章内核调试本章主要介绍一些内核调试的工具和技巧,以及内核开发者常用的调试工具,例如ftrace和systemtap等。
对于编写内核代码和驱动的读者来说,内存检测和死锁检测是不可避免的,特别是做产品开发,产品最终发布时要保证不能有越界访问等内存问题。
本章的最后会介绍一些内核调试的小技巧。
本章介绍的调试工具和方法大部分都在Ubuntu 16.04 + QEMU + ARM Vexpress平台上实验过。
6.1 QEMU调试Linux内核为了加速开发过程,ARM公司提供了Versatile Express开发平台,客户可以基于Versatile Express平台进行产品原型开发。
作为个人学习者,没有必要去购买Versatile Express 开发平台或其他ARM开发板,完全可以通过QEMU来模拟开发平台,同样可以达到学习的效果。
6.1.1 QEMU运行ARM Linux内核1.准备工具首先在Untuntu 16.04中安装如下工具。
$ sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build- essential下载如下代码包。
linux-4.0内核:https:///pub/linux/kernel/v4.x/linux-4.0.tar.gz。
busybox工具包:https:///downloads/busybox-1.24.0.tar.bz2。
2.编译最小文件系统首先利用busybox手工编译一个最小文件系统。
$ cd busybox$ export ARCH=arm$ export CROSS_COMPILE= arm-linux-gnueabi-$ make menuconfig进入menuconfig之后,配置成静态编译。
Busybox Settings --->Build Options --->[*] Build BusyBox as a static binary (no shared libs)。
Linux内核漏洞调试环境搭建

Linux内核漏洞调试环境搭建一.前言之前没怎么用过Linux,但是那天看到exploit-db上有不少Linux内核漏洞的POC。
当时想如果可以请自动手调试一下这些漏洞,肯定会学到一些Linux下特定漏洞的利用技巧。
(比如怎么利用空指针引用漏洞来进行本地提权)。
所以就GOOGLE了很多关于Linux内核调试的文章,虽然一步一步老老实实照前人的指点的做,但是还是问题连着问题。
反反复复的尝试,才历尽千心万苦搭建起了这个内核漏洞调试环境。
在此过程中得到了广大网友的帮助,特别是wzt85和塞(他的ID为塞)这两位前辈的指点。
既然取之于“网”,那我觉得应该把这个过程用文字描述出来放到网络上,与同道中人分享。
本文的第二部分将简单介绍目前Linux下内核调试的几种常用调试技术路线,由于我对Linux的了解确实不多,所以这一部分写的肯定会很不专业,但目的在于抛砖引玉——更专业的文章烦请自行GOOGLE。
本文的第三部分会详细介绍该调试环境的搭建过程,关键点会有截图说明。
本文的第四部分是一点补充性的文字。
二.Linux下内核调试技术路线1.QEMU+GDBQEMU是一款开源的虚拟机软件,它自身带有gdb stub可用于和Host 主机上的GDB通信来对Guest主机的Linux内核进行源码(C代码)级调试。
为实现源码级调试,那必须要有调试信息以及符号表,所以首先从上下载一份Linux内核源代码进行编译。
编译成功后会得到bzImage文件和vmlinux文件。
其中vmlinux就是要供Host主机上的GDB进行调试的带有调试信息,符号表的内核文件。
使用这种方法试验环境的搭建比较简单,而且最吸引人的地方在于它能够实现源码级的调试。
但是遗憾的是,这种方法调试不了漏洞。
因为当Guest主机上的内核发生内存访问异常的时候,Host主机中的GDB根本得不到异常事件,这样一来也就无法获知是那条指令引发的异常,以及被访问的内存地址是什么。
Linux内核调试

0x00 前言这段时间开始学习了linux内核提权,也跟进看了一些漏洞。
但是由于linux系统版本、内核版本的不同,驱动模块或者是某个函数的加载地址都是不同的,如果不能自己亲自调试内核,就算给了exp也是无法利用。
之前也没有怎么接触过内核调试,所以这几天找了许多资料开始学习调试内核的方法,总结整理在这。
本文测试系统是Ubuntu12.04 64位。
0x01 准备环境首先当然是准备需要调试的内核版本,linux的所有历史版本都可以在这里找到。
down下来后进入源码树根目录,开始配置内核,这里使用基于ncurse库编制的图形界面工具:$ make menuconfig由于我们需要使用kgdb调试内核,注意下面这几项一定要配置好:KernelHacking -->选中Compile the kernel with debug info选中Compile the kernel with frame pointers选中KGDB:kernel debugging with remote gdb,其下的全部都选中。
Processor type and features-->去掉Paravirtualized guest supportKernelHacking-->去掉Writeprotect kernel read-only data structures(否则不能用软件断点)保存config文件之后make、make modules_install、make install编译安装就好。
具体安装编译内核可以看我另一篇笔记0x02 使用kvm、gdb调试内核先介绍一下现在用得比较多的调试内核方法吧,简单地说就是在linux系统里再装一个kvm虚拟机配置好gdb远程调试支持,然后在linux主机上连接调试。
但是我因为电脑配置不高,装了kvm太卡就放弃了这个方法orz总之还是讲一下怎么调试吧。
使用QEMU+GDB调试Linux内核

使用QEMU调试Linux内核一.使用QEMU安装Ubuntu10.041.安装qemuubuntu下使用sudo apt-get install 安装的qemu版本是0.12.3,该版本中存在bug,使得无法在断点处停下;因此需要在qemu官方网站/Download上下载最新的版本qemu-0.12.5.tar.gz的源代码包自己进行编译安装:●Sudo apt-get install zlib1g-dev libsdl-dev●解压源代码后,进入源代码所在目录执行./confingure●执行make●执行sudo make install2.创建QEMU格式的硬盘qemu-img create –f qcow2name.img size例如:qemu-img create –f qcow2 ubuntu10.04.img 4GB3.在创建的硬盘上安装操作系统qemu–hdaname.img–cdrom ~/Download/ubuntu10.04.iso –boot d 说明:使用hda指定硬盘镜像,使用CDROM选定光驱。
-boot d 指从cdrom启动,-boot a是软盘,-boot c 是硬盘;使用qemu或qemu-system-x86_64(64为机子),有时安装系统会很慢,这是可以考虑使用kvm来代替。
例如:kvm–hda ubuntu10.04.img –cdrom ./ubuntu-10.04.iso -bootd4.从已经装好操作系统的硬盘启动qemu–hda ubuntu10.04.img5.在64位的主机上要使用qemu-system-x86_64命令来代替qemu 二.自己编译内核现将Linux的编译调节过程简述为:1. 下载自己要调试的Linux内核的源代码,这个可以从Linux内核的官方网站上得到:2. 编译内核最主要的便是配置文件.config,为了能够准确的得到结果(第一次不要求编译时间),将本机的config文件直接拷贝到解压后的源代码中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用QEMU调试Linux内核
一.使用QEMU安装Ubuntu10.04
1.安装qemu
ubuntu下使用sudo apt-get install 安装的qemu版本是0.12.3,该版本中存在bug,使得无法在断点处停下;因此需要在qemu官方网站/Download上下载最新的版本qemu-0.12.5.tar.gz的源代码包自己进行编译安装:
●Sudo apt-get install zlib1g-dev libsdl-dev
●解压源代码后,进入源代码所在目录执行./confingure
●执行make
●执行sudo make install
2.创建QEMU格式的硬盘
qemu-img create –f qcow2name.img size
例如:qemu-img create –f qcow2 ubuntu10.04.img 4GB
3.在创建的硬盘上安装操作系统
qemu–hdaname.img–cdrom ~/Download/ubuntu10.04.iso –boot d 说明:使用hda指定硬盘镜像,使用CDROM选定光驱。
-boot d 指从cdrom启动,-boot a是软盘,-boot c 是硬盘;使用qemu或qemu-system-x86_64(64为机子),有时安装系统会很慢,这是可以考虑使用kvm来代替。
例如:kvm–hda ubuntu10.04.img –cdrom ./ubuntu-10.04.iso -boot
d
4.从已经装好操作系统的硬盘启动
qemu–hda ubuntu10.04.img
5.在64位的主机上要使用qemu-system-x86_64命令来代替qemu 二.自己编译内核
现将Linux的编译调节过程简述为:
1. 下载自己要调试的Linux内核的源代码,这个可以从Linux内
核的官方网站上得到:
2. 编译内核最主要的便是配置文件.config,为了能够准确的得到
结果(第一次不要求编译时间),将本机的config文件直接拷
贝到解压后的源代码中。
3.然后进行make操作,结束后将产生的bzImage文件拷到boot
目录下,重启,选择自己编译的内核,这样一般不会出问题,但时间较慢,大约编译一次需要40分钟。
3.1以前编译内核是为调试内核服务的,现在做华为的项目,
发现需要在实际的机器上运行自己编译的内核,参考网站:
/tips/compiling-linux-kernel-26.html
4.为了降低编译时间,就需要对配置文件进行裁剪,在配置文件
中有好多是本机不需要的模块,参考:
/Linux/kernel_options.html。
另外调试内
核与模块无关,所以辨识为M的直接可以不选。
5.剪裁的时候采用“逐步瘦身”法,先剪裁掉某个或某几个模块,
然后在进行编译,若没错,在进行模块裁剪,这样可以最大程
度上保证内核配置的正确性。
6.使用qemu调试需要在编译内核的时候将调试信息添加上,
make menuconfig->kernel hacking->kernel debugging->compile
the kernel with debug info。
三.使用qemu+gdb调试Linux内核
(1)qemu–s –S –hda ./ubuntu10.04.img
–kernel ./arch/x86/boot/bzImage–append root=/dev/sda
-s表示运行虚拟机时将1234端口开启成调试端口;
-S表示“冷冻”虚拟机,等待调试器发出继续运行命令;
-kernel表示要调试的内核镜像;
-append root=/dev/sda表示传递给内核的参数。
(2)在另一个终端上运行gdb命令
gdbvmlinux
target remote localhost:1234
若到此没什么问题,你就可以发挥自己的聪明才智进行内核源代码的调试了。
四.GDB基本命令
1.list
/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_46.html
2.GDB command
/TUTORIALS/GDB-Commands.html。