方法是用的张银奎老师在微博上发的直接安装符号文件的方式,无需编译内核,很方便。
搜索含有dbgsym的内核版本
apt-cache search linux-image | grep dbgsym | grep 4.11
搜索特定source code的内核版本
apt-cache search linux-source
然后选择一个
搜索要下载的linux内核版本
apt-cache search linux-image | grep linux-image | grep generic
安装内核
sudo apt-get install linux-image-4.10.0-19-generic
查看安装的内核版本
sudo dpkg --list | grep linux-image
重启,在grub之前,按住shift,选择我们的内核


验证新内核启用
uname -sr
在终端输入下面的代码
添加访问符号服务器的密钥文件:
wget -O - c33K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8V1k6h3u0K6i4K6u0W2N6h3u0#2L8Y4c8#2i4K6u0W2j5$3!0E0i4K6u0r3k6r3u0Y4M7%4W2E0i4K6u0V1M7X3g2D9k6h3q4K6k6g2)9J5k6r3E0W2P5g2)9J5k6h3q4K6j5H3`.`. | sudo apt-key add -
执行sudo apt-get update
更新
执行如下命令开始下载符号包:
打开/etc/apt/sources.list,启用deb-src,sudo apt-get update更新
下载好的源码会被放在/usr/src目录下。


解压缩得到源码
sudo tar -xvf linux-source-4.10.0.tar.bz2
一切都安装好了之后,就可以拷贝一份我们的虚拟机,一个作为host,一个作为target
打印机会占用我们的串口


需要让target在开机时候进入kgdb的调试状态,首先需要修改grub文件,增加grub引导时候的菜单项。
sudo vim /etc/grub.d/40_custom
修改的内容从/boot/grub/grub.cfg里复制,复制一个菜单项(menuentry)过来,再把菜单名中增加调试信息,然后在内核命令行中增加KGDB选项,即下面这样:
新增部分:kgdbwait kgdb8250=io,03f8,ttyS0,115200,4 kgdboc=ttyS0,115200 kgdbcon nokaslr
修改grub的配置后,需要执行sudo update-grub来更新。更新后目标机器就准备好了。
重启按住shift,进入刚才添加的menu即可进入到被调试状态。
设置串口通信的波特率
sudo stty -F /dev/ttyS0 115200
要查看是否设置成功
sudo stty -F /dev/ttyS0
注意这个每次host重启都要再输入一遍,嗯,写个shell吧。
编写config,用source加载(直接在gdb里输入也可)
使用gdb来调试带符号的vmlinux
符号加载完成,bt查看当前栈帧,c运行内核。



可以看到,list本来应该显示具体的源码,但是这里只是打印出了它所在的文件,这是因为在这个路径下没有源码。
所以说我们就建立这个路径,然后把源码放进去
然后dir设置好目录
dir /build/linux-hwe-edge-gyUj63/linux-hwe-edge-4.10.0
现在就可以查看源码了。
我从头开始说:
至此,内核调试的整个配置和调试方法都写完了。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2019-2-1 12:12
被kanxue编辑
,原因: