gdb-qemu:无法在内核函数上放置断点(内核 4.10.0-35)

gdb-qemu:无法在内核函数上放置断点(内核 4.10.0-35)

我正在尝试使用 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 所说的,内核地址空间随机化韩国航空安全远程监视系统需要禁用它以进行调试。

快速解决方案:

选择:

  • 在内核配置中禁用CONFIG_RANDOMIZE_BASE并重建内核。(例如,如果您使用特殊内核.config进行调试,这可能比内核引导线更方便。)

相关内容