- 메모리 분석이 중요한 이유
● 악성 파일의 흔적을 찾기 위해서는 메모리 영역에서 분석해야 하기 때문
● 개인정보보호 프로그램이 악성코드 판별 기능이 없어서 악성코드조차 보호를 하는 경우가 발생하기 때문
● 안티포렌식 기술로 인한 무결성이 저해되기 전 메모리 복구를 하여 정보를 얻어내는것이 중요하기 때문
- 메모리 덤프
● 하드웨어를 이용한 메모리 덤프
● 소프트웨어를 이용한 메모리 덤프
● OS Crash 덤프
● 하이버네이션
- 가상 메모리 구조
● 가상 메모리란 가상의 기억공간으로 물리적으로 존재하지 않는 메모리다. 프로세스 생성 시 고정된 크기의 가상 메모리가 할당이 되는데 해당 프로세스는 이 가상 메모리를 이용하여 해당 작업을 수행한다. 여기서 가상 메모리는 32bit, 64bit 컴퓨터마다 고정 용량 이 다르다. 또한 가상 메모리 주소와 물리 메모리 주소도 다르며 가상 주소는 물리 메모리 주소와 맵핑되며 부족한 부분은 디스크 주 소를 사용한다.
그림 1) 가상 메모리와 기억 장치의 주소 맵핑(http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Virtual_memory.svg/200px-Virtual_memory.svg.png)
● 가상 메모리 구조를 간단히 보면 사용자 영역, 커널 영역이 있으며 디테일한 것은 서적이나 구글링을 통해 확인. 이 책엔 디테일한 구조가 나타나 있지만 구글링을 통해 찾지 못했음... 참고로 [그림 2]에서 위가 높은주소, 아래가 낮은주소를 뜻함.
그림 2) 가상메모리 구조
(http://blog.naver.com/psychoria?Redirect=Log&logNo=40113053480)
● 가상 메모리와 물리 메모리 맵핑은 TLB -> 가상주소와 물리주소 맵핑 -> 있다면 TLB에 업데이트 시키고 물리주소의 데이터 가져옴
-> 없다면 가상메모리 주소 자체가 invalid거나 page-out상황
그림 3) 가상 메모리 물리 메모리 맵핑 과정
(http://sweeper.egloos.com/m/2988646)
그림 4) 가상주소로 물리주소 찾는 과정
- EPROCESS, KPROCESS(PCB), PEB
● 위 단계와 아래 단계에서 모르는 용어가 몇 개 나와 이를 공부하고자 용어들을 간단하게 정리하려고 한다.
● EPROCESS
◇ 프로세스가 생성되면 해당 프로세스의 정보를 가진 EPROCESS라는 구조체가 커널 메모리에서 생성된다. 프로세스 관리를 이해하 기 위해 여러 객체를 포함하고 있으며 시스템 공간에 존재하기 때문에 WinDbg에서 확인할 수 있다.(그림 5의 맨 왼쪽 위치)
● KPROCESS(Process Control Block(PCB))
◇ EPROCESS의 하부 구조체로 해당 프로세스의 정보를 가지고 있다. 커널 동기화 객체, Dispatcher 객체, CR3 레지스터 값(Context Switching시 Page Directory 물리 주소 저장소), 쓰레드 리스트 헤더, 프로세스 생성&종료 시간.... 등(그림 5의 오른쪽 위에 위치)
◇ 중요한 필드가 무엇인지 잘 몰라서 추후 공부하겠음....
● PEB(Process Environment Block)
◇ 유저 모드에서 수정되는 정보를 저장하는 구조체이고 프로세스 실행에 필요한 정보들을 담고 있다. 밑에 다시 설명
그림 5) EPROCESS, KPROCESS(PCB), PEB
(https://t1.daumcdn.net/cfile/tistory/1168DE0C4B7BB72130)
- 프로세스
● 메모리 분석 시 프로세스를 찾는 것이 중요하다. EPROCESS에는 많은 필드들이 있고 이들을 모두 분석한다면 아마....EPROCESS 의 필드 중 몇 가지 필드에 대해 설명하겠다.
㉠ PEB(Process Environment Block)
◇ 프로세스의 환경설정 값을 가지고 있고 프로세스가 로드한 모듈이나 이미지 로더, 힙 매니저 등 데이터를 담고 있다.
커널영역의 EPROCESS에 있는 PEB는 유저영역의 PEB의 주소를 가지고 있고, 유저영역의 PEB는 실제 프로세스 관련 데이 터들을 담고 있다.(그림 5 에서 동그라미를 제외한 부분이 커널 영역, 동그라미 친 부분이 유저영역)
PEB가 커널영역과 유저영역에 둘 다 있는 이유는 데이터를 유연하게 접근하기 위해 유저영역에 둔 것이다.
㉡ ActiveProcessLink
◇ 이 필드는 해당 시스템의 프로세스들 간의 연결을 담당하는 역할을 하고 이중연결리스트로 되어 앞뒤로 프로세스 walking을 할 수 있다. 예를들어 cmd.exe와 notepad.exe가 시스템에 올라와 있고 WinDbg로 cmd.exe의 ActiveProcessLink로 따라가게 된다면 notepad.exe의 EPROCESS의 PCB 필드를 가리키고 있다.
그림 6) ActiveProcessLink 역할 구조
(http://m.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=17602)
※ PSActiveProcessHead는 ActiveProcessLink의 첫 시작점이다. 따라서 환형구조를 이루고 있다.
◇ DKOM(Direct Kernel Object Manipulation)
그림 7) DKOM을 통한 프로세스 은닉 구조
(http://codeengn.com/archive/Reverse%20Engineering/Hooking/DKOM%EC%9D%84%20%EC%9D%B4%EC%9A%A9%ED%95%9C%20%EC%9D%80%EB%8B%89%20%EA%B8%B0%EB%B2%95%20%5Balonglog%5D.pdf)
ActiveProcessLink에서 은닉하고자 하는 프로세스의 링크를 없애는 것이다. 그림 7을 보면 더욱 이해가 편할 것이다. 프로세스를 은닉하는 이유는 프로세스를 은닉함으로써 분석을 어렵게 하고, 빠른 대응을 하지 못하게 함이 아닐까 생각한다.
● Process Enumeration
◇ Win API : CreateToolHelp32SnapShot()-> Process32First() -> Process32Next() -> NtGetSystemInformation() 호출
-> NtGetSystemInformation()이 조작되면 Process 목록을 모두 출력하지 못하는 상황 발생
◇ 작업관리자, pslist(Volatility)
-> 악성코드에 의해 OS는 잘못된 정보들을 얻어올 수 있음
◇ 리스트 워킹 : ActiveProcessLink를 따라다니며 모든 프로세스 목록을 얻음
◇ EPROCESS Scanning(패턴매칭) : EPROCESS가 공통적으로 가진 필드들을 조사하는 방법
◇ CSR PROCESS List 활용 : CSRSS.EXE 프로세스 생성시 내부적으로 프로세스 목록을 가지고 있다.
-> 하지만 system, smss, csrss 프로세스는 나타나지 않는다.
◇ Thread List 활용 : Thread가 속한 Process를 얻을 수 있다.