커널 해킹 초심자를 위한 KernelTool
안녕하세요. 오랜만에 블로그 글로 돌아온 keyme입니다~!
최근에 워게임/CTF 푸는 빈도가 많이 줄긴 했지만.. 그래도 kernel exploit 관련해서 관심이 생겨서 개인적으로 시간을 투자해서 공부했었는데요. 저처럼 커널 익스에 관심이 있거나 이제 막 시작하시는 분들을 위한 툴을 소개하고자 합니다.
KernelTool이라는 프로그램인데요. 커널 익스 관련 문제를 풀다보면 환경 구축 과정에서 귀찮음이 많이 따릅니다.
- 주어진 파일 시스템 추출/병합
- gdb로 심볼과 함께 attach하여 분석
- vmlinux가 없는 경우 bzImage를 통해 vmlinux(심볼 없는)를 획득
- 등등..
https://github.com/kmm2003/KernelTool
GitHub - kmm2003/KernelTool
Contribute to kmm2003/KernelTool development by creating an account on GitHub.
github.com
이 과정들이 저는 개인적으로 굉장히 번거롭고 귀찮아서.. 하나의 툴로 제작해봤습니다. 저처럼 불편하신 분들은 사용해보시면 좋을 것 같네요!
- 참고) 제작한 툴을 쓰다보니 압축 파일 시스템의 파일명이 rootfs인 경우에는 프로그램 사용 과정에서 좀 꼬이더라고요. 압축 파일명과 압축 해제 후 폴더명이 겹처서 그런 것 같네요. 따라서 문제에서 제공받은 압축 파일이 rootfs라면 다른 이름으로 바꿔서 툴을 사용하시면 좋을 것 같습니다.
└─# ./KernelTool
Usage: ./KernelTool <option> [file_name] [address]
Options:
-ext <file_name> Extracts the specified compressed file into the rootfs directory.
-ext -vmlinux Extracts bzImage to vmlinux using the extract-vmlinux script.
-mer -cpio <file_name> Compiles exp.c, adds it to rootfs, and creates a rootfs.cpio archive.
-mer -cpio -gz <file_name> Compiles exp.c, adds it to rootfs, and creates a compressed rootfs.cpio.gz archive.
-gdb <symbol_file> <address> Configures GDB for kernel debugging, sets up remote debugging on localhost:1234, and adds a symbol file with the specified load address.
Examples:
./KernelTool -ext rootfs.cpio.gz
./KernelTool -ext -vmlinux
./KernelTool -mer -cpio rootfs.cpio
./KernelTool -mer -cpio -gz rootfs.cpio.gz
./KernelTool -gdb vmlinux 0xffffffffc0000000
다운 받은 KernelTool을 실행하면 위와 같이 사용법을 확인할 수 있습니다.
다음은 툴을 사용하는 간단한 예시입니다.
curl https://raw.githubusercontent.com/kmm2003/KernelTool/refs/heads/main/KernelTool -o KernelTool && chmod +x KernelTool
일단 위와 같이 KernelTool을 다운로드 받습니다.
└─# ls
bzImage flag rootfs.cpio.gz run.sh
만약, 문제 파일이 위와 같이 주어졌다고 가정해봅시다. 먼저 rootfs.cpio.gz의 파일 시스템을 추출해서 분석하는 작업을 하겠죠?
└─# ./KernelTool -ext rootfs.cpio.gz
9595 blocks
└─# ls -al
total 10108
drwxr-xr-x 3 root root 4096 Jan 12 02:39 .
drwx------ 27 root root 4096 Jan 12 02:34 ..
-rwxr-xr-x 1 root root 5410384 Apr 25 2024 bzImage
-rwxr-xr-x 1 root root 10 Apr 25 2024 flag
-rwxr-xr-x 1 root root 2293 Jan 12 02:36 KernelTool
drwxr-xr-x 17 root root 4096 Jan 12 02:39 rootfs
-rwxr-xr-x 1 root root 4912640 Apr 25 2024 rootfs.cpio.gz
-rwxr-xr-x 1 root root 401 Apr 25 2024 run.sh
└─# cd rootfs
└─# ls
bin etc lib linuxrc mnt proc run sys usr
dev init lib64 media opt root sbin tmp var
./KernelTool -ext rootfs.cpio.gz
명령으로 간단하게 rootfs 파일 시스템을 추출할 수 있습니다.
다음은 파일 시스템을 병합해서 압축 파일로 만드는 방법입니다.
└─# ls
bzImage exp.c flag KernelTool rootfs rootfs.cpio.gz run.sh
본인이 작성한 exp.c를 exp로 컴파일하고 바이너리를 파일 시스템에 포함하고 싶은 경우에 사용하게 될 기능인데요.
└─# ./KernelTool -mer -cpio -gz rootfs.cpio.gz
.
./proc
./init
./opt
./tmp
./mnt
./exp
...
./etc/issue
./etc/profile.d
./etc/profile.d/umask.sh
11049 blocks
./KernelTool -mer -cpio -gz rootfs.cpio.gz
와 같이 명령을 사용하면 exp.c를 exp로 컴파일하고 파일 시스템에 삽입해서 병합하는 작업을 모두 수행해줍니다.
- 원본 압축 파일 시스템의 타입에 따라
-cpio -gz
또는-cpio
중에 옵션을 사용하시면 될 것 같네요.
그 외에 vmlinux를 이용한 gdb attach나 bzImage에서 vmlinux 추출하는 옵션 등도 존재하니 github이나 help 창을 참고해서 사용하시면 될 것 같네요.
다들 즐거운 kernel pwn 되세요~
