리눅스 시스템의 메모리 분석을 연구하고 있는데, 아무래도 실제 물리적 장비를 사용하기보다는 가상머신을 활용할 수밖에 없다. 실제로도 최근 클라우드 등의 인프라가 대중화되고 있기 때문에 대다수가 가상머신을 활용하고 있을 것이다. 그런데 어차피 가상머신이라면 굳이 실제 물리적으로 장비에 접근해서 덤프를 추출하는 방법보다는 가상머신 소프트웨어에서 자체적으로 제공하는 덤핑 기능을 활용하는 것이 훨씬 효율적일 것이다. 또한, 작동중인 시스템에서 메모리를 추출하는 행위 그 자체도 이미 메모리를 수정하는 것이므로 잠재적으로 증거를 훼손하는 것이 된다. 때문에 무결성 유지의 측면으로 보더라도, 굳이 시스템 내부에 들어가서 lime 등을 사용해서 메모리를 추출하는 것보다는 가상머신을 구동하는 Hosts 계층에서 내부의 메모리 덤프를 빼오는 것이 더 합리적일 수 있다.


가장 유명한 VMware workstation 의 경우 별다른 작업 없더라도, 가상머신을 일시정지(suspend)하게되면 자동적으로 해당 머신이 위치한 폴더에 vmem파일이 생성된다. 이 파일을 바로 volatility 에서 열어보면 메모리 덤프로 잘 인식이 된다.

그러나 안타깝게도 또 하나의 인기있는(아마 무료여서) Oracle VirtualBox는 이러한 방법이 없어서 직접 약간 귀찮은 작업을 수행해야 한다. 다행히도 관련하여 좋은 방법이 소개되어 있어서 이 부분을 수행해보자.

(원본 출처 : http://wiki.yobi.be/wiki/RAM_analysis)


우선 필자는 macOS 환경에서 VirtualBox 를 설치하였고, 그 내부에 Ubuntu Linux 등 몇가지의 가상머신이 설치되어 있다. 여기에서는 Ubuntu 11.04 를 대상으로 진행해보자. 


먼저 터미널을 열어서 커맨드라인 명령어로 VBox를 관리할 수 있다는 사실을 깨닫자. 보통은 누구도 이렇게 사용하지 않고 마우스 클릭으로 활용하겠지만.. 스크립트를 통한 자동화를 하려면 커맨드라인이 최고다.

VBoxManage 명령어에 list vms 옵션을 주면 아래와 같이 현재 설치된 vm 목록이 표출된다.

여기에서 Ubuntu 11.04 를 선택하겠다.


Vitrual Box 의 도큐먼트를 찾아보면 debugvm 라는 기능이 있다. 사용법은 dumpguestcore --filename <name> 의 형식인데, 이렇게 하면 현재 작동중인 VM의 system dump를 추출하여 Hosts 컴퓨터에 파일로 저장할 수 있다. 이 파일은 standard ELF core format이라고 하는데, 이 포맷에 대한 구체적 설명은 VM core format을 참고하라.


다음과 같이 debugvm 명령어를 사용하여 Ubuntu 11.04의 ELF core를 덤프하자.

덤프된 파일은 해당 가상머신에 할당된 Memory 크기만큼 크다. 따라서 크면 클수록 추출하는데 걸리는 시간이 길게 소요된다. 덤프한 파일은 elf 파일인데, 이것을 해석하기 위해선 readelf라는 도구가 필요하다. 지금은 macOS에서 작업을 하고 있지만, 추후 Volatility 등으로 분석을 할 시스템은 Linux에서 수행을 할 것이므로 해당 elf 파일을 DFIR 같은 포렌식 워크스테이션으로 옮겨오자. (FTP나 USB 등으로 파일 전송)


리눅스 시스템으로 test.elf 파일을 옮겨왔다. readelf 명령어로 해당 파일의 헤더정보를 살펴보자.

출력된 내용을 좀 깔끔하게 정리하면 아래와 같다.

(참고적으로 Virtual Address와 Physical Address가 0000이다. 이는 KASLR이 걸려있지 않아서인데, Ubuntu 16.04 이후부터는 KASLR때문에 값을 Shift해주어야 하는데 이와 관련한 내용은 추후에 포스팅하겠다. 어쨌든 지금은 KASLR을 무시하므로 좀 더 수월하게 해결할 수 있다.)


어쨌든 내용을 해석하자면, test.elf 라는 코어덤프 안에는 메모리 정보가 포함되어 있는데, 그 위치는 Offset(=0x8c5c)부터 시작해서 FileSize(=0xe0000000, 4096MB)만큼이다. 


readelf 대신 objdump를 사용해도 Size와 File Offset정보를 알수 있다.


그래서 궁극적으로 test.elf 에서 시작지점과 끝지점을 명시하여 아래와 같이 test.raw 파일을 추출한다. 중간에 세미콜론으로 구분되어 있는데 그냥 한줄을 통째로 복사해서 맨앞의 size= 와 off= 부분의 숫자만 바꿔주면 된다.


덤프된 파일이 test.raw로 저장되었을 것이다.
이것을 Volatility 를 사용해서 해당 운영체제에 대한 profile 을 지정해주고, 플러그인을 수행해보면 아주 잘 된다. (윈도우 운영체제는 프로파일을 별도로 생성하지 않아도 내장되어 있어서 찾아서 사용하면 됨. ex: --profile=Win7SP1x86  리눅스의 경우 지난번 포스팅 참고. )

CPUU님의 창작활동을 응원하고 싶으세요?