我正在尝试使用 KDB + qemu 调试 Ubuntu 内核。但是,我无法调试它。以下是我收到的错误。有人能帮忙吗?
启动 QEMU:
sudo qemu-system-x86_64 -enable-kvm -s -machine type=pc,accel=kvm -cpu host -nographic -k de -usb -m 2048 -net nic -net user,hostfwd=tcp::3389-:22 ubuntu16.04.qcow2
启动调试器:
sudo gdb ./debian/build/build-generic/vmlinux -iex 'add-auto-load-safe-path .' -ex 'target remote localhost:1234'
设置断点:
gdb-peda$ b printk
Breakpoint 1 at 0xffffffff811ad8f3: file /home/test/ubuntu/linux-hwe-4.10.0/kernel/printk/printk.c, line 1864.
gdb-peda$ c
Continuing.
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0xffffffff811ad8f3
Command aborted.
gdb-peda$ disassemble printk
Dump of assembler code for function printk:
0xffffffff811ad8f3 <+0>: Cannot access memory at address
我在这里做错了什么?
答案1
确保您已禁用韩国航空安全远程监视系统(内核地址空间布局随机化)或使用添加符号文件添加内核符号文件而不是文件,以便您可以手动指定.text、.data 和.bss。
KASLR 通过将各种对象放置在随机而不是固定的地址,使漏洞利用变得更加困难。
禁用 KASLR,将“nokaslr”参数附加到文件GRUB_CMDLINE_LINUX_DEFAULT
中/etc/default/grub
并执行 update-grub。例如
$ grep "GRUB_CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="nokaslr"
$ update-grub && reboot
答案2
正如@vg598 所说,这是关于 KASLR 的,但使用 update-grub 您将更新 grub.cfg 文件中的所有内容,包括 KGDB 选项。
更好的方法是手动修改 /boot/grub/grub.conf,在 KGDB 选项之前或之后添加“nokaslr”标志。
答案3
就像 avg598 所说的,内核地址空间随机化韩国航空安全远程监视系统需要禁用它以进行调试。
快速解决方案:
- 添加
nokaslr
到 Linux 引导线。现代引导加载程序允许直接在引导加载程序菜单中进行临时更改。在短暂的仅在调试会话期间使用这种方式对系统的网络安全更有利。(例如Ubuntu Wiki 中的内核启动参数部分,“临时添加内核启动参数用于测试”)
选择:
- 在内核配置中禁用
CONFIG_RANDOMIZE_BASE
并重建内核。(例如,如果您使用特殊内核.config
进行调试,这可能比内核引导线更方便。)