2024-03-29 08:55 (금)
[이준형의 메모리 포렌식①] 나만의 Volatility Plugin 개발
상태바
[이준형의 메모리 포렌식①] 나만의 Volatility Plugin 개발
  • 길민권
  • 승인 2013.08.20 18:37
이 기사를 공유합니다

Volatility 이용, 자신이 만든 플러그인 사용해 효율적 분석에 도움되길…
디지털 포렌식에서 메모리 분석은 상당히 중요한 부분을 차지한다. 또 요즘은 디지털 포렌식 뿐만이 아닌 침해대응(특히 악성코드 분석)에서도 메모리 분석이 상당부분 중요한 요소로 자리를 차지하고 있다. 이전에 메모리 분석 초창기 시절에는 메모리를 덤프 하여 이미징 한 후 메모리 이미지에 저장되어 있던 문자열들을 추출 해 간단한 정보를 얻곤 하였다. 하지만 요즘은 메모리에 대한 연구가 많이 진행되고 정보들이 공개 되어 도움이 될만한 유용한 정보를 추출하기 위한 많은 도구들이 개발되어 있어 메모리 분석의 어려움을 한층 낮추어 누구나 조금의 공부와 툴 사용법만 안다면 메모리 분석을 쉽게 할 수 있게 되었다.
 
대표적인 메모리 분석 도구로는 해당 글에서 소개 할 Volatility와 Mandiant 회사의 Redline이 존재한다. Volatility는 오픈소스이며 파이썬으로 작성되어 있어 누구나 도구를 다운로드 받아 분석을 수행 할 수 있으며, 오픈소스이기 때문에 각 메모리 분석 기법을 소스코드 분석을 통해 공부 할 수 있는 장점이 있다. Redline은 메모리 이미지 분석을 수행 할 때 메모리에 존재하고 있는 악성코드를 쉽게 찾고 분석하기 위해 IOC(maj3sty.tistory.com/1066)와 연계 할 수 있다는 장점이 있다.
 
해당 글에서는 나만의 Volatility Plugin 개발을 위한 설명을 하고자 한다. 아직까지 국내에는 Volatility 사용 매뉴얼(ls-al.org/volatility-korean-manual%EC%B5%9C%EC%A2%85/, chogar.blog.me/80183340960?Redirect=Log&from=postView) 또는 간편하게 명령어를 참고 할 수 있는 Cheet Sheet(blogs.sans.org/computer-forensics/files/2012/04/Memory-Forensics-Cheat-Sheet-v1_2.pdf)만 존재 할 뿐, 자신에게 맞는 Plugin 개발을 위한 가이드 글이나 문서가 존재하지 않는 것으로 알고 있다. 해당 글이 메모리 분석 시 Volatility를 이용 해 자신이 만든 플러그인을 사용하여 효율적인 분석을 할 수 있도록 도움이 되었으면 한다.
 
참고로 해당 글은 Volatility 2.1 버전을 기준으로 작성(2.1 버전 이상은 사실 개발 가이드의 차이가 없다. 필자가 가지고 있는 환경에 Volatility 2.1 버전이 있어 이와 같이 진행하는 것이므로 오해가 없길 바란다.)되며 Volatility의 정식 개발 가이드의 번역본이 아니다. 필자가 플러그인을 개발하며 느낀 것, 배운 것들을 정리하여 둔 글이므로 내용이 빈약하거나 빠진 부분, 또는 틀린 부분이 있을 수도 있다. 만약 이러한 부분들이 있다면 필자에게 개인적으로 알려주기 바란다.
 
1. 기본구조
먼저 간단하게나마 Volatility Plugin의 공통적인 기본 구조를 살펴보자. 기본구조를 살핌으로써 Plugin의 전반적인 구성을 한눈에 파악 할 수 있다. Volatility Plugin은 다음과 같이 기본 구조를 가지고 있다.
 
-__init__ : 플러그인 클래스의 초기화를 담당하는 함수이다. 해당 함수에는 보통 플러그인의 추가 옵션을 정의한다. Volatility에서 기본적으로 지원하는 플러그인을 제외하고 해당 플러그인에서만 사용 할 옵션을 지정하면 된다.
 
-register_options : 간혹 플러그인의 옵션을 설정하기 위해 __init__ 함수대신에 사용되는 기능이다. 하지만 거의 사용되지 않는다.
 
-help : 플러그인의 옵션을 출력 해 주는 기능으로 기본적으로 Volatility에서 지원하여 플러그인을 제작 할 때는 신경을 쓰지 않아도 되는 부분이다.
 
-execute : 해당 함수는 플러그인에서 calculate 함수를 호출하여 주는 함수로 플러그인 제작시에는 신경을 쓰지 않아도 되지만 추후에 다른 플러그인 사용 할 때 간혹 사용되는 함수이다.
 
-calculate : 플러그인에서 가장 중요한 함수이다. 해당 함수에서는 대부분의 플러그인 기능이 정의 되고 수행 된다. 플러그인을 개발 할 때 절대로 빠져서는 안되는 함수이다. 만약 내가 사용하려 하는 플러그인에 해당 함수가 존재하지 않는다면 execute를 통해 다른 플러그인의 기능도 사용하지 못한다.
 
