티스토리 뷰

◎ Processes and DLLs : 프로세스와 DLLs 분석
 > pslist : PsActiveProcessHead가 가리키는 이중 연결 목록(doubly-linked list)을 살펴보고 오프셋, 프로세스 이름, ID, 부모 프로세스 ID(PPID), 쓰레드의 수, 핸들의 수, 프로세스 시작 시간과 종료 시간 등 실행 중인 프로세스 정보를 나열합니다. 다만 프로세스가 은닉되거나 연결이 끊어진 프로세스는 출력해주지 않습니다.

  - doubly-linked list : 노드와 노드가 양방향으로 연결되어 있어 양방향으로 탐색이 가능합니다.

  - Time은 Process의 시작 시간을 의미하며 Thds와 Hnds가 0이면 해당 Process는 활성화 상태가 아님을 뜻합니다

  - System 과 smss.exe 는 세션 ID 를 가지지 않는데 System 은 세션들이 자리 잡기 이전에 시작되고 smss.exe 는 자기 스스로가 세션 관리자이기 때문입니다.
  - Offset은 Virtual address를 기본으로 보여주고 있기 때문에, Physical 주소를 보고 싶다면 -P Option을 주면 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 pslist -P

 

 > pstree : 부모(Parent) 프로세스와 자식(Child Process) 프로세스 간의 상관 관계를 5642138-마침표(.)를 통하여 트리 형태로 출력해줍니다.
  - pslist 와 유사하며 은닉되거나 연결이 끊긴 프로세스는 출력해주지 않습니다.
  - 자식 프로세스들은 "."(마침표)를 이용하여 Tree 형태로 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 pstree

 

 > psscan : 실행 중인 프로세스 정보와 함께 이미 종료된 프로세스 정보를 나열합니다.
  - pslist, pstree 와 유사하지만 풀 태그 스캐닝(pool tag scanning)을 사용하여 프로세스를 출력해줍니다.
  - pool tag scanning : 커널 개체 할당을 찾기 위해 메모리 분석에서 일반적으로 사용되며 높은 정확도를 유지하면서 커널 데이터 구조를 훨씬 빠르게 스캔합니다.
  - 종료된 프로세스(interactive Process)나 비활성화 되어있는 프로세스, 루트 킷에 의해 숨겨(hidden)지거나 연결이 끊긴 프로세스(unlinked Process)들을 찾을 수 있습니다.
  - 프로세스가 이미 종료되었다면, 종료시간(Time exited) 항목에서 종료시간을 볼 수 있습니다.
  - 숨겨진 프로세스(프로세스의 DLL)에 대해서 조사하고 싶다면 해당 프로세스의 물리주소(Offset(P))로 이동하여 EPROCESS 구조체의 물리 오프셋 정보(헤더 시그니처 03 00 58 00 위에 풀태그 시그니처 50 72 6F E3 변조여부)를 확인하면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 psscan

 

 ※ EPROCESS(Executive Process) 구조체
  - 직접 적인 접근이 가능하며, 커널 모드(Kernel Mode)에서 프로세스 정보를 지닌 구조체입니다.
  - 시스템이 프로세스를 실행하고 관리하기 위한 모든 정보가 들어있습니다.
  - 프로세스가 생성되면 해당 프로세스의 정보를 가지고 있는 EPROCESS 라는 구조체가 커널 메모리에 생성됩니다.
  - 모든 프로세스(Process)는 각자의 EPROCESS 구조체를 하나씩 가지고 자신이 사용하는 쓰레드(Thread)의 개수만큼 ETHREAD 구조체를 가집니다.
  - Process : 메모리에 올라와 실행되고 있는 프로그램을 의미합니다.(Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역)
  - Thread : 프로세스가 할당받은 자원을 이용하는 여러 실행의 흐름으로 프로세스 내의 주소 공간이나 자원들을 프로세스 내 쓰레드끼리 공유하면서 실행됩니다.(Stack만 따로 할당받고 Code, Data, Heap 영역은 공유)
  - ETHREAD(Executive Thread Block) : 쓰레드가 속한 포인터와 그 쓰레드가 실행을 시작해야할 루틴의 주소 등과 KTHREAD의 포인터를 가집니다.
  - EPROCESS 와 ETHREAD 내부에는 각각 PCB = KPROCESS, TCB = KTHREAD란 이름의 구조체가 존재합니다.
  - KPROCESS : NULL 동기화 객체와 관련된 디스패처 객체 헤더(DISPATCHER_HEADER), 가상 메모리의 CR3 레지스터 값, 프로세스에 속해 있는 스레드 리스트 헤더, CPU에 대한 종속성(Affinity), 프로세스 우선순위, 프로세스에 서 생성되는 스레드의 기본 실행 시간 값 등과 같은 정보를 저장합니다.
  - PCB(Process Control Block) : DISPATCHER_HEADER, 디렉토리 테이블 주소, KTHREAD 목록, 우선순위, 커널/유저 CPU 시간 등에 대한 정보를 가지고 있습니다.
  - KTHREAD(Kernel Thread Block) : 쓰레드의 스케줄링 및 동기화 정보, 이 쓰레드가 커널 모드에서 실행될 때 사용되는 커널 스택과 TEB 포인터, 스레드 우선순위, 스케줄러에 의해 실행을 준비하고 있는 스레드 리스트, 퀀텀 값등의 정보를 저장합니다.
  - TCB(Thread Control Block) : 쓰레드별를 관리하는 자료구조입니다.
  - PEB(Process Environment Block) : 사용자 모드(User Mode, 빠른 연산 가능)에서 프로세스 실행에 필요한 정보(환경 설정 포인터 값)들을 담고 있으며, BaseAddress, Module List, Heap/Stack 정보가 들어있습니다.
  - TEB(Thread Environment Block) : 쓰레드 식별자, 사용자 모드(User Mode) 스택 및 쓰레드별 데이터를 저장하기 위한 배열을 가지고 있습니다.
  - ActiveProcessLinks : ActiveProcess List를 구성하는 이중 링크드 리스트로 프로세스의 목록을 얻을 수 있습니다. 작업관리자를 열면 보이는 System(PID 4) 프로세스는 윈도우 커널을 의미하며, 언제나 ActiveProcessLink의 첫번째 프로세스가 됩니다.
  - DISPATCHER_HEADER : 프로세스들 사이의 동기화에 필요한구조체이며 메모리 덤프에서 오브젝트를 찾을 때 중요한 역할을 합니다.

 

 > psdispscan : psscan과 비슷하지만 pool tag 대신 DISPATCHER_HEADER를 조사하여 프로세스들을 열거합니다.(only windows xp x86)
  - 명령어라인에 --plugins=contrib/plugins를 꼭 입력해야 합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 psdispscan

 

 > dlllist : 특정 프로세스에서 로드 한 DLL의 정보를 분석합니다.
  - 특정 프로세스 DLL을 보기 위해서는 -p 또는 -pid 명령어를 통하여 볼 수 있으며 이는 PEB_LDR_DATA의 InLoadOrderModuleList에서 가리키는 LDR_DATA_TABLE_ENTRY(=LDR_MODULE) 구조체들의 이중연결리스트를 지닙니다. DLL들은 한 프로세스에서 LoadLibrary(또는 LdrLoadDll 과 같은 몇몇 파생함수)를 호출할 때 이 리스트에 자동으로 추가되며 FreeLibrary가 호출되거나 레퍼런스 카운트가 0이 될 때까지 제거되지 않습니다.
  - PEB_LDR_DATA : 로드된 모듈에 대한 정보를 제공(InLoadOrderModuleList, InMemoryOrderModuleList, InInitializationOrderModuleList)
  - InLoadOrderModuleList : 메모리에 로드된 순서, InMemoryOrderModuleList : 메모리에 위치한 순서, InInitializationOrderModuleList : 초기화된 순서
  - LDR_DATA_TABLE_ENTRY : 프로세스의 PE Image 정보를 담고있니다.
  - LoadLibrary : 프로세스의 주소 공간에 라이브러리(DLL) 모듈을 로드합니다.
  - LdrLoadDll : LoadLibrary와 같이 프로세스로 DLL을 로드하는 하위 수준의 함수입니다.
  - FreeLibrary : DLL 모듈이 더 이상 필요하지 않은 경우 프로세스의 주소 공간으로부터 DLL 파일을 unload하는 함수입니다.
  - 특정 Process에 대한 Dll list를 보려면 -p 또는 --pid Option을 사용하여 확인이 가능합니다
  - 루트킷에 의해 숨겨지거나 연결이 끊어진 프로세스들의 DLL들을 보기위해서는 psscan 명령어로 물리 주소를 획득하고 --offset=OFFSET 으로 확인합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist
 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist -p 1111
 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist --pid 1111
 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist --offset=0x주소(physical
offsets)

 

 > dlldump : 모든 프로세스에서 로드한 DLL을 바이너리 형태로 추출합니다.
  - 특정 출력 디렉토리를 설정하려면, --dump-dir=DIR 또는 -D DIR 을 사용합니다.
  - 특정 프로세스로부터 모든 DLL을 덤프 뜨려면 -p 또는 --pid=PID 을 사용합니다.
  - 프로세스 메모리의 아무위치로부터 PE 를 덤프 뜨려면 --base=BASEADDR 을 사용합니다.
  - 숨겨지거나 연결이 끊어진 프로세스로부터 모든 DLL을 덤프 뜨려면 -o 또는 --offset=OFFSET 을 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 dlldump -D folder_name/
 # python vol.py -f image.vmem --profile=Win7SP1x64 dlldump --pid 1111 -D folder_name/ --base=0x주소
 # python vol.py -f image.vmem --profile=Win7SP1x64 dlldump -o 0x주소 -D folder_name/ --base=0x주소

 

 > handles : 의심되는 process 분석 시 어떤 경로에 이미지파일이 있는지, 어떤 파일을 이용하는지 등 Image로 부터 열려 있는 handle을 보여주는 명령어입니다. 악성코드 분석에 유용합니다.
  - 특정 Process에 대한 handle만을 출력하고 싶다면, -p 또는 --pid 또는 --physical-offset=OFFSET 을 사용합니다.
  - 특정 type에 대한 handle만을 출력하고 싶다면, -t 또는 --object-type=OBJECTTYPE 을 사용합니다.
  - 결과에 object 이름이 없어 공백으로 나오는 경우를 없애고 싶다면 --silent 를 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 handles

 

 > getsids : 각 프로세스의 소유자를 표시합니다.
  - SID(Security ID, 보안식별자)들을 보기 위해 getsids 라는 명령어를 사용합니다.
  - 권한 상승과 같은 의심 가는 부분을 확인할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 getsids

 

 > cmdscan : 공격자가 콘솔 쉘(cmd.exe)을 통해 입력한 명령어들을 찾기위해 _COMMAND_HISTORY을 스캐닝하여 아래와 같은 정보를 보여줍니다.
  - 콘솔 호스트 프로세스(csrss.exe 또는 conhost.exe)의 이름
  - 콘솔로 사용되고 있는 어플리케이션의 이름(어떤 프로세스든 cmd.exe 를 사용함)
  - 명령어 히스토리 버퍼들의 위치, 현재 버퍼 카운트, 마지막으로 추가된 명령어, 그리고 마지막으로 보여진 명령어
  - 어플리케이션 프로세스 핸들

 # python vol.py -f image.vmem --profile=Win7SP1x64 cmdscan

 

 > consoles : 공격자가 cmd.exe 에서 입력하거나 백도어를 경유하여 실행되는 명령어들을 찾기위해 _CONSOLE_INFORMATION을 스캐닝하여 아래와 같은 정보를 보여줍니다.
  - 공격자가 입력한 명령을 출력해줄뿐만 아니라, 스크린 버퍼(입력과 출력)를 모두 수집합니다.
  - 원본 콘솔 창 이름과 현재 콘솔 창 이름
  - 첨부된 프로세스들의 pid 와 이름(하나가 아닐 경우 LIST_ENTRY 를 순회하면서 열거합니다)
  - 특정 명령어 실행과 연관된 앨리어스. 예를 들면, 공격자는 "hello" 입력시 실제로는 "cd system"이 실행되는 앨리어스를 등록 할 수 있습니다.
  - cmd.exe 콘솔의 화면 위치

 # python vol.py -f image.vmem --profile=Win7SP1x64 consoles

 

 > envars : 프로세스의 환경변수들을 보여줍니다.
  - CPU 수, 하드웨어 아키텍처, 프로세스의 현재 디렉토리, 임시 디렉토리, 세션 이름, 컴퓨터 이름, 유저 이름 등등을 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 envars

 

 > verinfo : PE File에 저장된 정보들을 보여주는 명령어입니다.
  - 모든 PE File들이 version 정보를 가지지 않습니다.
  - 해당 명령어는 -p 와 -o 옵션을 지원합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 verinfo

 

 > enumfunc : 프로세스들, DLL들, 그리고 커널 드라이브들에서 불러오고 내보내는 함수들을 열거합니다.
  - 풀 스캐너를 이용하려면 -s 옵션을 사용하며, 숨겨진 드라이버들 또는 숨겨진 프로세스들의 함수들을 열거하는데 유용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 enumfunc -s

  - 프로세스 메모리의 내보낸 함수들을 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 enumfunc -P -E

  - 커널 메모리의 불러온 함수들을 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 enumfunc -K -I

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

댓글
공지사항