서론
CTF에서 kernel 관련 문제의 경우 기본적으로 관련 시스템 환경이 구성된 상태로 파일로 제공된다.
물론 해당 파일만으로 어떻게 분석하는지, 어떻게 사용하는지만 알면 "문제를 푸는 것"은 충분히 가능하다고 본다.
하지만, 살짝만 더 들어가서 공부해보자.
시작하기 전에 간단히 설명하자면 os를 구동하기 위한 기본적인 파일들이 필요한데
컴퓨터와 명령어를 주고 받기 위한 kernel 파일
그리고 기본적으로 디렉토리가 어떻게 구성되어있는지, 어떻게 관리하는지 등을 위한 file system으로 구성된다.
kernel build
1. 패키지 설치
커널을 빌드하기 위해서는 여러 패키지들이 필요하다.
대략 아래와 같다.
build-essential
libncurses5
libncurses5-dev
bin86
kernel-package
libssl-dev
bison
flex
libelf-dev
apt-get install 을 통해 설치하면 된다.
2. 소스코드 다운로드
아래 링크에서 다운로드할 수 있다.
The Linux Kernel Archives
www.kernel.org
3. 커널 이미지 빌드
해당 커널 소스를 다운 받아 압축을 풀면 Makefile이 포함되어있으며 이를 통해 커널 이미지를 빌드할 수 있다.
다만, 옵션을 설정해줘야 한다.
4. 커널 옵션 설정.
기본적으로 make defconfig 명령을 통해 커널의 설정을 파일로 생성해준다.
(만일 위의 패키지 설치가 제대로 되지 않았다면 아래와 같이 친절하게 알려준다.)
제대로 설정이 되면 .config 파일로 저장된다.
이후 make menuconfig 명령을 통해 추가적인 옵션을 설정해줄 수 있다.
이 또한 .config 파일에 추가되어 저장된다.
5. 커널 빌드
make -j N 명령을 통해 커널 이미지를 빌드한다.
-j는 사용할 cpu 수를 이야기하며, N에 사용할 숫자를 넣어 빠르게 빌드할 수 있다.
그래도 오래 걸리는건 마찬가지...
만일 빌드 중 에러가 발생하거나 뭔가 결과물이 안나온다? 무조건 패키지 설치가 되지 않은거다.
6. 결과물
빌드가 끝나면 vmlinux와 bzImage 두개의 커널 이미지가 생성된다.
bzImage는 arch/{아키텍쳐}/boot/ 폴더 내에 있으며
vmlinux는 빌드를 수행한 root directory에 생성된다.
bzImage는 instruction set만 가지고 있는 실제 사용될 커널 이미지이고
vmlinux는 디버깅 시 사용할 수 있는 정보들을 다소 담고있는 이미지이다. (그래서 용량이 크다.)
그래서 CTF에서는 vmlinux 파일이 주어질 수도 있고 없을 수도 있다.
file system build
앞선 kernel build에서는 말 그대로 커널만 이미지로 만든 것이다.
우리가 사용하는 리눅스의 root directory를 보면 bin, dev, home 등 많은 폴더들이 있는데, 이를 file system이라고 하며,
이런 폴더들을 별도로 생성해두어야한다.
1. busybox 설치
파일 시스템을 구성하는 방법은 여러가지가 있지만, 아래 경로에서 다운로드 받을 수 있다.
http://www.busybox.net/downloads/
Index of /downloads
busybox.net
다운로드 후 압축을 해제하면 위 커널 빌드와 마찬가지로 Makefile을 포함한 여러 파일들이 나오는데,
간단히 Makefile을 통해 파일 시스템을 빌드할 수 있다.
2. 옵션 설정
이 또한 마찬가지로 make menuconfig 명령어를 통해 옵션을 설정할 수 있다.
기본적으로
settings -> build options -> build static binary 체크
networking utilities -> inetd 체크 해제
만 해주면 된다.
3. 파일 시스템 빌드
빌드된 파일 시스템의 파일들을 담을 폴더를 하나 생성해주고, 아래 명령어로 파일 시스템 빌드를 진행하면 된다.
make CONFIG_PREFIX=폴더명 install
빌드가 완료되고나서 해당 폴더에 들어가면
bin, sbin, usr와 같이 기본 디렉토리만 생성되어있음을 볼 수 있는데,
mkdir 명령어를 통해 dev, etc, lib, proc, tmp, sys 디렉토리를 직접 추가해주어야 한다.
4. init script 작성
커널이 부팅되고 가장 먼저 실행되는 스크립트이며, 이를 통해 부팅 옵션을 지정할 수 있다.
더불어 해당 파일은 755 권한을 부여하여 실행 가능하도록 만들어야한다.
┌[wyv3rn🐲]-(~/kernel/filesystem/busybox/filesystem)
└> cat init
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1</dev/console
exec 2</dev/console
setsid wyv3rn setuidgid 1000 sh
umount /proc
umount /sys
poweroff -d 0 -f
┌[wyv3rn🐲]-(~/kernel/filesystem/busybox/filesystem)
└> chmod 755 init
5. 파일 압축
모든 준비가 끝난 파일 시스템 폴더로 들어가서 qemu를 통해 구동하기 위해 아래 명령어를 통해 파일을 압축해준다.
find . | cpio -o --format=newc > rootfs.cpio
결과물
위 과정을 모두 거치면
bzImage, rootfs.cpio 파일을 얻을 수 있다.
위에서 이야기한 것과 같이 vmlinux 파일은 "추가적으로 얻을 수 있는 파일"이며 반드시 필요한 것은 아니다.
'Kernel Exploit' 카테고리의 다른 글
vmlinux 추출하기 (0) | 2023.08.20 |
---|---|
qemu 및 gdb setting (0) | 2023.08.20 |
Kernel exploit - 모듈 프로그래밍 (0) | 2023.08.06 |
Kernel exploit - 디바이스 드라이버 (0) | 2023.08.06 |
Kernel exploit - 슬랩 할당자 (0) | 2023.08.06 |