check 3d gpu
바로가기
메뉴로 이동
본문으로 이동

[이준형의 메모리 포렌식②] 나만의 Volatility Plugin 개발

“메모리 포렌식, 현재도 미래에서도 분명 중요한 분야로 인식될 것”

길민권 mkgil@dailysecu.com 2013년 08월 27일 화요일
이전 글에서는 Volatility Plugin 개발을 위한 시작 단계를 알아보았다. 이번 글에서는 시작 단계 다음인 기능 구현 단계부터 수행 된 기능의 결과물 출력, 조금 더 성능이 좋고 Volatility에서 지원하는 여러 가지 플러그인들의 활용 방안을 살펴볼 예정이다.
 
4. 나만의 기능 만들기
이번에는 calculate 함수에 대해서 살펴보자. 플러그인에서 실질적인 기능을 하는 함수이다. 해당 함수에서는 대부분 필수적으로 다음과 같은 소스코드가 들어간다.
 
메모리 이미지를 분석하기 위해서는 필히 메모리 이미지의 가상 주소 영역 또는 물리 주소 영역을 불러와야 한다. 이때 필요한 플러그인이 utils 라는 플러그인이며, utils 플러그인 내에 load_as(load address space) 함수를 호출 해 주소 영역을 불러 올 수 있다. load_as 함수는 위 소스코드와 같이 주소 영역을 불러왔을 경우 가상 주소 영역의 base 주소를 리턴하고, 다음과 같이 호출하게 될 경우 물리 주소 영역의 base 주소를 리턴한다.
 
이번에는 조금 더 나아가 주소 영역에 존재하는 프로세스들을 한번 출력시켜 보도록 하겠다. Volatility에는 프로세스 목록을 출력 해 주는 플러그인으로 pslist, psscan, pstree, psxview 플러그인이 존재하는데 간단하게 pslist로 현재 메모리 이미지에 어떤 프로세스들이 있는지 알아보도록 하자. 아래는 전체 소스코드이다.

 
pslist 함수를 사용하기 위해 tasks 플러그인을 import 하고 pslist 함수의 인자 값으로 가상 주소 영역의 base 주소 영역을 전달하였다. pslist는 각 프로세스의 EPROCESS 주소를 리턴하기 때문에 출력 할 때 자신이 원하는 EPROCESS 구조체의 멤버 값들을 지정 하면 된다. 위 소스코드에서 프로세스 ID와 프로세스의 이미지 이름을 지정하여 출력 하였다. 다음은 출력 결과이다.
 

<그림4. 플러그인 출력 결과물>
 
이번에는 조금 더 응용하여 옵션을 한번 적용해 보도록 하자. Calculate 함수 내부의 for문 내에 다음 소스코드를 작성하면 옵션으로 지정한 프로세스 이미지에 해당하는 프로세스만 결과물로 출력이 된다.
 
 
위 구문은 사용자가 –name 옵션 또는 –n 옵션으로 지정한 프로세스 이름을 현재 pslist 함수의 리턴 값 EPROCESS의 ImageFileName 멤버의 값과 비교하는 구문이다.
결과는 다음과 같다.
 
 
하지만 print 함수를 사용해서 플러그인의 결과물의 출력이 보기에 조금 불편한 감이 없지 않아 있다. 이럴 땐 다음에 살펴볼 render_text 함수를 통해 출력 결과물을 다듬으면 된다.
 
5. 나만의 결과를 나만의 방식으로 출력하기
이번에는 render_text를 알아볼 차례이다. render_text의 인자 구성은 (self, outfd, data) 형태로 되어 있는데 outfd는 출력 포맷을 핸들링 할 때 사용되는 인자이고, data는 calculate 함수에서 리턴된 값의 인자이다. Calculate 함수에서 값을 리턴 할 때는 generator 타입으로 리턴하기 때문에 render_text내에서 한번의 for문이 필수적으로 사용된다.
 
Outfd 인자를 사용해서 출력을 핸들링 할 때는 가급적 format 메소드를 사용하라고 Volatility는 권하고 있다. 간단하게 지금까지의 예제를 render_text를 이용 해 출력 해보도록 하겠다. Calculate 함수를 아래와 같이 수정 하고 다음의 render_text 함수 소스코드를 추가하여 보자.
 
 
[그림 4]와 같은 출력을 하도록 outfd 인자를 설정하였다. 결과는 다음과 같다.
 

<그림6. outfd를 이용한 결과 출력>
 
