리틀엔디언
- 작은 바이트부터 메모리에 저장하는 방식
ex) 0x01234567를 메모리에 저장한다고 하면
메모리 주소 | 0x100 | 0x101 | 0x102 | 0x103 |
16진수 | 0x67 | 0x45 | 0x23 | 0x01 |
2진수 | 0110 0111 | 0100 0101 | 0010 0011 | 0000 0001 |
NTFS 환경 리틀엔디언 실습
VBR(Volumne Boot Record)
- 0x0B ~ 0x0C(2byte): Bytes per sector
- 0x0D ~ 0x0D(1byte): Sectors per cluster
- 0x1C ~ 0x1F(4byte): Hidden sectors
- 0x28 ~ 0x2F(8byte): Total sectors
분석
Bytes per sector: 0x20
Sectors per cluster: 0x08
Hidden sectors: 0x3A8
Total sectors: 0x3A1E246F
단 File Signature는 리틀 엔디언 형식이 아닌 빅 엔디언 형식으로 읽어야 함
Encoding
데이터를 특정한 규칙에 따라 특정한 형식으로 변환하는 것
ASCII, Base64, URL... 등이 있다
ASCII
특징
1. ASCII 테이블에 따라 값을 문자로 변환하는 인코딩 방식
2. 128개의 문자와 특수문자를 0x00 ~ 0x7F(0 ~ 127)의 숫자로 매핑하는 테이블을 의미
3. 숫자, 영어(대,소문자), 특수문자들로 구성
Base64
바이너리 데이터를 미리 지정된 64개의 문자를 이용해 표현하는 인코딩 기법
원본에 비해 데이터 길이가 길어지는 특징이 있다
인코딩에 사용되는 문자열을 다음과 같다
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
이러한 형태로 인코딩된 데이터라면 Base64로 인코딩 되었을 가능성을 의심해봐야할 것
파일 시스템
파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제
파티션
저장 장치(디스크)내의 공간을 분리해 독립적인 공간을 만든 것
볼륨
하나의 저장 공간을 의미, 자세한 의미는 파일시스템을 갖춘 저장 공간을 지칭
볼륨과 파티션은 서로 혼용해서 사용
파일 시스템 종류
운영체제 | 파일시스템 | 특징 |
Windows | NTFS | |
ReFS | NTFS 대체 차세대 파일시스템 | |
Linux | EXT4 | |
Unix | UFS |
디지털 포렌식에서 파일 시스템 파악이 중요한 이유
1. 파일시스템에 대한 정보 없이는 데이터 저장 위치를 파악하는 것이 어려움
- 삭제된 파일을 복구하는 것을 파일 카빙(File Carving)기술이 요구
- 파일 카빙이란 파일 시그니처와 같은 구조적 특성을 이용해 메타데이터 없이 원본 파일을 복원하는 기법
2. 데이터의 위치를 알아냈다 하더라도, 메타데이터를 알아내기 위해서는 파일시스템 구조에 대한 이해가 필요
3. 파일시스템을 이해한다면 파일의 변경 이력 혹은 삭제된 파일을 복구하는 것이 가능
MBR과 VBR
MBR(Master Boot Record): 디스크의 가장 첫 섹터에 저장되는 데이터
섹터는 디스크의 최소 기억 단위이며 512byte
VBR(Volume Boot Record): 볼륨의 가장 첫 섹터에 저장되는 데이터
파일시스템과 클러스터의 크기에 따라 달라질 수 있음
MBR과 VBR의 역할
컴퓨터의 부팅 과정에서 사용되는 데이터
BIOS가 시작될때 기본적인 하드웨어 점검을 마치면 MBR내의 부트 코드를 호출 가능
MBR은 저장 장치의 파티션 정보, 각 파티션에 설치된 볼륨의 정보를 가지고 있음
이름 | 오프셋 | 설명 |
부트 코드 | 0x0 - 0x1BD | 부팅 과정에서 이용되는 코드 |
파티션 테이블 엔트리 #1 | 0x1BE - 0x1CD | 1번 파티션에 대한 파티션 정보 |
파티션 테이블 엔트리 #2 | 0x1CE - 0x1DD | 2번 파티션에 대한 파티션 정보 |
파티션 테이블 엔트리 #3 | 0x1DE - 0x1ED | 3번 파티션에 대한 파티션 정보 |
파티션 테이블 엔트리#4 | 0x1EE - 0x1FD | 4번 파티션에 대한 파티션 정보 |
시그니처 | 0x1FE - 0x1FF | 고정값 0x55 0xAA |
이름 | 오프셋 | 설명 |
부트 플래그 | 0x0 - 0x0(1 byte) | 부팅 불가(0x00), 부팅 가능(0x80) |
CHS 시작 주소 | 0x1 - 0x3(3 byte) | CHS 방식 기반 시작 주소(섹터) |
파일 시스템 타입 | 0x4 - 0x4(1 byte) | NTFS(0x07), FAT32(0x0C) |
CHS 끝 주소 | 0x5 - 0x7(3 byte) | CHS 방식 기반 끝 주소(섹터) |
LBA 시작 주소 | 0x8 - 0xB(4 byte) | LBA 방식 기반 시작 주소(섹터) |
파티션 총 섹터 개수 | 0xC - 0xF(4 byte) | 섹터 개수 * 512 = 섹터의 크기 |
LBA(Logical Block Addressing)
물리적 시작 주소: 0x800 * 0x200(sector size) = 0x100000
FAT32
FAT(File Allocation Table)은 파일이 저장되는 위치를 기록한 테이블
- Reserved Area: VBR, 볼륨 전체의 설정 값들을 저장하는 여역
- FAT Area: 2개의 FAT 테이블이 저장되는 영역
- DATA Area: 실제 파일이나 폴더가 위치하는 영역
Reserved Area
- 32개의 섹터로 구성
- Boot Sector, FSINFO, Boot Strap으로 구성
Boot Sector: 0번 섹터(원본), 6번 섹터(백업)
FSINFO: 1번 섹터(원본), 7번 섹터(백업)
Boot Strap: 2번 섹터(원본), 8번 섹터(백업)
Reserved Area: 나머지 섹터들이며 주로 비어있음
포렌식 관점에서 주요한 데이터들은 Boot Sector에 위치하고 있음
FAT32 Boot Sector 구조
이름 | 오프셋 | 설명 |
Jump Command | 0x0 - 0x2 | 부트 코드로 점프 |
BPB(Bios Parameter Block) | 0x3 - 0x5A | 볼륨의 전반적인 설정을 포함 |
부트 코드 | 0x5B - 0x1FD | 볼륨 부트 코드 |
시그니처 | 0x1FE - 0x1FF | 고정값 0x55 0xAA |
BPB(Bios Parameter Block) 구조 분석
- OEM ID: MSDOS5.0
- FAT32의 경우 MSDOS5.0으로 fix
- Reserved Sector: 0xD60
- FAT 영역 이전에 존재하는 섹터 수, FAT Area가 시작되는 오프셋을 의미
- FAT Area: 0xD60 * 0x200(sector size: 512byte) = 0x1AC000
- Total Sector 32: 0x3956FE0
- 볼륨의 총 섹터 수
- FAT Size 32: 0x3950
- FAT Area 1개의 크기, 크기는 0x3950 * 0x200 = 0x72A000
- Volume Serial Number: 0xEC590A1D
- 볼륨 식별자
- File System Type: 0x332020203233544146
- FAT32
FAT Area
FAT Area는 FAT Table 2개가 연속으로 존재하는 영역(1개 원본, 1개 백업)
FAT Table은 FAT 파일시스템에 존재하는 파일 및 폴더에 대한 메타데이터를 저장하는 공간으로 중요 영역
각 엔트리는 Data Area의 할당 상태를 의미
각 엔트리는 4byte이고 Data Area의 클러스터 크기는 0x1000byte의 크기를 가짐
Data Area
Data Area Offest: VBR offest + Reserved Sector * Sector Size + FAT Size * Sector Size * 2
0 + 0xD60 * 0x200 + 0x3950 * 0x200 * 2 = 0x100 0000
0x1000000에 FAT32의 Root Directory가 위치한다
먼저 VBR로부터 Reserved Sector 필드를 읽어 FAT Area 위치를 찾고, FAT Size 필드를 읽어 Data Area 위치를 찾아낼 수 있습니다. 이후에는 FAT Area의 각 엔트리를 통해 각 엔트리의 할당 여부를 확인할 수 있습니다. 또한 Data Area에서는 Root Directory로부터 모든 파일/폴더의 이름, 확장자, 생성/수정/접근 시간, 그리고 파일의 데이터까지 읽어낼 수 있습니다.
출처:) Dreamhack.io
Root Directory는 2번 클러스터에 해당되며, FAT Table 2번에 대응된다
그리고 Directory Entry의 구조가 반복되면서 저장됨
- Name: TEST
- Extentsion : TXT
- First Cluster: 0x6
- File Size: 0x1C1
즉 원본 데이터는 0x6에서 확인할 수 있음. Root Directory가 2번 클러스터에 있으니 현재 클러스터에서 4개의 클러스터 이후에 원본 데이터를 확인할 수 있다.
원본 데이터: Root Directory(0x1000000) + Cluster size(0x1000) * 4 = 0x1004000
'공부 > Forensic' 카테고리의 다른 글
파일 시그니처(File Signature), 메모리 덤프(Memory Dump) (0) | 2025.01.19 |
---|---|
NTFS 파일 시스템 (0) | 2025.01.19 |
Volatility Tool 사용 (0) | 2024.07.10 |