Linux kernelをgdbでリモートデバッグするときはKASLRをoffにするのを忘れずに(´・ω・`)

カーネルgdbでリモートデバッグできるようにするかーとか思ってやってたわけです。

しかし、下記のような感じでちょっとハマってました。

  • ブレークポイントが効かなかったり
  • vmlinuxとvmlinuzの組が合ってるのにシンボル名が出なかったり
  • Cannot access memory at address 0xffffffff8124d730とかで落ちたり

f:id:masami256:20180215221450p:plain

原因はKASLRが有効だったため、実行時にアドレスがランダマイズされていたのが原因ですね\(^o^)/

解決策はKASLRをoffにすれば良いだけです。そのためにカーネルの再ビルドは不要で、カーネルコマンドラインでnokaslrを渡せばOKです。

そうすればこのようにいい感じに f:id:masami256:20180215221904p:plain

以下はめも

remote接続にシリアルコンソールを使う場合

qemuはこんな感じになる。

$ qemu-system-x86_64 -kernel vmlinuz -initrd initramfs.img -m 2048 -append "nokaslr console=tty0 kgdboc=ttyS0,115200 kgdbwait" -chardev pty,id=pty -device isa-serial,chardev=pty 

そうすると以下のようなメッセージが出るので、gdbではこのデバイスに対してアクセスする。

qemu-system-x86_64: -chardev pty,id=pty: char device redirected to /dev/pts/2 (label pty)                

gdbからリモートアクセスするとこんな感じに。

gdb-peda$ target remote /dev/pts/2                  
Remote debugging using /dev/pts/2                   
Warning: not running or target is remote            
kgdb_breakpoint () at kernel/debug/debug_core.c:1073                                                     
1073            wmb(); /* Sync point after breakpoint */  

remote接続にTCPを使う場合

この場合は普通に-sオプションを使えばOK。

$ qemu-system-x86_64 -kernel vmlinuz -initrd initramfs.img -m 2048 -append "nokaslr" -s -S 

gdbからアクセスするときもこのように。

masami@saga:~/tmp/test$ gdb ./vmlinux               
Reading symbols from ./vmlinux...done.              
gdb-peda$ dir usr/src/debug/kernel-4.15.fc27/linux-4.15.2-300.fc27.x86_64/                               
Source directories searched: /home/masami/tmp/test/usr/src/debug/kernel-4.15.fc27/linux-4.15.2-300.fc27.x86_64:$cdir:$cwd                                                                                          
gdb-peda$ target remote :1234                       
Remote debugging using :1234                        
Warning: not running or target is remote            
0x000000000000fff0 in cpu_hw_events ()              
gdb-peda$ b __kmalloc                               
Breakpoint 1 at 0xffffffff8124d730: file mm/slub.c, line 3746.                                           
gdb-peda$ c                                         
Continuing.                                         
Warning: not running or target is remote            

Breakpoint 1, __kmalloc (size=size@entry=0xa8, flags=flags@entry=0x14080c0) at mm/slub.c:3746            
3746    {                                           
gdb-peda$                  

低レベルプログラミング

低レベルプログラミング