- render_text : calculate에서 수행되고 리턴되는 값은 해당 함수로 전달되어 알맞은 포맷으로 출력 될 수 있다. 해당 함수 말고도 render_csv, render_html, render_xml, render_json이 있다. 각 함수를 사용하면 각 함수 명에 맞는 포맷으로 결과 값들을 출력 할 수 있다. 해당 함수를 호출할 때는 render_text 함수를 제외하고 Volatility 명령줄에 –output=csv|html|xml|json 명령을 추가한다.
 
설명을 보면 알겠지만, 정말 필수적으로 필요한 함수 또는 기능은 __init__, calculate, render_text 이다. 이 세가지 함수만 알고 플러그인에서 명시 해 준다면 플러그인은 문제없이 정상적으로 동작한다. 이제 간단하게나마 실제 코드를 실습하며 또 다른 중요한 부분들에 대해서 설명 하도록 하겠다.
 
2. 나만의 Plugin 등록하기
Plugin을 개발하는데 있어 가장 처음 해야 할 것은 나의 Plugin 파일을 Volatility가 인식하게 끔 여러 Plugin들이 존재하는 경로에 저장하는 것이다. 처음 플러그인은 간단하게 파일을 생성한 후 현재 자신의 컴퓨터에 존재하는 Volatility 플러그인 경로에 저장 해 주면 된다.


<그림1. 플러그인 파일 생성>
 
[그림 1]과 같이 플러그인 파일을 생성 했다면, 다음과 같은 코드를 플러그인에 적어보자.

 
Import 구문부터 살펴보도록 하자. Volatility Plugin에는 2가지 커맨드 플러그인이 존재한다. 하나는 위 소스코드에 보이는 commands 플러그인이며, 또 하나는 Windows와 Linux 플러그인을 위한 common 플러그인이다. 기본적으로는 commands 플러그인의 Command를 이용 해 Windows와 Linux 플러그인의 클래스 상속을 받지만 만약 내가 작성하고자 하는 플러그인이 Windows만을 위한 플러그인이라면 common 플러그인을 명시 해 Commands.Command 부분에 common.AbstractWindowsCommand을 명시한다. 또 Linux만을 위한 플러그인 이라면 common.AbstractLinuxCommand을 명시하면 된다.
 
필요한 플러그인 또는 모듈들을 명시 했다면 이제 플러그인의 큰 몸인 class를 선언하고 class 내부에 주석으로 플러그인의 설명을 적어둔다. 플러그인의 설명은 Volatility가 플러그인에 대한 help를 해석 할 때 사용되기 때문에 적어두는 편이 좋다.


<그림2. 플러그인 help>
 
3. 나만의 옵션 만들기
Class를 선언하고 Volatility Plugin 경로에 저장했다면 이제 Volatility 플러그인으로 작동할 수 있는 환경과 조건이 갖추어 졌다고 생각하면 된다. 이제는 기능만 구현하면 된다. 기능 구현에 첫 번째 조건으로는 플러그인의 옵션을 선언 해 조금 더 편하고 효율적인 기능을 수행하게 끔 해야 한다. 기본 구조를 설명 할 때도 언급 했듯이 옵션 선언 할 때에는 __init__ 함수 또는 register_option 기능을 이용한다. 여기서는 자주 쓰는 __init__ 함수를 이용 해 옵션을 지정 해보도록 하겠다. Class 내부에 다음과 같이 작성하여 보자.

__init__ 함수 안에서 클래스 인자를 초기화 한 후 config.add_option함수로 플러그인의 옵션을 설정하여 주면 된다. 설정한 옵션 인자는 다음과 같이 플러그인 help에서 볼 수 있다.

 

<플러그인 옵션>
 
플러그인의 옵션을 출력 했을 때 Volatility에서 기본적으로 지원하는 옵션들 외에 마지막 줄에 플러그인의 옵션인 ‘NAME’이 추가 된 것을 볼 수 있다.
 
지금까지 Volatility Plugin의 기본 구조와 간단한 실습을 통해 Plugin을 만들기 위한 기초 단계를 살펴 보았다. 다음 글에서는 Plugin의 핵심 기능을 만들기 위해 어떤 구조를 어떻게 써야 하는지 알아보도록 하겠다.
 
<About 이준형 연구원>
현재 건양대학교 3학년으로 재학 중이며, 저서로는 ‘디지털 포렌식의 세계’가 있다. 모의해킹 프리랜서 활동과 동시에 보안 블로그(maj3sty.tistory.com)를 운영하면서, 여러 보안 분야를 연구하는 ‘보안 프로젝트’ 커뮤니티, 디지털 포렌식 연구를 위한 ‘For_MD Team’, 버그 헌팅 전문 그룹인 ‘Bug Bounty Club’에서 활동하고 있다.
 
글. 이준형 보안프로젝트 연구원 saiwnsgud@naver.com
 
■ 보안 사건사고 제보 하기

▷ 이메일 : mkgil@dailysecu.com

▷ 제보 내용 : 보안 관련 어떤 내용이든 제보를 기다립니다!

▷ 광고문의 : jywoo@dailysecu.com

★정보보안 대표 미디어 데일리시큐 / Dailysecu, Korea's leading security media!★