FAT(File Allocation Table) - FAT영역



그림1. 예약 영역 바로 다음에 위치하는 FAT영역


그림1에서 보듯이 예약된 영역 바로 다음에 FAT영역이 위치하는것을 볼 수 있다. FAT는 파일 할당 테이블로 데이터 영역에 저장된 파일들의 할당관계를 표시해주는 테이블이다.


두번째 FAT영역(FAT #2)은 첫번째 FAT영역(FAT #1)의 백업본이다. 따라서 첫번째, 두번째 FAT영역 둘다 동일한 데이터를 담고있다.


FAT영역의 목적은 데이터 영역에 저장된 파일의 클러스터 할당 관계를 테이블 형태로 보여주는 것이다. FAT12/16은 2바이트 FAT32는 4바이트를 통해 데이터 영역의 시작 부터 마지막 클러스터 까지 할당관계를 보여준다. 따라서 FAT32에서 4바이트씩 클러스터를 표현하므로 한섹터(512byte)에는 (512/4)128개의 클러스터를 표현할 수 있다. FAT영역이 100개의 섹터 크기를 가지고, 클러스터 크기가 4KB라면 데이터 영역의 총 크기는 (128 * 100 * 4096 바이트)가 된다.


FAT 파일 시스템은 첫 번째 클러스터인 클러스터 2부터 시작하지 않아 위치를 쉽게 찾지는 못한다. 첫 번째 클러스터를 찾는 방법은 FAT12/16과 FAT32가 서로 다르다. FAT12/16파일 시스템의 경우 파일 시스템이 생성될 때 데이터 영역 첫 번째 섹터에 루트 디렉토리가 할당된다. 아래 그림이 FAT12/16 파일 시스템이다.


그림2. FAT12/16 파일시스템의 루트디렉토리 위치


반면에 FAT32는 루트 디렉토리의 유동성 때문에 데이터 영역의 첫번째 섹터가 클러스터2 이다. 데이터 영역의 어딘가에 루트 디렉토리가 위치하게 된다. 아래 그림이 FAT32 파일 시스템이다.


그림3. FAT32 파일시스템의 루트 디렉토리 위치는 유동적



여기까지 FAT영역!

'Forensic' 카테고리의 다른 글

FAT File System - 예약영역  (0) 2015.01.26
볼륨과 파티션-도스파티션  (0) 2015.01.13
하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05

FAT(File Allocation Table) - 예약영역


FAT 파일시스템은 MS-DOS 시절부터 사용 되었으며, 간단한 구조로 흔히 SD card에서 많이 사용하는 파일시스템이다.

FAT은 FAT12, FAT16, FAT32로 나누어 진다. 이때 FAT뒤의 숫자는 표현 가능한 최대 클러스터 수이다.


그림1. FAT 파일시스템의 물리적 레이아웃


그림2. FAT12/16의 예약된 영역


그림3. FAT32의 예약된 영역


그림1.2.3 을 보면 FAT12/16과 FAT32의 예약영역의 차이를 볼 수 있다. 이제 부트 섹터의 내용을 보자.


그림3. 부트섹터 구조(1섹터=512바이트)


부트섹터의 처음 3바이트는 부트코드가 있는 0x003E 또는 0x005A로 점프하기 위한 점프 명령어가 위치한다.다음 BPB의 내용은 클러스터 크기, FAT크기, 루트 디렉터리 위치, 총 섹터 수 등의 파일시스템 정보를 가지고 있다.

부트 코드는 점프 명령에 의해 실행되며 이때 BPB 정보를 참조하여 파일시스템을 부팅한다. 정상적이지 않은 동작을 할경우 에러메시지를 출력한다. 또한 FAT32형식의경우 부트 섹터의 내용을 6번째 섹터(0부터 시작)에 백업해둔다. 따라서 부트섹터가 정상적이지 않을 경우 백업된 부트섹터를 복사하여 사용한다.



그림4. 부트섹터, FSINFO, 부트스트랩 백업


그림4와 같이 부트섹터 FSINFO 부트스트랩을 각각 [0,6] [1,7] [2,8]번 섹터에 저장한다.


그림5. FSINFO 섹터 데이터 구조


FSINFO는 7번째 섹터에 내용을 백업해 둔다. FSINFO는 비할당 클러스터의 위치를 알려줌으로써 해당 볼륨에 저장하고자 하는 파일을 빠르게 할당할 수 있도록 도와준다. 또한 전체 비할당 클러스터의 수를 통해 해당 파일이 볼륨에 할당 가능한지 여부도 알 수 있다.



'Forensic' 카테고리의 다른 글

FAT File System - FAT영역  (0) 2015.01.27
볼륨과 파티션-도스파티션  (0) 2015.01.13
하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05

1. 볼륨

볼륨이란 운영체제나 응용 프로그램이 데이터를 저장해 사용하도록 주소가 지정된 섹터들의 집합이다. 대신 섹터들이 연속적이지 않다. (섹터가 연속적이면 파티션)


Windows와 Unix의 볼륨 사용 차이

    • Windows의 경우 C,D와 같은 드라이브 문자가 있지만 Unix는 드라이브 문자가 없다.
    • Unix는 '/' 로 시작하는 루트 디렉토리가 있고 그 하위에 다른 디렉토리나 불륨이 위치하고 있다.


2. 파티션

파티션이란 불륨 섹터들이 연속적인 것을 말한다. 파티션은 파티션 테이블을 가지고 있다. 파티션을 구성할때는 파티션 테이블 값이 무조건 필요한데, 파티션테이블이 잘못된 값을 가지면 볼륨 레이아웃은 정상적으로 구성되지 않는다.


도스파티션

일반적으로 사용하는 파티션 형식으로 마이크로소프트는 이런 파티션 시스템을 MBR 디스크라고 부른다. 도스파티션은 도스, 윈도우, 리눅스 IA32기반 FreeBSD OpenBSD 시스템에서 사용된다. 도스파티션을 사용하는 디스크는 512Byte 섹터 내의 MBR을 가지고 있다.


※MBR(Master Boot Record) - 운영체제가 어디에, 어떻게 위치해 있는지를 식별하여 컴퓨터의 주기억장치에 적재될 수 있도록 하기위한 정보로서 하드디스크나 디스켓의 첫 번째 섹터(LBA 0)에 저장되어 있다. 


MBR은 아래의 정보가 들어있다.


1. 부트코드


2. 파티션 테이블

        • 파티션 시작 CHS 주소
        • 파티션 마지막 CHS 주소
        • 파티션 시작 LBA 주소
        • 파티션 섹터수
        • 파티션 타입
        • 플래그

3. 시그니처


MBR은 4개의 파티션만 표현할수 있으며 4개의 엔트리를 이용해 파티션드리 할당된 디스크 구조를 표현할 수 있다.


그릠1. 기본 확장 파티션 구조


MBR에서 부트 코드를 실행한 다음 각 파티션 테이블 엔트리에 따라 파티션들을 가리킨다. 


다음은 MBR 레이아웃 구조이다.


그림2. MBR레이아웃과 파티션 테이블 엔트리 구조


첫 446Byte는 어셈블리 부트 코드를 위해 예약 되어있다. 그리고 파티션 테이블은 4개이므로 사용자가 만들수 있는 파티션은 총 4개 밖에 되지 않는다. 하지만 확장파티션을 이용하여 많은 파티션을 구성하는것도 가능하다. 또한 각 파티션 테이블 엔트리마다 그림2와 같이 부팅 플래그, 파티션시작 주소 등등 할당이 되어 있다.


부팅 플래그(default : 0x80)는 OS가 설치되어있으면 부팅 플래그가 필요하며 여러개의 OS를 부팅하는 시스템이라면 사용자가 OS부팅을 선택하므로 부팅플래그가 필요 없다. 


여기까지 도스 파티션!



'Forensic' 카테고리의 다른 글

FAT File System - FAT영역  (0) 2015.01.27
FAT File System - 예약영역  (0) 2015.01.26
하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05

하드디스크의 데이터 수집은 여러가지 방법이있다. 이러한 방법들에 대하여 설명 하겠다.


1. 컨트롤러의 직접 접근

하드디스크의 컨트롤러는 하드디스크와 연결되어 있고 리본케이블(SATA)로 하드디스크에 명령을 내린다. 소프트웨어는 하드디스크 컨트롤러를 통해 디스크 데이터에 접근할 수 있다. 이렇게 하기 위해서는 하드디스크 컨트롤러의 주소지정, 데이터를 읽고 쓰기 위한 명령어 등 세부적인 사항을 알아야 하는 번거로움이 있다.


2. 컨트롤러의 BIOS 접근

BIOS를 통해 디스크 데이터에 접근하게 되면 컨트롤러의 직접 접근법에서 필요한 하드디스크의 모든 세부사항을 소프트웨어가 인식하고 있지 않아도 된다. 소프트웨어가 BIOS 하드디스크 서비스들을 사용하기 위해서는 섹터 주소와 섹터 크기 같은 데이터를 CPU레지스터 내부로 적재하고, 소프트웨어 인터럽트 명령어 0x13(INT13h)를 실행하면 된다.


※INT13h : 데이터를 읽고 쓰기 위한 질의들을 포함하는 명령어


기존의 INT13h의 경우 CHS 방식에서 사용하던 명령어 여서 8.1GB 까지만 읽고 쓸 수 있다. 그래서 LBA방식에는 맞지 않아 '확장 INT13h' 라는 것이 새로 추가 되었다. 


BIOS의 접근법은 BIOS가 확장 INT13h를 사용하지 않고 기존 CHS 방식의 INT13h를 쓸 경우 원래 디스크의 크기가 10GB일 경우 최대 8.1GB로 인식하기 때문에 10GB크기의 디스크지만 결과로는 8.1GB크기를 돌려 줄 것이다. 하지만 직접 접근 법의 경우 BIOS에 상관없이 LBA 형식의 확장 INT13h를 사용하면 결과 값으로 10GB전체를 얻을 수 있다. 그림으로 쉽게 확인해보자.


※CHS 저장 방식 : 실린더, 헤드, 섹터에 번호를 할당해 그 주소를 이용하여 데이터를 찾아 읽고 쓰는 방식. 용량이 커지면서 일반 하드에 쓰이지 않는다. 하지만 임베디드 하드디스크들은 아직 이방식을 사용한다.


※LBA 저장 방식 : CHS방식의 한계로 인해 모든 섹터에 논리적인 고유번호를 할당하여 읽고 쓰는 방식이다.



그림1. BIOS접근법과 직접 접근법


만약 디스크의 모든 내용을 복사하려고 할때 BIOS가 INT13h를 사용할 경우 8.1GB만 복사할 것이기 때문에 BIOS 접근법을 사용한다면 자신의 BIOS가 어떤 INT13h 명령을 사용하는지 알아야 할 것이다.


3. 동적 수집

동적 수집은 분석 대상시스템의 운영체제가 동작하는 상태에서 데이터를 수집하는 것이다. 만약 악의적인 공격이나, 루트킷 등으로 운영체제가 변조될 가능성이 있기 때문에 운영체제를 통해 수집된 데이터가 엉뚱한 데이터 및 증거가 없을 수도 있으므로 신뢰성이 떨어진다.


4. 정적 수집

정적 수집은 이동장치(이동식 디스크 , 외부장치로 인식)로 부팅하여 대상 시스템의 데이터를 수집하는 것을 말한다. 다른 운영체제에서 분석대상의 데이터를 수집 하는 것이므로 분석대상의 운영체제 도움없이 시스템 데이터를 수집하는 것이다. 

그리고 데이터를 수집할때는 HPA영역과 DCO영역도 잊지말고 수집해야 한다.

HPA영역과 DCO영역의 내용은 'http://babu1447.tistory.com/8' 을 참조.

'Forensic' 카테고리의 다른 글

FAT File System - 예약영역  (0) 2015.01.26
볼륨과 파티션-도스파티션  (0) 2015.01.13
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05
PE(Portable Executable)구조 분석-1  (0) 2014.12.25

하드디스크에는 숨김 영역이 존재한다. 사용자의 임의적 설정을 통해 숨김 영역을 설정할 수 있고 하드디스크를 제조할 때부터 숨김영역이 설정 된 상태로 판매하여 사용자가 사용할 수 있다.


이러한 숨김영역은 일반 사용자가 잘 사용 하지 않지만, 공격자들은 숨김영역에 악성코드나 악의적 데이터를 숨길 수 있다. 따라서 분석할 때 고려해야 하는 영역중 하나이다. 하드디스크 덤프를 할때에도 숨김영역까지 덤프를 지원하는지 알아보고 덤프 툴을 사용해야 된다. 숨김영역의 종류로는 HPA와 DCO가 있다.


1. HPA(Host Protected Area)

HPA는 데이터를 저장할 수 있는 영역이지만 일반 사용자가 볼 수 없는 숨겨진 영역이다. 이 영역의 설정은 ATA 명령으로 가능하다.(기본값 = 0) HPA는 ATA-4에서 추가되었으며, 사용자가 하드디스크를 포맷하거나 삭제했을때도 데이터를 보존할 수 있는 영역이다.


 ATA : Advanced Technology Atatchment의 약자로 저장 장치와의 통신을 위하여, 주요 HDD 제조 업체 및 표준제정 집단에서 만들어진 일종의 protocol


HPA는 하드디스크 끝에 위치해 있으며 하드디스크 재설정에 의해서만 접근이 가능하다. HPA는 아래의 두 명령어의 결과값 차이를 보고 존재 유무를 파악할 수 있다.

    • READ_NATIVE_MAX_ADDRESS : 물리적 주소의 최대값을 반환하여 주는 명령어.(HPA의 끝)
    • IDENTIFY_DEVICE : 사용자 영역(HPA 영역의 앞 부분 까지) 끝을 반환하여 주는 명령어.

READ_NATIVE_MAX_ADDRESS - IDENTIFY_DEVICE > 0 이면 HPA가 존재한다고 볼 수있다.

HPA 영역 설정은 SET_MAX_ADDRESS 명령어를 이용한다. 이 명령은 사용자가 접근할 수 있는 최대 주소를 설정한다. HPA 영역 제거는 READ_NATIVE_MAX_ADDRESS의 값을 SET_MAX_ADDRESS의 입력 값으로 넣으면 된다.



그림1. HPA 생성, 삭제


2. DCO(Device Configuration Overlay)

ATA-6 에서 추가된 기능으로 HPA와 동일한 기능을 하는 영역이다. HPA에서 IDENTIFY_DEVICE명령으로 사용자 영역의 끝을 알아볼 수 있었다. 그리고 READ_NATIVE_MAX_ADDRESS 명령으로 물리적 주소의 최대값을 알아내어 HPA의 존재를 알아낼 수 있었다. 하지만 DCO영역은 알아낼 수 없다. 



그림2. DCO 영역 추가된 상태


그림2를 보며 설명하면 명령어들의 내용은 다음과 같다.

    • DEVICE_CONFIGURATION_IDENTIFY : 하드디스크의 전체 크기를 불러오는 명령어 (HPA, DCO 포함)

    • READ_NATIVE_MAX_ADDRESS : HPA가 있는 상태면 HPA 영역의 크기를 불러오는 명령(DCO 제외)

    • IDENTIFY_DEVICE : 하드디스크의 크기를 불러오는 명령(HPA, DCO 제외)

DEVICE_CONFIGURATION_IDENTIFY 명령과 NATIVE_MAX_ADDRESS 명령을 이용하여 DCO영역을 찾을 수 있다. 만약 

DEVICE_CONFIGURATION_IDENTIFY = READ_NATIVE_MAX_ADDRESS = IDENTIFY_DEVICE 이면 숨김영역이 하나도 없다는 것이다.



'Forensic' 카테고리의 다른 글

볼륨과 파티션-도스파티션  (0) 2015.01.13
하드디스크 데이터 수집  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05
PE(Portable Executable)구조 분석-1  (0) 2014.12.25
슬랙공간이란?  (0) 2014.11.26

1. 가상 메모리 정의

가상 메모리란 물리적으로 존재 하지 않는 메모리를 말하며, OS가 만들어낸 논리적인 형태의 메모리를 말한다. 가상 메모리에 저장된 데이터라고 해서 가상으로 저장 되는 것이아니라 실제로는 물리메모리나 하드 디스크에 저장된다. 가상 메모리는 VAS라는 것을 OS로부터 할당 받는다.

※VAS(Virtual Address Space) : 가상 메모리에 할당되는 주소를 말하며 물리메모리 주소와 다른 주소이다.

 32bit 시스템의 경우 4GB 크기의 가상 메모리 영역을 할당 받고, 64bit 시스템의 경우 이론적으로 17EB의 가상 메모리 영역을 할당 받지만 그 영역의 크기가 너무 크고 비효율 적이여서 8TB정도로 제한을 하고 있다. 가상 메모리의 크기는 시스템의 bit수에 따라 정해져 있고 무조건적으로 정해진 크기가 할당된다.

프로세스마다 자신에게 할당된 가상메모리의 영역을 사용하므로 시스템마다 다른 메모리 크기의 한계를 느끼지 않고 실행한다.

가상메모리라고 하면 버퍼오버플로우를 공부하면서 아래와 같이 이해하고 있었다. 

그림1. Windows 98/ME 의 가상 메모리구조

버퍼오버플로우를 공부하면서 가상메모리의 구조라고 공부했던 그림1은 Windows 98/ME 에서 사용자 영역 3GB 커널 영역 1GB로 되어있다. 또한 버퍼오버플로우 공부를 할때 리눅스환경에서 했으므로 리눅스도 포함이 되겠다. 그리고 가상메모리안에 저렇게 꽉 차있는 것이아니라 '코드 영역, 데이터영역, 스택영역 등등'은 매우 작은 공간에 불과하며, 이외에도 많은 영역이 존재한다. 

그림2. 간단한 가상 메모리 구조

그림2 처럼 윈도우 2000계열은 사용자 영역 2GB 커널 영역 2GB로 나누어져 있다. 말했듯이 코드영역 데이터영역 이외의 많은 영역을 가지고 있다.


그림3. 세분화된 가상메모리 구조

아직 나도 세세한 부분은 모르지만 앞으로 공부를 할 예정이다. 

메모리 덤프를 하면 사용자영역에 있는 데이터들은 불완전한 형태로 덤프되는 경우가 있고 커널 영역은 온전한 형태로 덤프가 되는 경우가 있는데 이러한 경우는 가상 메모리에서 사용자 영역에서 데이터가 물리적 메모리와 페이지 파일을 오고 가기 때문이다. 프로세스가 사용하는 데이터가 오랫동안 사용되지 않을 경우 페이지 파일에 저장해두고 필요할 경우 다시 물리적 메모리에 적재해 사용하는 방식 때문에 불완전한 덤프가 된다.

반면에 커널 영역은 시스템에 필요한 데이터들이고 자주 사용되는 데이터이므로 페이지 파일에 저장하지 않고 물리메모리에 저장하기 때문에 온전한 덤프가 된다.

그림4. 두 개의 다른 가상메모리가 물리메모리 참조

같은 주소안에 값을 가지는 두개의 가상 메모리가 물리 메모리에 데이터를 쓸 때 데이터를 덮어씌우지 않는다. 물리 메모리의 다른 주소에 각 각 저장이 되므로 가상메모리의 같은 주소를 사용하더라도 문제가 되지 않는다. 


2. 가상 메모리와 물리적 메모리 사이의 주소 변환

가상메모리의 주소는 32bit 시스템에서 32bit 길이를 갖는다. 가상 주소가 물리주소로 변환 될 때에는 2개의 테이블과 한개의 오프셋을 거쳐 변환된다. 메모리는 페이지라는 단위로 불리는 일정 크기의 단위를 사용하여 물리적 메모리를 관리하는데 가상주소와 물리주소의 맵핑 또한 이 페이지를 기준으로 이루어 진다.


3. 가상주소를 이용해 물리주소 찾기

각각의 페이지는 첫 번째 페이지부터 0번호가 매겨지며, 이 번호를 페이지 프레임 넘버(Page Frame Number)라고 한다. 가상주소의 구조는 다음과 같다.

가상주소 = 페이지 디렉토리 인덱스(10bit) + 페이지 테이블 인덱스(10bit) + 바이트주소 인덱스(12bit) = 32bit


그림5. 가상주소를 이용하여 물리적 주소를 찾는 과정

1. 페이지 디렉터리의 주소를 저장하고 있는 특별한 레지스터인 CR3 레지스터로 부터 값을 읽어와 현재 프로세스의 페이지 디렉터리를 찾는다.

2. 가상 주소의 페이지 디렉터리 인덱스 값으로 부터 1번에서 찾은 페이지 디렉터리의 엔트리를 찾고 그 값을 읽는다 페이지 디렉터리 엔트리에는 페이지 테이블의 주소 정보가 들어가 있다. 

3. 2번에서 찾은 페이지 테이블 인덱스 값으로 페이지 테이블 엔트리를 찾아 그 값을 읽는다. 페이지 테이블 엔트리에는 물리적 주소의 페이지 프레임 주소가 들어있다. 

4. 3번에서 찾은 메모리의 실제 페이지 프레임 주소로 이동한 다음 가상 주소의 마지막 부분에 있는 바이트 인덱스를 이용해서 실제 찾고자 하는 물리적 메모리의 주소로 이동하고 필요한 만큼 데이터를 읽는다.

페이지 디렉터리는 프로세스마다 고유하고 물리적 주소는 KPROCESS 구조 안에 저장 되어있다가 CR3 레지스터로 복사된다. 즉

페이지 디렉터리 주소는 물리적 메모리에 미리 올라가있는 것이라 볼 수 있다. 그리고 나머지 테이블은 필요시 메모리에 적재한다.

여기까지 가상메모리!


'Forensic' 카테고리의 다른 글

하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
PE(Portable Executable)구조 분석-1  (0) 2014.12.25
슬랙공간이란?  (0) 2014.11.26
윈도우 부팅 절차  (0) 2014.11.25

PE(Portable Executable)파일 포맷은 윈도우에 해당하는 파일 포맷으로 .exe, .dll, .cpl, .sys, .scr, .drv, .vxd, .ocx확장자를 가진 파일들에게서 볼 수 있다.

그림1. PE구조 구분


PE구조를 보면 IMAGE로 시작하는 구조체들을 많이 볼 수 있다. 이것은 윈도우에서 실행 파일을 IMAGE라는 명칭으로 대신하기 때문에 이름을 이렇게 지은것이다.


1. DOS 영역

윈도우 실행파일을 DOS모드에서 실행하려고 할때 사용자에게 에러 메시지를 보여주기위해 존재한다. 실제로 윈도우 실행파일을 윈도우에서 실행할 때는 아무런 영향을 주지 않는 부분이다. 


1.1. DOS MZ Header

이 영역은 WinNT.h 헤더파일에 정의되어 있으며, 여기서 중요한 구조체 멤버는 e_magic과 e_lfanew 구조체 멤버이다. 

※e.magic : 이 구조체 멤버는 DOS MZ Header의 맨 앞(PE 파일 맨 앞)을 나타낸다. 16진수 '0x4D, 0x5A' 값을 가지고 아스키 코드로 변환하면 'MZ'라는 값을 가진다. MZ는 도스를 최초로 개발한 Mark Zbikowksi의 이니셜이다.

※e.lfanew : 이 구조체 멤버는 PE파일의 머리인 IMAGE_NT_HEADER를 가리키는 오프셋 값을 가지고 있다.


그림2. e.magic이 가리키는 PE포맷 시작 OFFSET


그림3. notepad.exe의 DOS MZ HEADER 영역


이 두 값(e.magic, e.lfanew)값만 올바르다면 프로그램을 실행하는데 문제가 없다.


1.2. DOS Stub Program

이 부분은 사용자가 DOS 모드에서 윈도우용 실행파일을 실행했을 때 아래와 같은 문구를 출력해주기 위한 코드가 있는 부분이다.

'This Program cannot be run is DOS mode'


그림4. notepad.exe의 DOS Stub Program부분


2. PE Header 영역

PE Header 영역은 PE 파일의 시작 부분이라고 할 수 있다. PE Header 영역에는 그림.1 과 같이 PE File Signature, PE File Header, PE File Optional Header 영역이 있다. PE Header 영역은 IMAGE_NT_HEADERS 구조체로 이루어져 있다.


2.1. PE File Signature

이 영역은 DOS의 e.magic 구조체 멤버처럼 PE영역의 시작을 알리는 값을 가지고 있는 영역이다. 모든 파일에서 그 값은 항상 동일하며 그 값은 'PE/0/0(0x50/0x45/0x00/0x00)'이다. Signature 값도 중요한 정보이니 무시하면 안된다.


그림5. notepad.exe의 PE File Signature


그림.2에서 설명한 DOS MZ HEADER 영역의 e.lfanew 구조체 멤버가 IMAGE_NT_HEADER의 주소를 가지고 있다고 한 내용을 다시한번 기억하자!.


2.2. PE File Header

이 영역은 실행 파일 자체의 메타데이터를 가지고 있으며, 길이는 20바이트이다. 구조체는 IMAGE_FILE _HEADER 구조체를 사용한다.

※메타데이터 : 데이터에 대한 데이터 예를 들면 사진파일의 해상도, 사진크기등등..


그림6. notepad.exe의 IMAGE_FILE_HEADER 부분


각 Description항목들이 무엇을 의미하는지 살펴보자. 이 부분은 IMAGE_FILE_HEADER 구조체 정보와 일치한다.


(1) Machile : 실행 파일이 사용하는 CPU를 나타내는 번호를 가지고 있다. 그림6 에서는 'IMAGE_FILE_MACHINE_i386'이라고  되어 있다. 이 내용을 포함한 다른 목록들을 보자.


그림7. Machine 목록


이 외에도 많지만 나름 생각대로 대표적이라 생각되는 CPU만 작성 하였다.


(2) Number of Sections(NoS) : 실행파일이 가지고 있는 섹션의 개수를 의미한다. 섹션을 삭제, 추가하면 이 구조체의 값도 변경해 주어야 한다. 그림6에서는 4개 인것을 확인 할 수 있다.


(3) Time Data Stamp : 실행파일이 컴파일된 시간. 그림6에서는 '2009/7/13 23:41:03 UTC'의 시간을 나타내고 있다.


(4) Pointer To Symbol Table(PTST) : COFF심볼 파일의 오프셋을 값으로 가지고 있다. 컴파일러에 의해 생성된 OBJ파일이나 디버그 모드로 만들어 져서 COFF 디버그 정보를 가진 PE파일에서만 사용된다. COFF  심볼테이블은 이제 더이상 사용하지 않아  값은 항상 0으로 설정되어야 한다.

※COFF(Common Object File Format) : 공동 개체 파일 Windows NT 실행 파일 (이미지) 파일 및 개체 파일에 대 한 특수 서식. PE포멧이 COFF기반으로 나온것이다. 


(5) Number Of Symbols(NoS) : 심볼 테이블에 있는 엔트리 개수를 나타내며, COFF 심볼테이블은 사용하지 않으므로 0으로 설정되어야 한다.


(6) Size Of Optional Header(SOOH) : Optional Header의 크기르르 값으로 가지고 있다. 이 값은 실행파일에서만 필요하다. 일반적으로 32bit 시스템은 'E0'의 값을 가진다.


(7) Characteristics(Char) : 파일의 속성을 결정한는 값을 가지고 있다. 해당 값은 'http://www.reversecore.com/20'을 참조 하길 바란다.


2.3 Relative Virtual Address(RVA)

실행파일이 프로세스를 만들고 실행파이릐 코드와 데이터가 가상메모리에 올라가게 되면 메모리에 올라오는 지점의 시작주소가 베이스 주소가 된다. Relative Virtual Address는 이 가상 메모리상의 베이스 주소를 기준으로 로드된 실행 파일의 상대적 위치를 나타낸다. 가상메모리에서의 가상주소는 다음과 같다.


가상 주소 = 베이스 주소(Base Address) + Relative Virtual Address


PE 파일상의 오프셋과는 다르다. Relative Virtual Address는 가상 메모리에 올라온 이후의 오프셋 값이다.


'Forensic' 카테고리의 다른 글

하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05
슬랙공간이란?  (0) 2014.11.26
윈도우 부팅 절차  (0) 2014.11.25

컴퓨터를 사용하면서 하드디스크의 속성을 보면 사용중인 공간, 사용 가능한 공간으로 나누어져 있는 것을 있다.

데이터를 디스크에 데이터를 컴퓨터상에서 지우게 되면 하드에 있는 데이터가 지워지는 것이 아니라 데이터가 쓰여진 공간이 사용중인 공간에서 사용 가능한 공간으로 바뀌는 것이다. 따라서 새로운 데이터를 쓰게되면 공간에 새로 덮여 씌워지는 것이다.

이러한 이론을 바탕으로 슬랙공간에 대하여 설명 하겠다. 아주 간단하다.


데이터가 저장되는 공간을 512Bytes 하나의 섹터라고 부른다.

 

data.txt라는 이름의 1024 Bytes 크기를 가진 파일을 디스크에 쓴다고 가정해보자. 크기가 1024 Bytes 이므로 2개의 섹터를 모두 사용 것이다.

그리고 컴퓨터에서 data.txt파일을 지운다. 그러면 다른 데이터가 이공간에 데이터를 덮어씌울 있을 것이다.

 

이제 new.txt라는 이름의 724 Bytes 크기를 가진 파일을 덮어씌운다고 가정해보자. 크기가 724 Bytes 이므로 2개의 섹터를 사용 것이다. 하지만 2번째 섹터의 212 Bytes 까지만 덮여 씌워졌으므로 이전데이터인 data.txt파일의 300 Bytes 남아있게 된다. 이렇게 남은 300 Bytes 공간을 슬랙공간 이라고 말한다. 이렇게 슬랙 공간의 데이터들은 일부일지라도 삭제된 data.txt 데이터를 복구 있게 된다.

여기까지 슬랙공간에 대한 설명이었습니다.

 

'Forensic' 카테고리의 다른 글

하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05
PE(Portable Executable)구조 분석-1  (0) 2014.12.25
윈도우 부팅 절차  (0) 2014.11.25

윈도우 부팅 절차. 일반적으로 전원 버튼을 누르는 것부터 윈도우 운영체제의 쉘인 explorer.exe 가 실행되어 바탕화면이 보이게되는 것 까지 설명 하겠다.

운영체제에 따라서 부팅 절차가 틀리지만 공통적인 부팅절차에 대해서 설명하겠다.



그림1. 공통된 부팅절차

1. ROM BIOS

처음 전원버튼을 누르게 되면 파워는 외부로부터 들어온 전압을 검사하여 사용할 수 있는 전압으로 변환한다. 변환된 전기 흐름은 CPU로 전달되고, CPU의 이전 값들을 지우고 PC(Program Counter)를 초기화한다. 보통 0xF000값을 가진다. 초기화 값(0xF000)은 메인보드에 위치한 ROM BIOS의 부트 프로그램의 주소값을 가르킨다. 

※BIOS - 컴퓨터에 탑재된 프로그램 중에서 하드웨어와 가장 낮은 수준에서 입출력을 담당하는 프로그램.

※ROM BIOS - 말그대로 바이오스가 들어간 롬(ROM)이다.


2. Pre POST(Power On Self-Test 작업 수행을 위한 기본 테스트)

부트 프로그램은 먼저 CPU의 이상 유무를 테스트한다. 그리고 POST작업 수행을 위한 기본 테스트를 수행한다. 테스트 결과가 ROM BIOS에 저장된 값과 일치하면 POST작업을 수행한다.


3. POST - 1단계(시스템 버스 테스트)

CPU는 System Bus가 정상적으로 동작하는지 테스트하기 위해 System Bus로 특정 시그널을 보낸다. 

※System Bus - 중앙처리장치(<CPU> 명령어 실행), 주기억장치(실행중인 프로그램 및 실행에 필요한 데이터를 임시저장하는 곳),                            입출력장치(키보드, 모니터, 하드디스크) 를 연결하는 일을 수행. 종류는 주소버스, 데이터버스, 제어버스 가 있다.


4. POST - 2단계(RTC(Real-Time Clock) 테스트)

RTC는 시스템의 전기적 신호를 동기화 하기 위한 클럭으로 CMOS를 구성하는 장치에 칩의 일부로 존재한다. 

※RTC(Real-Time Clock) - 배터리에 의해 동작하는 시계로서 컴퓨터 메인보드내에 마이크로칩의 일부분으로 포함되어있다.


5. POST - 3단계(시스템 비디오 구성요소 테스트)

시스템 비디오 구성요소 즉, 비디오 메모리(그래픽 카드)등을 테스트한다.


6. POST - 4단계(RAM  테스트)

앞에서 본 단계가 끝났을 경우 RAM에는 ROM BIOS와 비디오 BIOS에서 읽어들인 데이터가 존재 할 것이다. 해당 데이터가 정상적인지 테스트를 한다.


7. POST - 5단계(키보드 테스트)

키보드가 정상 연결되었는지 혹은 눌려진 키가 없는지 테스트한다.


8. POST - 6단계(드라이브 테스트)

시스템에 연결된 모든 드라이브(플로피, CD, 하드디스크 등)에 신호를 보내 정상적으로 작동하는지를 테스트한다.


9. POST - 7단계(POST 결과 검사)

POST 결과가 RTC/NVRAM에 저장된 구성 값과 일치하는지 검사한다.

※NVRAM - 컴퓨터의 외부 전원이 꺼지거나 상실되더라도 내용이 보존되는 RAM이다. 즉, 비휘발성 메모리


10. POST - 8단계(추가적인 BIOS 로드)

추가적인 BIOS(SCSI BIOS 등)가 있을 경우, 해당 BIOS를 RAM으로 로드한다.

※SCSI(Small Computer System Interface) BIOS - 컴퓨터에 주변기기을 연결할 때 사용하는 BIOS

11. MBR 로드 후 부팅 가능한 파티션 검색

부트 프로그램은 운영체제 로드를 위해 BIOS에 설정된 첫 번째 부팅 장치(하드디스크, USB 등)에서 첫 번재 섹터(MBR)를 로드한다. MBR의 파티션 테이블에서 부팅 가능한 파티션을 검색한 후 부팅 가능한 파티션의 VBR(Volume Boot Record)로 점프한다.

※MBR(Master Boot Record) - 운영체제가 어디에, 어떻게 위치해 있는지를 식별하여 컴퓨터의 주기억장치에 적재될 수 있도록 하기                                              위한 정보로서 하드디스크나 디스켓의 첫 번째 섹터(LBA 0)에 저장되어 있다. 

※VBR(Volume Boot Record) - 부팅 가능한 파티션의 첫 번째 섹터이다. MBR에서 점프한 후 VBR에서는 운영체제에서 정의된 부팅과                                             정이 수행된다. 볼륨당 하나의 운영체제 부팅이 가능하다.


여기까지가 일반적인 윈도우 운영체제의 공통된 부팅 순서이다. 다음은 일반적으로 많이 사용하는 윈도우 NT/2000/XP의 이후 과정을 설명하겠다.


Windows NT/2000/XP (VBR 로드 이후)

1. NTLDR

VBR의 2번째 섹터의 NT Loader(NTLDR)의 위치 정보를 읽어 NTLDR을 로드하고 파일시스템을 초기화 한다. BOOT.INI파일을 읽어 부트 초기화 설정 및 부트 메뉴(시작시 F8)를 설정한다. 듀얼 부팅일 경우 BOOTSECT.DOS를 수행한다.

※NT Loader - 윈도우 NT계열 운영 체제를 위한 시동 로더 보통 하드디스크에서 실행되지만 CD-ROM, USB에서도 실행가능 하다.


2. NTDETECT

NTLDR은 하드웨어 탐지를 위해 NTDETECT.COM을 로드하여 설치된 하드웨어와 관련 구성 파일들을 찾아 실행하도록 한다.


3. NTOSKRNL

NTDETECT에 의해 하드웨어 구성 선택이 완료되면 NTLDR에 의해 NTOSKRNL.EXE(NT OS Kernel)를 로드한다. NTOSKRNL.EXE는 커널, DLL, 시스템 레지스트리, 드라이버, TCP/IP등을 로드한다. 이 단계에서 그래픽 모드로 화면에 보여준다. 


4. SMSS

기본적인 초기화가 완료되면 Session Manager(SMSS.EXE)를 로드한다. 추가적인 레지스트리, Win32 subsystem을 수행하기 위한 환경구성 정보를 로드한다. 


5. WINLOGON

WINLOGON.EXE파일을 로드한다. 로그인 화면이 뜨게된다. 로그인 과정에서 Plug and play에 의해 새로운 장치가 발견되면 DRIVER.CAB 파일에서 관련 드라이버를 로드하여 해당 장치를 마운트한다. 


위의 과정이 끝나면 원도우의 쉘인 explore.exe가 실행된 화면을 볼 수 있다.



그림2. 윈도우 NT/2000/XP의 부팅 절차


'Forensic' 카테고리의 다른 글

하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05
PE(Portable Executable)구조 분석-1  (0) 2014.12.25
슬랙공간이란?  (0) 2014.11.26

+ Recent posts