하지만 아직까지 뭔가 조금은 부족하다. 기존의 플러그인들처럼 출력하고 싶다면 table을 이용하면 된다. render_text 함수의 self 인자 내부에 메소드들을 보면 table_header와 table_row가 존재한다. table_header는 출력의 상단을 정의하는 메소드이고, table_row는 출력의 상단 아래 부분을 정의하는 메소드이다. 해당 메소드에는 outfd 인자가 반드시 전달되야 하므로 가급적이면 render_text 함수내에서 사용하는 것이 좋다. 다음은 table을 이용하여 출력하기 위해 render_text 함수를 수정한 소스코드이다.
 
 
위 소스코드로 render_text 함수를 수정 한 후 플러그인을 실행 하여 보면 다음과 같이 기존의 플러그인들 처럼 정렬된 결과를 볼 수 있다.
 
 
출력은 render_text 함수 뿐만이 아니라 [기본 구조]에서도 설명 했듯이 render_csv, render_html, render_xml, render_json 함수도 존재해 다양한 형태로 출력이 가능하다. 각 함수들의 사용방법과 인자 구조는 render_text와 동일하다. 다만 render_text는 기본적으로 출력되는 함수여서 플러그인 실행 시 추가적인 옵션이 필요 없지만, 다른 함수들은 –output 옵션을 지정해 주어야 해당 함수가 실행 된다. 아래는 render_csv 함수의 예이다.
 


<그림 8. render_csv 출력>
 
6. Plugin 개발 레퍼런스
기본적인 Volatility Plugin의 구조를 알아보았다. 하지만, 이것들을 안다고 Plugin 개발을 할 수 있을까? 간단한 것들은 할 수 있겠지만, 조금의 연산이 필요하다거나 Volatility의 다른 Plugin들이 필요하다고 했을 때는 쉽사리 Plugin 개발을 끝 마치지 못할 것이다. Volatility는 공식적으로 Plugin들의 맵 또는 레퍼런스를 제공하지 않는다. 아무래도 오픈소스라는 성격 때문인 것 같다. 하지만 이것은 개발 업체의 입장일 뿐, 사용자 입장에서는 수 많은 Plugin들을 모두 소스코드 분석해 가며 어떤 Plugin의 함수가 어떤 기능을 어떻게 동작하는지 파악하기란 힘든 일임이 분명하다. 그래서 어떤 사용자들이 고맙게도 Volatility의 Plugin Man Page를 작성하여 공개 해 두었다. 현재 필자가 알고 있는 Man Page는 다음 두 페이지이다.
 
-jamaal-re-tools.googlecode.com/git/voldocs/volatility.html
-fossies.org/dox/volatility-2.2/index.html
 
 
첫 번째 페이지와 두 번째 페이지를 비교 했을 때 확실히 두 번째 페이지가 정리가 잘 되어 있다. 하지만 두 번째 페이지에 없는 정보가 첫 번째 페이지에 있어 각각 번갈아가며 사용하면 사용 효과가 극대화 된다.
 
각 페이지에는 클래스와 함수, Plugin 소스코드가 모두 있어 쉽고 간편하게 정보를 획득 할 수 있다. 특히 두 번째 페이지는 검색 기능을 제공 해 더 빠르게 원하는 정보를 찾을 수 있다.
 
◇부록
혹여나 지금까지의 설명이 조금은 어렵게 다가왔을 수도 있다. 이런 경우를 생각 해 지금까지 각 Plugin의 부분을 살펴보며 실습 했던 소스코드의 전체 코드를 다음과 같이 첨부한다. 다음은 지금까지 작성했던 myplugin의 전체 소스코드이다.
 
 
다음은 필자가 응용 버전으로 작성 해 본 proccmd 라는 Plugin이다. 기능은 Volatility에 지원하는pslist Plugin 기능을 이용 해 EPROCESS의 오브젝트 주소를 리턴 받아 EPROCESS 내부에 존재하는 CommandLine 값을 추출하는 기능이다. Myplugin의 소스코드를 조금만 응용하면 다음과 같은 Plugin도 제작이 가능하다. 필자의 다른 Plugin도 보고 싶다면 필자의 블로그(maj3sty.tistory.com)를 방문 해 주기 바란다.
 
 
◇맺음말
지금까지 Volatility Plugin 개발을 위한 기본적인 사항들을 알아보았다. 하지만 Volatility 도구는 몇 년에 걸쳐 지속적인 Plugin 업데이트와 메모리 포렌식 연구로 인해 업데이트 되어 왔고, 앞으로도 업데이트가 될 것이다. 이런 업데이트에 맞추어 자신도 메모리 포렌식 연구와 Plugin 개발을 해보면 어떨까? 개인적인 생각으로는 굉장한 공부가 될 것이라 생각 된다. 이전부터 메모리 포렌식은 중요한 분야로 인식되어 왔고 현재, 미래에서도 분명 중요한 분야로 인식되고 계속해서 미지의 영역을 연구하고 결과물들이 나올 것이다. 우리도 이런 흐름에 맞추어 흘러가야 하지 않을까.
 
<About 이준형 연구원>
현재 건양대학교 3학년으로 재학 중이며, 저서로는 ‘디지털 포렌식의 세계’가 있다. 모의해킹 프리랜서 활동과 동시에 보안 블로그(maj3sty.tistory.com)를 운영하면서, 여러 보안 분야를 연구하는 ‘보안 프로젝트’ 커뮤니티, 디지털 포렌식 연구를 위한 ‘For_MD Team’, 버그 헌팅 전문 그룹인 ‘Bug Bounty Club’에서 활동하고 있다.
 
글. 이준형 보안프로젝트 연구원 saiwnsgud@naver.com
 
<저작권자 © 데일리시큐, 무단 전재 및 재배포 금지>
관련기사
목록