본문 바로가기

정보보안/Forensics

물리메모리 포렌식 (SKS 포렌식 스터디 week3)

메모리 포렌식이란

 

메모리 포렌식이란 컴퓨터 하드웨어 중 주 기억장치(RAM)에 남아있는 데이터의 흔적을 분석하는 포렌식 기법입니다. RAM은 휘발성이 강하지만 프로세스 정보, 네트워크 연결 정보, 악성코드 파일 정보, 사용자 활동 정보, 시스템 관련 자료구조 등 고유의 독특한 정보가 남아있습니다. 이런 특성을 이용해 메모리 포렌식은 프로세스의 행위 탐지, 네트워크 연결 정보, 사용자 행위, 복호화나 언패킹 또는 디코딩된 데이터 탐색, 패스워드와 암호 키를 획득한다는 목적을 가지고 RAM에 남아있는 데이터를 분석합니다

 

메모리 포렌식에서 분석하게 될 대상은 물리 메모리, 페이지 파일, 하이버네이션 파일 등이 있습니다.  물리 메모리란 주 기억장치를 말하는 것이고, 페이징 파일(가상 메모리)는 실제 물리적인 메모리 공간 외에 하드 디스크에 파일 형태로 따로 준비하는 가상의 메모리 공간입니다. 하이버네이션(최대 절전 모드) 파일이란 시스템 전원을 끄기 전에 시스템 메모리에 있는 내용을 하드 디스크와 같은 비휘발성 메모리에 파일 형태로 기록한 내용입니다. HDD에 저장되는 페이징 파일과 하이버네이션 파일은 비휘발성이고, 주 기억장치에 저장되는 물리 메모리는 휘발성이 있지만 메모리 지속성 분석 결과를 보면 메모리 페이지는 대부분 유지되는 특성이 있어 분석이 가능하다고 합니다.

 

가상 메모리에 대해 자세히 알아보자면 가상 메모리는 물리 메모리를 보조해주는 역할로 물리 메모리 공간이 가득 차서 용량이 부족하게 될때 물리 메모리에 저장되어 있는 내용 중 당장 사용하지 않는 내용들을 페이징 파일로 옮겨 물리 메모리에 공간을 확보해줍니다. 즉 가상 메모리는 물리 메모리와 가상 메모리 사이에서 데이터를 스왑하는 방식으로 다수의 프로세스가 사용하는 공간을 물리 메모리에 나눠서 할당하고, 대용량 메모리를 사용하는 프로그램이 수행 가능하도록 합니다.

 

win32 시스템의 모든 프로세스는 4GB의 주소 공간을 사용하는데, 이중 0x00000000~0x7fffffff까지의 주소는 사용자 영역, 0x80000000~0xffffffff까지의 주소는 커널 영역이 됩니다. 사용자 영역과 커널 영역의 크기는 사용자 영역 확장 기능을 통해  조절할 수 있습니다. 프로세스 생성 과정은 실행 파일 실행 -> 서브시스템(POSIX, MS-DOS, Win32 등) 확인 -> EPROCESS, KPROCESS, PEB, 초기 주소 공간 설정 -> 기본 스레드 생성 -> 윈도우 하위 시스템에 새로 생성된 프로세스와 스레드 알림 ->기본 스레드에 의해 프로세스 환경 설정과 스레드 자원 할당 -> 새로운 프로세스와 스레드의 컨텍스트 내부 주소 공간 초기화 완료로 이루어져 있습니다.

 

 


물리메모리 덤프

 

물리메모리 덤프 방식은 하드웨어를 이용한 덤프, 소프트웨어를 이용한 덤프, 크래시 덤프, 가상화 시스템 덤프, 절전모드(하이버네이션) 덤프가 있습니다.

 

하드웨어를 이용한 덤프에는 PCI 장치를 이용한 덤프와 FireWire(IEEE 1394)를 이용한 메모리 덤프가 있습니다. PCI 장치를 이용해 물리 메모리를 외부 저장장치로 덤프하는 방식은 추가적인 하드웨어/소프트웨어의 설치 없이 무결성을 최대로 보장하지만 사전에 미리 설치되어 있어야 하기 때문에 조직별 규정에 따라 마련해야 한다는 특징이 있습니다. FireWire 인터페이스를 이용해 DMA에 접근하여 메모리를 덤프하는 방식은 빠르고 악성 프로그램에 영향을 받지 않으며 무결성을 최소화할 수 있다는 장점이 있지만 간혹 시스템 크래시가 발생해 안정성 문제로 연구로만 진행되고 있다는 한계가 있습니다.

 

