본문 바로가기
보안/포렌식

Windows 메모리 덤프 생성 및 분석

by ITPro 2012. 8. 8.

1. 메모리 Dump 수집

-FTK Imager


FTK imager는 디스크, 메모리, 레지스트리 Hive 파일 Dump를 지원하는 무료 도구입니다.

GUI 환경이라 손쉽게 사용가능하고 안정적인 Dump가 가능한 것이 특징입니다.



-Win32/64dd


Win32/64dd는 Moonsols Windows Memory Toolkit 중 일부로써, 윈도우 Crash Dump 형식을 지원하고 네크워크를 통해 Dump 파일을 저장 가능한 것이 특징입니다.



2. 메모리 분석 툴

-Redline


Mandiant에서 제공하는 GUI환경의 무료 메모리 분석 도구입니다.

Raw Dump 파일 및 Redline의 Collector로 수집한 Audit 파일을 통한 분석이 가능하며 Process, Network, Driver 등의 정보를 보고서 형태로 보여주며, MRI (Malware Risk Index) Score를 통해 악성코드로 의심되는 프로세스 목록도 확인가능합니다.

단점으로는 메모리 Dump 파일 로드 또는 Collector를 이용한 Audit 파일 생성시 결과물에 비해 다소 시간이 오래걸린다는 점이 있습니다.



