[OS] 윈도우 메모리( Windows Memory)

 

윈도우 메모리


(1) 윈도우 메모리

1-1. 메모리 내 정보

  • 복호화 된 파일 컨텐츠

  • 사용자 패스워드

  • 프로세스의 임시 저장 데이터 

 

1-2-1. 메모리 분석 이유 1

  • 직접 메모리에 로드 되어 실행되는 악성코드 존재

  • 소기의 목적 달성을 위해 반드시 실행 파일로 존재

  • 압축 / 암호화 되지 않은 평문의 실행 코드가 메모리에 올라와야 함

 

1-2-2. 메모리 분석 이유 2

  • 폰 노이만 아키텍처 (Von-Neumann Architecture)

[그림 1] 폰 노이만 아키텍처


(2) 메모리 구조

2-1. 32bit CPU

  • 2^32 = 4294967296 (0 ~ 4294967295) = 4Gbyte

[그림 2] 메모리 구조 1

 

[그림 3] 메모리 구조 2

 

 

2-2. 가상 메모리

  • 32bit CPU

  • 프로세스는 자신만의 가상 주소 공간을 가짐

  • 프로세스가 소유하고 있는 메모리에 대해서만 접근

  • 프로세스가 실제 필요한 부분만 메모리에 올리는 Demand-Paging 기법 사용

  • 디스크 공간을 메모리처럼 활용 - 디스크 상에 존재하는 Paging File (Swap File)

  • 모든 프로세서 사용 가능

[그림 4] 가상 메모리 주소

 

[그림 5] 가상 메모리 영역

 

CODE 영역

  • 코드 자체를 구성하는 메모리 영역

  • 프로그램 명령이 위치하는 곳 (기계어로 제어되는 메모리 영역)

DATA 영역

  • 전역 변수(global), 정적 변수(static), 배열(array), 구조체(structure) 등이 저장

  • 초기화 된 데이터 저장

  • 프로그램이 실행 될 때 생성, 종료 시 반환

BSS 영역

  • Block Stated Symbol

  • 전역 변수(global), 정적 변수(static), 배열(array), 구조체(structure) 등이 저장

  • 초기화 되지 않은 데이터 저장

  • 프로그램이 실행 될 때 생성, 종료 시 반환

Heap 영역

  • 동적 데이터 영역

  • 필요에 의한 동적 메모리 할당 시 위치하는 메모리 영역

  • 사용자 요구에 맞게 메모리 할당

  • 메모리 주소 값에 의한 참조

Stack 영역

  • 프로그램이 자동으로 사용하는 임시 메모리 영역

  • 지역 변수(Local), 매개 변수(Parameter), 리턴 값 등 잠시 사용되고 사라지는 데이터 저장

  • 함수 호출 시 생성, 함수 끝나면 반환

[그림 6] 가상 메모리 영역 역할

 

예시

  • int A 선언

  • 실행 파일 .exe 생성 : Header(code, bss, data) > PE(Portable Executive)


(3) 메모리 구조체

 

[그림 7] 메모리 구조체

 

3-1. EPROCESS

  • 윈도우에서 프로세스와 관련된 정보는 EPROCESS 구조체를 사용하여 관리

  • 메모리 덤프는 EPROCESS 구조체와 EPROCESS 구조체 앞에 나오는 헤더 정보 추출

  • 프로세스에 대한 구조체 여부 판단 > 공격자가 수행했던 프로세스에 대한 정보 획득

[그림 8] EPROCESS 구조체

 

3-2. EPROCESS 정보

  • PCB(Process Control Block) : 스케줄링 관련 정보, KPROCESS 구조체, Type 값과 Size 값 확인

  • Create Time / Exit Time : 프로세스 실행 / 종료 시간

  • UniqueProcessId : 프로세스를 식별하는 고유한 PID 값 저장

  • ActiveProcessLinks(이중환형 링크드 리스트) : 두 개의 값이 각각 이전 프로세스와 이후 프로세스 가리킴

  • PEB(Process Environment Block) : 메모리에 올라가 있는 모듈 및 실행 커맨드 명령어 등 

[그림 9] EPROCESS 정보

 

3-3. ActiveProcessLink

  • Flink 값 : 다음 프로세스 ActiveProcessLink를 가리킴

  • Blink 값 : 이전 프로세스의 ActiveProcessLink 시작점을 가리킴

  • PSActiveProcessHead 전역 변수 : Flink, Blink 값을 가지고 있음

[그림 10] ActiveProcessLink

 

[그림 11] EPROCESS 카빙 1

 

[그림 12] EPROCESS 카빙 2

 

[그림 13] EPROCESS 카빙 3

 

[그림 14] EPROCESS 카빙 4

 

  • KPROCESS의 Type 값과 Size 값 확인

 

[그림 15] EPROCESS 카빙 5

 

  • Process인 경우 85343690 값을 가지고 있으며, PsProcessType 값과 동일

 

[그림 16] EPROCESS 카빙 6

 

  • POOL_HEADER 의 PoolTag 값 확인

 

[그림 17] EPROCESS 카빙 7

 

[그림 18] EPROCESS 카빙 8


(4) DKOM(Direct Kernel Object Manipulation)

  • 커널 객체(구조체)를 변경하여 은닉하는 방식

  • 커널 디버깅을 통해 은닉하고자 하는 프로세스의 FLINK / BLINK 변경

[그림 19] DKOM

 

 

4-1. 프로세스 은닉

 

[그림 20] 프로세스 은닉 (1)

  • 1) 프로세스 확인

 

[그림 21] 프로세스 은닉 (2)

  • 2) 해당 프로세스 상세 정보 확인

 

[그림 22] 프로세스 은닉 (3)

  • blink / flink 주소 값 변경

  • ed [blink 주소 값] [flink 주소 값]

  • ed [flink 주소 값 + 0x4] [blink 주소 값]

  • g

 

[그림 23] 프로세스 은닉 (4)

  • .dump /f c:\dfl\dbg.dmp

 

이후  volatility 메모리 분석 도구를 통하여 분석할 수 있으며, 사용 플러그인은 pslist, pstree, psscan 명령어로 확인 가능하다.


(5) 메모리 분석 요구사항

  • 커널 오브젝트 구조

  • 프로세스 관리

  • 메모리 관리 기법

[그림 24] 메모리 분석 요구 사항

 

5-1. 커널 오브젝트

 

커널 오브젝트에 대한 내용 및 구조는 다음 [그림 25]와 같다.

 

[그림 25] 커널 오브젝트 구조 및 내용

'OS' 카테고리의 다른 글

[OS] Windows Structure & Folder  (0) 2020.05.21
[OS] Windows Boot Process  (0) 2020.05.21

+ Recent posts