소프트웨어를 이용한 덤프 방식에는 대표적으로 Win(32|64) dd, Memorize™, FD(FastDump) Pro 등의 소프트웨어를 사용하는 방법이 있습니다. 각각의 소프트웨어별로 가격과 기능, 지원하는 윈도우 버전이 다르기 때문에 사용 목적이나 대상에 따라 다르게 사용할 수 있습니다. 최근 메모리 덤프는 하드웨어, 크래시 등 다른 방식보다 소프트웨어 방식을 이용한 메모리 덤프 방식을 주로 사용한다고 합니다. 

 

크래시 덤프 방식은 물리메모리에 최소한의 영향을 미치는 덤프 방법으로 BSOD(Blue Screen of Death)와 같은 크래시가 일어났을 때 자동으로 메모리 덤프를 생성하는 방식입니다. 작은 메모리 덤프, 커널 메모리 덤프, 전체 메모리 덤프 등 메모리 덤프의 범위를 조절할 수 있습니다. 덤프 내용은 WinDbg나 Kernel Memory Space Analyzer 등을 통해 디버깅할 수 있습니다. 

 

절전모드 덤프는 시스템이 절전 모드로 진입할때 메모리를 압축해 C:\hiberfil.sys 파일로 저장된다는것을 이용한 덤프 방식입니다. hiberfil.sys 파일은 부팅 과정에서 NTLDR에 의해 메모리로 로드되어 이전 상태로 복귀하는데 노트북 등 휴대용 시스템에는 절전모드가 기본적으로 설정되고, 조사 시에는 강제로 절전모드를 설정 후 덤프를 분석할 수 있습니다. 절전모드 덤프는 추가적인 프로그램이나 장비가 불필요하지만 전체 메모리 영역의 덤프가 아닌 사용 중인 영역만 덤프된다는 한계점이 있습니다.

 

이에 더해 실전에서 쓰이는 메모리 덤프 기술에 대해 알아보자면 콜드 부트라는 종료된 시스템 메모리를 차갑게 유지시켜 메모리 손실을 줄이는 방법도 있습니다. 하드웨어 방식은 미리 설치를 요구하거나 안정성이 떨어질 수 있고, 절전 모드, 크래시 덤프는 제한된 환경에서 동작하기 때문에 실전에서는 주로 소프트웨어 방식을 이용한다고 합니다. 또한 덤프한 메모리는 D 드라이브 등 외장저장장치에 저장해 덤프를 수집합니다.

 

 


물리메모리 분석

 

초기 메모리 분석은 문자열 추출, 파일 카빙으로 이루어집니다. 문자열 추출은 특정 패턴의 문자열을 검색해 이메일, 계정, 비밀번호, 메신저 대화 등의 데이터를 수집하는 방식입니다. 그래픽 이미지, HTML, 레지스트리 등 파일을 파일 카빙 기법으로 수집해 획득합니다.

 

물리메모리 상의 오브젝트를 찾기 위한 방법에는 리스트 워킹(list-walking)과 패턴 매칭(Pattern Matching)이 있습니다. 리스트 워킹은 EPROCESS 구조체 내부의 프로세스 이름을 검색하여 주요 프로세스를 확인하는 기법과 KPCR(Kernal Processor Control Region)을 이용해 KTHREAD로 EPROCESS의 위치를 확인하는 기법 등이 있습니다. 리스트 워킹에서는 DKOM과 같은 프로세스 은닉 기법은 탐지가 불가능하다고 합니다. 패턴 매칭이란 프로세스 구조체의 패턴을 이용해 메모리 영역 전체를 검색하는 방법입니다. 은닉 프로세스라도 동일한 프로세스 구조체를 가져 분석할 수 있습니다. 패턴 매칭의 기준 예시는 다음과 같습니다.

  • 프로세스와 스레드는 오브젝트로 존재하며, 모든 오브젝트는 OBJECT_HEADER를 포함
  • 프로세스와 스레드는 동기화가 필요하므로 하부 구조체로 DISPATCHER_HEADER를 포함
  • 프로세스와 스레드는 중요 오브젝트이므로 page pool이 아닌 non-paged pool에 기록 (POOL_HEADER 포함) 

물리메모리 분석 도구에는 Redline, Volatility, Responder Pro, Second Look Linux Memory Analysis, Volafox, Volafunx 등이 있습니다.