[Tutorial] Debug kernel Linux trên VMware bằng gdb + qemu

Set up :

NOTE: nếu bạn debug kernel cũ thì các bạn có thể tải bản ubuntu old release hoặc cài kernel, trong bài viết này mình sẽ cài kernel cũ.

  • Máy ảo linux ( ở đây mình dùng Ubuntu 16.04 LTS)
  • kernel ( ở đây mình debug kernel linux 4.4.0-31.50 )

Đầu tiên mình tải source về để compile và install kernel

có 2 cách:

ở bài viết này mình sẽ instal theo cách 2.

sau khi tải source về rồi mình cd vào nơi download ( mặc định là ở /usr/src/ ) ta sẽ thấy file nén. giải nén ra và cd vào thư mục vừa giải nén.

Tiếp theo mình copy file .config của kernel hiện tại vào thư mục kernel vừa giải nén trước khi compile kernel

$ cp /boot/config-$(uname -r) .config

Tiến hành compile:

$ make

trong lúc compile sẽ hiện ra các câu hỏi cho việc cấu hình kernel, các bạn trả lời theo câu hỏi [y/n/?]

sau khi trả lời hết đống câu hỏi đó, bạn có thể cài đặt modules bằng lệnh

$ make modules_install

ok tới đây là mình có thể instal kernel được rồi

$ sudo make install

Note: việc này mất nhiều thời gian, mình làm mất cả buổi để nhìn nó chạy.

Tiếp đến ta update lại cho boot:

sudo update-initramfs -c -k <phiên bản kernel>
ví dụ : sudo update-initramfs -c -k 4.4.13

update lại grub:

sudo update-grub

cuối cùng là restart lại máy ảo.

Tiếp tục cd vào thư mục chứa kernel

ví dụ :  $ cd /usr/src/linux-source-4.4.0

ta sẽ thấy có file vmlinux dùng để debug lúc sau.

ta dùng qemu để tạo connect và dùng gdb để attach vào

$ qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -nographic -s

Note:

-kernel : ta dẫn đường dẫn tới file bzImage để debug

-nographic để disable video settting. cái này tắt đi để tránh bị lỗi. thường là do mình dùng terminal chứ ko dùng giao diện

-s : khởi động gdbserver trên port 1234

NOTE: qemu không nhận lênh ctrl+c nên muốn quit thì nhấn ctrl+a, sau đó nhấn c để vô qemu promt , rồi nhấn q (quit)  là được

ATTACHING GDB TO QEMU

Rồi giờ mình sẽ attach vào:

$ gdb vmlinux

nếu gặp cái này

warning: File "/home/nick/linux/scripts/gdb/vmlinux-gdb.py" 
auto-loading has been declined by your `auto-load safe-path' 
set to "$debugdir:$datadir/auto-load". To enable execution of this file add
add-auto-load-safe-path /path/to/linux/scripts/gdb/vmlinux-gdb.py line to your configuration file "/home/<username>/.gdbinit".

thì dùng lệnh này :

echo "add-auto-load-safe-path `pwd`/scripts/gdb/vmlinux-gdb.py" >> ~/.gdbinit

qemu lắng nghe ở port 1234 ( options -s)  ta dùng lệnh

pwndbg> target remote :1234

tới đây là attach vào được rồi, giờ thì mình debug thôi 😀

Một suy nghĩ 1 thoughts on “[Tutorial] Debug kernel Linux trên VMware bằng gdb + qemu

Bình luận về bài viết này