- 사용자 모드 프로그램을 익스플로잇 할 때는 익스플로잇이 잘못되어도 해당 프로그램을 재실행 하면 되지만, 커널 익스플로잇의 경우 크래시가 발생하면 운영체제 전체가 정지된다.
- 이 경우 시스템을 재부팅해야지만 익스플로잇을 다시 테스트해 볼 수 있다.
- 따라서 로컬에서 진행하는 것이 아닌 가상머신을 이용하여 운영체제를 구동시키는 환경을 만들어야 한다.
- 가상머신을 사용할 경우 크래시가 발생해도 그 영향이 가상환경 내로 제한되며, 한번에 여러개의 가상 머신을 구동할 수 있기 때문에 익스플로잇을 테스트하기 용이하게 해준다.
그럼 커널을 ELF바이너리 처럼 실행할 수 없는건가?
- 커널 이미지를 일반 바이너리처럼 실행하면 Segmentation Fault가 발생하며, 이는 커널 이미지의 베이스 주소가 커널 공간에 위치하여 기존 커널이 적재를 거부하기 때문이다. 또한 커널은 커널 모드에서만 실행할 수 있는 특수한 CPU명령을 사용하기 때문에, 사용자 모드에서는 정상적으로 실행되지 않는다.
가상 머신이란?
- 가상 머신은 컴퓨팅 환경을 가상화한 것으로 크게 2종류로 나뉜다.
- 프로세스 가상 머신 : 하드웨어 및 운영체제 추상화를 통해 플랫폼과 상관없이 응용 프로그램이 동작할 수 있는 가상의 환경을 제공한다. 웹 브라우저의 JS엔진이나 JAVA프로그램이 구동되는 JVM이 이에 해당한다.
- 시스템 가상 머신 : 실제 컴퓨터 하드웨어를 유사하게 시뮬레이션하여 운영체제 등의 시스템 소프트웨어가 구동될 수 있도록 가상환경을 제공한다. VirtualBox, VMware등이 있다.
- 리눅스는 운영체제이므로 리눅스를 구동하기 위해서 시스템 가상머신을 사용해야 한다.
- 리눅스 커널의 경우 커널 테스팅에 자주 사용되는 QEMU를 사용한다.
QEMU 설치
- QEMU는 오픈 소스 프로젝트로, 윈도우, 맥, 리눅스 등 다양한 운영체제를 지원한다.
- Ubuntu의 경우 아래의 명령어로 설치 가능하다.
sudo apt install qemu-utils qemu-system-x86
- 설치가 완료되면 위와 같이 확인 가능하다.
QEMU 설정
- QEMU 가상머신 설정은 명령어를 통해 이루어진다.
옵션 | 설명 |
-kernel vmlinuz | vmlinuz를 리눅스 커널로 로드하여 부팅 |
-initrd initramfs | initramfs를 초기 램디스크로 로드하여 부팅 |
-smp 4 | 가상 프로세서를 4개 할당 |
-m 256 | 가상 메모리 256Mib 할당 |
-accel kvm | Linux의 Kernel Virtual Machine(KVM)기능을 사용 |
-nographic | GUI 및 가상 머신 화면 출력을 비활성화하고, 가상 시리얼 포트를 대신 사용한다. 커널 테스트 시 유용하다. |
-snapshot | 파일 수정 및 저장 등의 디스크 변경 사항을 본래 디스크 이미지 파일이 아닌 임시 파일에 기록한다. |
-loadvm <tag> | <tag>의 스냅샷으로 가상 머신의 상태를 되돌린다. |
- 위는 자주 사용되는 옵션이다.
QEMU 게스트 디버깅
- QEMU에서는 GDB와 같은 디버거를 활용해 가상 머신을 디버깅할 수 있는 기능을 제공한다.
- QEMU를 활용하면 게스트 운영체제가 크래시로 인해 중지된 이후에도 디버깅을 시도할 수 있다.
옵션 | 설명 |
-s | 게스트가 일시 중지된 상태로 부팅된다. |
-gdb dev | dev를 통해 gdb디버거와 통신한다. -gdb tcp:127.0.0.1:12345 = 로컬호스트의 12345포트에서 gdb 연결 대기 |
QEMU 모니터
- QEMU 모니터를 이용하면 가상 머신에 여러가지 명령을 내릴 수 있다.
- Ctrl-A + C의 키 조합을 통해 접근가능하다.
명령어 | 설명 |
help [cmd] | QEMU 모니터 명령 사용법 표시 |
commit | -snapshot 옵션으로 인해 임시 파일에 저장하고 있던 변경 사항을 디스크 이미지에 한 번에 저장한다. |
info snapshots | 스냅샷 목록을 조회한다. |
savevm [tag] | 현재 가상 머신 상태를 <tag>라는 이름의 스냅샷으로 저장한다. <tag>가 생략된 경우 이름은 현재 날짜 및 시각을 바탕으로 자동 생성 |
loadvm <tag> | <tag> 스냅 샷으로 가상 머신 상태를 되돌린다. |
delvm <tag> | <tag> 스냅 샷을 영구적으로 삭제한다. |
'Pwn > Kernel Security' 카테고리의 다른 글
[Pwn] Dreamhack - 6.Mitigation: KASLR (0) | 2024.01.07 |
---|---|
[Pwn] Dreamhack - 5.Exploit Tech: prepare & commit (1) | 2024.01.07 |
[Pwn] Dreamhack - 4.Background: Tasks (0) | 2024.01.06 |
[Pwn] Dreamhack - 3.Background: Kernel Debugging (0) | 2024.01.06 |
[Pwn] Dreamhack - 1.Introduction: Linux Kernel Exploit (1) | 2024.01.05 |