rosieblue
article thumbnail
728x90

개요

사용자 모드 프로그램을 익스플로잇할 때는 익스플로잇이 잘못되어도 해당 프로그램을 재실행하면 되지만, 커널 익스플로잇을 할때에 크래시가 나면 전체 OS가 정지된다. 따라서 커널 익스플로잇에 편한 QEMU라는 가상 머신을 이용할 것이다.

 

Question. 커널을 일반 ELF 바이너리처럼 실행하면 안 되는가?
커널 이미지를 일반 바이너리처럼 실행하면 Segmentation Fault가 발생!
그 이유는 커널 이미지의 베이스 주소가 커널 공간 안에 위치하여 기존 커널이 적재를 거부하기 때문! 

 

바이너리 디버깅과 비교해보자. 바이너리를 디버깅할 때 우리는 gdb를 통해서 디버깅한다. 그리고 breakpoint를 걸어 실행 흐름을 하나하나 분석한다.

그런데 만약 커널을 분석할 때 breakpoint를 걸면 어떻게 될까? 커널자체가 멈추는 것이다. 즉 OS 자체가 멈춰버리는 것이다. 따라서 우리는 디버깅하는 환경과 커널 자체를 구분해야할 필요성이 생긴다. 이 때문에 가상머신 QEMU를 사용하는 것이다.

 

QEMU 실행 화면

 

QMEU 설치

칼리 리눅스에서는 아래 명령어를 사용하면 된다

다른 배포판에서는 Download QEMU - QEMU 링크 확인하면 나와있다

 

설치 후에 화면에 재부팅하라고 뭐라뭐라 하길래 나는 그냥 재부팅 시켜줬다.

설치 후 qemu-system-x86_64 -version 명령어의 결과를 보니 설치가 잘 된 것을 확인할 수 있었다.

 

 

 

QEMU 설정 ⚙️

QEMU에서는 -enable-kvm 이라는 옵션을 사용하여 가상머신의 성능을 향상시킬 수 있다

자세한 사용법은 man qemu-system을 통해 볼 수 있으니 궁금하면 살펴보자.

 

 

이처럼 QEMU에서는 원하는 커널로, 원하는 램디스크으로 부팅할 수 있다!! 그리고 CPU나 RAM들도 할당할 수 있다.

 

QEMU 게스트 디버깅🐛

qemu에서도 gdb와 같이 디버거를 이용하여 가상머신을 디버깅할 수 있다.

crash로 인해 게스트 운영체제가 중지되더라도 디버깅을 실행할 수 있다고 한다.

 

 

 

QEMU 모니터🖥️

QEMU 모니터를 이용하여 가상머신에 여러 명령을 내릴 수 있다.

Ctrl-A+C 조합을 통해 QEMU 모니터에 접근할 수 있다

 

 

이외 단축키 모음 (Ctrl-A는 기본으로 깔고 가는듯)

  • Ctrl-A + H: Ctrl-A의 키 조합과 관련된 도움말을 표시합니다.
  • Ctrl-A + X: QEMU 종료. 가상 머신이 구동중인 경우 강제 종료됨.
  • Ctrl-A + S: -snapshot 옵션으로 인해 임시 파일에 저장하고 있던 변경 사항을 디스크 이미지에 한 번에 저장.

 

실습 이미지 부팅🏃‍♂️

아래 링크를 다운받자.

https://dreamhack-lecture.s3.ap-northeast-2.amazonaws.com/uploads/system-kernel/dist-v2.zip

안에는 이런게 들어있다.

 

- bzImage: 커널 이미지

- disk.qcow2: 커널이 사용하는 가상 디스크

- initramfs: 부팅시 사용되는 파일 시스템

- run.sh: 부팅 스크립트

- testmod: 테스크 커널 모듈

- vm-shared: VM과 공유되는 디렉토리

 

이렇게 모든 설정같은 걸 우리가 설정할 수 있다.

 

아래도 다운받자.

https://dreamhack-lecture.s3.ap-northeast-2.amazonaws.com/uploads/system-kernel/linux-5.4.63-1%2Bdrhlke.tar.xz

얘는 소스코드와 디버깅 심볼이다.

 

아래 명령어를 다 실행하고 잘 되면 부팅이 잘 되는 것이다!

~ $ mkdir dh-lke
~ $ cd dh-lke
~/dh-lke $ unzip ../dist.zip
Archive:  dist.zip
inflating: ...(생략)...
~/dh-lke $ tar -Jxf ../linux-*drhlke.tar.xz
~/dh-lke $ ./run.sh
[    0.000000] Linux version 5.4.0-1.vu-drhvr (luke1337@theori.io) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 5.4.63-1+drhlke (2020-09-05)
[    0.000000] Command line: TERM="xterm-256color" console=ttyS0 mitigations=off nokaslr norandmaps
...(중략)...
Welcome to Debian GNU/Linux 10 (buster)!
...(중략)...
dh-lke login: dreamhack (automatic login)
dreamhack@dh-lke:~$

 

그냥 버추얼 박스 내에서 또 가상 머신을 실행한다고 생각하면 편하다.

다음 포스트에서는 kernel debugging에 대해서 배워보겠다.

 

Reference

https://learn.dreamhack.io/47

 

참고하면 좋을 것 같은 사이트

https://sangjun.xyz/139

profile

rosieblue

@Rosieblue

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!