결론부터 적자면 vmware를 사용한 방법은 실패했습니다.
qemu를 사용한 디버깅 방법을 추천드립니다.
VMware를 이용한 리눅스 커널 디버깅 방법에 대해 알아보자.
분석의 편의성을 위해 Debug Symbol를 설치한다.
다음과 같이 저장소 정보를 "/etc/apt/sources.list.d/ddebs.list" 파일에 저장한다.
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list
Ubuntu 서버에서 Debug Symbol 아카이브 서명 키를 가져온다.
(Ubuntu 18.04 LTS 버전 이상의 경우)
sudo apt install ubuntu-dbgsym-keyring
18.04 이전 버전은 다음 글을 참고
https://wiki.ubuntu.com/Debug%20Symbol%20Packages
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622
해당 시스템의 커널 버전에 맞는 Debug packages를 설치한다.
(18.10으로 계속 해보려 했는데 디버깅 심볼을 LTS 버전 말고는 지원 안해주는 것 같아서 18.04로 바꿨다..)
sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym
설치된 Debug Symbol 파일을 다음과 같은 경로에 위치한다.
/usr/lib/debug/boot/vmlinux-$(uname -r)
다음과 같이 "/etc/default/grub"에서
"GRUB_CMDLINE_LINUX_DEFAULT" 필드에 "nokaslr"을 추가하여
KASLR을 비활성화 한다.
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet nokaslr"
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US"
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
변경된 부팅설정을 반영한다.
sudo update-grub
VMware를 이용하여 커널을 디버깅하기 위해
디버깅 대상 VMware의 *.vmx 파일을 열어 다음과 같은 설정을 추가한다.
(디버깅 대상 시스템 환경(32bit, 64bit)에 맞게 해당 내용을 추가)
x86
debugStub.listen.guest32 = "TRUE"
debugStub.listen.guest32.remote = "TRUE"
debugStub.hideBreakpoints = "FALSE"
monitor.debugOnStartGuest32 = "TRUE"
x64
debugStub.listen.guest64 = "TRUE"
debugStub.listen.guest64.remote = "TRUE"
debugStub.hideBreakpoints = "FALSE"
monitor.debugOnStartGuest64 = "TRUE"
디버깅 설정이 저장된 VMware를 기동하면 다음과 같은 화면에서 대기하게 된다.
해당 상태에서 다른 VM에서 Root 권한으로 GDB를 실행시켜 해당 VM에 연결한다.
gdb를 연결하기 전에 반드시 해당 시스템의 architecture를 설정해야 한다.
디버거가 정상적으로 연결되면 디버깅 할 VMware는 정지되며,
gdb에서 "continue" 명령을 입력하면 운영체제가 정상적으로 부팅된다.
gdb연결 시 사용되는 Port는 다음과 같다.
32bit : 8832, 64bit : 8864
root@ubuntu:/home/lazenca0x0# gdb -q /usr/lib/debug/boot/vmlinux-4.18.0-12-generic
Reading symbols from /usr/lib/debug/boot/vmlinux-4.18.0-12-generic...done.
(gdb) set disassembly-flavor intel
(gdb) set architecture i386:x86-64:intel
The target architecture is assumed to be i386:x86-64:intel
(gdb) target remote 192.168.2.44:8864
Remote debugging using 192.168.2.44:8864
0x0000000001000200 in ?? ()
(gdb) c
Continuing.
(근데 연결이 안 된다.. 다른 방법을 알아보자..)
다른 방법으로 VMware의 debugStub Serial Port를 이용하는 방법이 있다.
다음과 같이 각 VMware의 *.vmx 파일에 설정을 추가한다.
Server(Debug)
serial0.present = "TRUE"
serial0.fileType = "pipe"
serial0.fileName = "/private/tmp/com1"
serial0.tryNoRxLoss = "FALSE"
serial0.pipe.endPoint = "server"
Client(gdb)
serial0.present = "TRUE"
serial0.fileType = "pipe"
serial0.fileName = "/private/tmp/com1"
serial0.tryNoRxLoss = "FALSE"
serial0.pipe.endPoint = "client"
그리고 다음과 같이 "/etc/default/grub"를 열고
"GRUB_CMDLINE_LINUX_DEFAULT" 필드에 "kgdbwait kgdboc=ttyS0,115200"을 추가한다.
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet nokaslr"
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US"
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
변경된 부팅설정을 반영한다.
sudo update-grub
다음과 같이 IP, Port가 아닌 Serial Port로 연결을 진행한다.
(gdb) target remote /dev/ttyS0
https://www.lazenca.net/display/TEC/02.Debugging+kernel+and+modules
'background > linux kernel' 카테고리의 다른 글
[Linux Kernel Exploit] ret2usr (0) | 2024.04.04 |
---|---|
Kernel Address Space Layout Randomization (KASLR) (0) | 2024.04.03 |
Linux Kernel Debugging (with QEMU) (0) | 2024.04.02 |
[Lazenca][Development of Kernel Module] 04.Creating a kernel module to privilege escalation (0) | 2024.03.29 |
[Lazenca][Development of Kernel Module] 03.ioctl(Input/Output control) (0) | 2024.03.28 |