-Volatility (http://www.volatilityfoundation.org/)

Volatility는 Python으로 제작된 CLI환경의 무료 메모리 분석 도구입니다.

Standalone 실행 파일로도 배포되고 있어 각종 도구의 설치가 힘든 경우에도 사용이 가능하며 Python 기반이기때문에 이식성이 좋습니다.

Volatility는 메모리 Dump 파일에서 파일을 별도로 추출해낼 수 있으며 별도의 Shell도 제공되어 좀 더 유연한 분석이 가능한 장점이 있습니다.



3.Volatility 활용

Windows에는 다양한 버전이 존재하고 각 버전마다 조금씩 차이가 존재하기때문에 분석 전 정확한 프로파일을 지정해주고 진행하여야 합니다. (기본값 : WinXPSP2x86 )


-imageinfo

Windows 버전을 모르는 경우 Volatility의 imageinfo 명령을 통해서도 확인 가능합니다.


위 실행 결과를 보면 2가지의 프로파일을 제안하고 있으며 서비스팩 정보가 3으로 나왔기 때문에 최종적으로 WinXPSP3x86 프로파일을 사용하면 됩니다.



-pslist

프로세스 목록을 나열합니다.


Offset,프로세스 명, PID, 실행 시간, 종료 시간 등이 표시되며 EPROCESS 구조체의 ActiveProcessLinks를 따라가며(List Walking) 목록을 생성하기 때문에 DKOM 등의 기법을 통해 프로세스를 은닉하는 경우 pslist로는 해당 프로세스가 출력되지 않습니다.


※DKOM(Direct Kernel Object Manipulation) : 자신의 앞 뒤에 존재하는 EPROCESS의 ActiveProcessLinks를 조작하여 자신을 건너뛰고 서로 직접 연결되도록 조작하는 기법



-psscan

프로세스 목록을 나열합니다.


pslist와 유사하지만 pool tag 스캔을 통해 프로세스 목록을 생성하기때문에 DKOM을 통해서 프로세스를 은닉하는 경우에도 출력이되는 차이점이 있습니다.


-psxview

은닉 프로세스를 좀 더 찾기 쉽도록 프로세스 목록을 나열합니다.



pslist, psscan 등에서 프로세스가 출력되는지 여부를 비교하여 은닉 여부를 쉽게 판별가능합니다.

위 실행결과와 같이 직관적인 결과를 통해 pslist 결과와 psscan 결과를 직접 비교하는 것보다 훨씬 손쉽게 비교 분석이 가능합니다.



-connscan

TCP 연결 목록을 나열합니다.



-sockets

열려있는 소켓 정보를 나열합니다.


소켓 구조체의 단순 연결리스트를 List Walking 하여 목록을 생성합니다.



-sockscan

열려있는 소켓 정보를 나열합니다.


psscan과 마찬가지로 pool tag 스캔을 통하여 목록을 생성하며 비정상적인 값이 출력되지 않아 sockets 의 결과보다 좀 더 깔끔하게 출력되었습니다.



-dlldump, memdump, moddump, procexedump

메모리상의 데이터 및 파일을 추출합니다.

※ volatility 2.4 이후 부터 procexedump, procexememdump 명령은 procdump 로 합쳐졌습니다.


각 명령은 DLL,프로세스 메모리, driver, 실행 파일 추출에 사용되며 각 결과파일은 이름이 변경되어 저장되고 원본의 이름, 주소 등의 정보는 콘솔상에 출력이되기 때문에 차후 수월한 비교분석을 위하여 출력을 리다이렉트하여 텍스트 파일로 저장해두는 것을 권장합니다.



은닉 프로세스(현재 Dump에서는 1816)의 데이터는 기본적으로 추출되지 않으며 해당 프로세스의 dll, 실행파일 등을 추출하기위해서는 해당 프로세스의 정확한 오프셋(물리 주소)을 -o 옵션을 통하여 인자로 전달해주어야 합니다.

은닉 프로세스의 물리주소는 psscan, psxview를 통하여 확인이 가능합니다.


위 실행결과와 같이 해당 프로세스의 오프셋을 인자로 전달되면 해당 데이터의 추출이 가능합니다.



-volshell

메모리 분석을 위한 쉘을 제공합니다.


WinDBG와 유사하게 디버깅이 가능하며 디스어셈블 기능도 제공하기때문에 유용하게 사용이 가능합니다.



dt() 명령을 통해 구조체의 정보를 확인 할 수 있습니다.



ps() 명령을 통해 프로세스의 간단한 정보를 확인할 수 있습니다.

DKOM으로 은닉한 프로세스는 목록에서 출력이 되지 않습니다.



dt()명령에 EPROCESS 구조체의 오프셋(가상 주소)를 전달해주면 해당 구조체의 값을 확인 할 수 있습니다.


은닉프로세스의 가상주소 확인은 pslist에 -o 옵션을 인자로 함께 전달해주면 확인 가능합니다.



은닉 프로세스와 관련된 ActiveProcessLinks 값을 확인 해보면 다음과 같습니다.


위 ActiveProcessLinks 값은 차례대로 은닉 프로세스 이전 프로세스,은닉 프로세스, 다음 프로세스의 리스트 값이며 앞 뒤 프로세스 모두 은닉 프로세스의 ActiveProcessLinks 값인 2185841680을 가리키지 않고 은닉프로세스를 건너뛰고 서로 직접 연결되어 있습니다.


PEB는 Image Base 주소, Module 주소 등  유저모드에서 접근이 필요한 정보를 가지고 있기 때문에 커널영역이 아닌 유저영역에 존재하고 있습니다. 따라서, 각 프로세스의 PEB 값을 확인하기위해서는 cc() 명령을 통해 프로세스를 지정해준 뒤 PEB 값을 확인해주어야 합니다.



cc() 명령의 인자로는 EPROCESS 구조체 주소, 프로세스 명, PID 등이 있으며 은닉 프로세스는 EPROCESS 구조체 주소로만 접근 가능합니다.



cc() 명령으로 프로세스를 선택해준 뒤, cmd.exe 의 PEB 값을 확인하면 정상 출력이 되는 것을 확인 할 수 있습니다.



db() 명령으로 PEB의 Image Base 주소의 데이터를 확인해보면 위와 같이 PE파일의 헤더를 확인할 수 있습니다.

PE 헤더의 OPTIONAL 헤더 멤버인  Image Base와 Entry Point를 조합하여 해당 위치의 코드를 확인해보면 다음과 같습니다.



dis() 명령에의해 cmd.exe의 OEP 코드가 정상적으로 디스어셈블 되어 출력이 되고 있습니다.


마지막으로 Ctrl + Z 입력을 통해 volshell 종료가 가능합니다.



반응형