CIDY
[Linux Kernel] 1. QEMU 본문
QEMU
QEMU는 리눅스 커널을 구동하는 가상 머신이다.
사용자 모드 프로그램, 즉 일반 바이너리를 익스플로잇 할 때는 뭔가 꼬여도 그냥 프로세스를 터트리고 재실행하면 되었다. 하지만 커널 익스플로잇 시 크래쉬가 발생하면 운영체제 전체가 정지되어 버린다. 즉 시스템 자체를 재부팅해야 다시 익스플로잇을 테스트해볼 수 있으므로 매우 번거롭다. 허허
그래서 QEMU가 존재하는 것이다. QEMU는 오픈소스 에뮬레이터로, 이를 이용해 운영체제가 구동되는 가상 환경을 구축할 수 있다. 크래쉬가 발생해도 가상 환경에서 발생하는 것이므로 안전하고, 한 번에 여러 개의 가상 머신을 구동할 수 있으므로 편리하다.
참고로 리눅스 커널 이미지를 일반 바이너리처럼 실행하려고 하면 세폴이 뜬다. 커널 이미지의 베이스 주소가 커널 공간에 위치하기 때문에 기존 커널이 적재를 거부하기 때문이다. (그게 아니어도 커널은 커널 모드에서만 실행할 수 있는 특수(previleged) CPU명령을 사용하기 때문에 사용자 모드에서 정상적 실행이 불가하다.)
UML(User Mode Linux)라는 기능으로 커널을 일반 ELF바이너리로 생성해 실행해볼 수 있지만, UML은 성능이 떨어지고 실제 리눅스 환경과 상당한 차이가 있어 별로이다.
참고로 에뮬레이션과 가상화의 차이는 다음과 같다. 에뮬레이션의 경우 다른 시스템을 흉내내는 것이고, 가상화는 시스템을 여러 서버로 분리하고, 각 가상 서버들이 독립적인 소프트웨어 컨테이너로 동작하며 CPU나 RAM등의 자원에 자체적으로 접근할 수 있도록 하는 것이다.
가상 머신(VM)
가상 머신에는 크게 프로세스 가상 머신과 시스템 가상 머신의 두 종류가 있다.
프로세스 가상 머신 : 하드웨어, 운영체제 추상화를 통해 플랫폼과 상관없이 응용 프로그램이 동작할 수 있는 가상환경을 제공한다. 웹 브라우저의 JavaScript엔진이나 Java프로그램이 구동되는 JVM이 그 예시이다.
시스템 가상 머신 : 실제 컴퓨터 하드웨어를 유사하게 시뮬레이션하여 운영체제 등의 시스템 소프트웨어가 구동될 수 있도록 가상 환경을 제공한다. (VirtualBox, VMWare, Parallels 등)
리눅스의 경우 운영 체제이므로 구동을 위해 시스템 가상 머신이 필요하다. QEMU역시 그 중 하나이다.
QEMU설치
sudo apt install qemu-system-x86
Ubuntu에서는 위 명령어로 설치 가능하다.
이렇게 뜨면 잘 설치된 것이다.
아래는 QEMU옵션이다.
-kernel vmlinuz : 파일 vmlinuz 를 리눅스 커널로 로드하여 부팅한다.
-initrd initramfs : 파일 initramfs 를 초기 램디스크로 로드하여 부팅한다.
-smp 4 : 가상 프로세서(CPU) 4개를 할당한다.
-m 256 : 가상의 메모리(RAM) 256MiB를 할당한다.
-accel kvm : Linux의 Kernel Virtual Machine(KVM) 기능을 사용한다. (-enable-kvm과 동일)
-nographic : GUI 및 가상 머신 화면 출력을 비활성화하고, 가상 시리얼 포트를 대신 사용한다. (커널 테스트 시 유용)
-snapshot : 파일 수정 및 저장 등의 디스크 변경 사항을 본래 디스크 이미지 파일이 아닌 임시 파일에 기록한다.
-loadvm <tag> : <tag> 의 스냅샷으로 가상 머신의 상태를 되돌린다.
QEMU 게스트 디버깅
qemu에서는 gdb와 같은 디버거를 이용해 가상 머신을 디버깅할 수 있는 기능을 제공한다.
-S : 게스트가 일시 중지된 상태로 부팅된다.
-gdb dev : dev를 통해 gdb디버거와 통신한다. (ex : -gdb tcp:127.0.0.1:12345 로컬호스트 tcp포트 12345에서 디버거 연결 대기)
QEMU 모니터
Ctrl-A + C로 qemu모니터에 접근할 수 있다. 이를 통해 가상 머신에 여러 명령을 내릴 수 있다.
Ctrl-A + H : Ctrl-A 키 조합 관련 도움말
Ctrl-A + X : QEMU종료 (가상 머신 구동중일 경우 강제 종료)
Ctrl-A + S : -snapshot옵션으로 임시 파일에 저장하고 있던 변경 사항을 디스크 이미지 한 번에 저장
다음은 QEMU모니터에서 사용할 수 있는 명령어들이다.
help [cmd] | QEMU 모니터 명령 사용법을 표시한다. (인자가 주어지면 그 명령어의 사용법을 표시한다.) |
commit | -snapshot 옵션으로 인해 임시 파일에 저장하고 있던 변경 사항을 디스크 이미지에 한 번에 저장한다. |
info snapshots | 스냅샷 목록 조회 |
savevm [tag] | 현재 가상 머신 상태를 <tag>이름의 스냅샷으로 저장. <tag> 가 생략된 경우 이름은 현재 날짜 및 시각을 바탕으로 알아서 생성함. |
loadvm <tag> | <tag> 스냅샷으로 가상 머신 상태를 되돌림 |
delvm <tag> | <tag> 스냅샷 영구 삭제 |
이미지 부팅
가상 머신 이미지 예시이다. bzImage는 커널 이미지, disk.qcow2는 커널이 사용하는 가상 디스크, initramfs는 부팅시 사용되는 파일 시스템, run.sh는 자주 봤겠지만 부팅 스크립트이고, testmod는 테스트 커널 모듈, vm-shared는 가상머신 공유 디렉토리이다.
run.sh를 실행하면 가상 머신이 부팅된다.
REF.
'Hack > Kernel' 카테고리의 다른 글
[Linux Kernel] 4. prepare & commit (1) | 2023.07.25 |
---|---|
[Linux Kernel] 3. KASLR (0) | 2023.07.25 |
[Linux Kernel] 2. Kernel Debugging (0) | 2023.07.25 |
[Linux Kernel] 0. Linux Kernel Exploit🐧 (0) | 2023.07.25 |
[Linux Kernel] Kernel Debugging Environment setup (0) | 2023.07.24 |