ext4_image1.001 이미지를 HxD 프로그램으로 분석하고 파일을 추출해보자.

 

 

1. HxD 프로그램 열기

[도구] - [디스크 이미지 열기] - [ext4_image1.001 파일 선택]

디스크 이미지 열기를 하면 섹터 (512byte) 단위로 분석할 수 있다.

 

 

2. MBR 분석

MBR이란 저장 매체(물리 디스크)의 첫 번째 섹터에 위치하며 512Byte의 크기이다.

맨 마지막 2byte 가 MBR signature 부분이다. 

MBR signature = 0x55AA

 

연두색 네모 부분이 다음과 같은 구조를 가진다.

 

• Part type

    -  0x83 --> Linux native file system (ex2fs/xiafs)

 

• LBA 시작주소 (Starting LBA Addr)

   - 실제 파티션이 시작되는 섹터의 위치

   - 주소계산 할 때 사용

   - 0x00000800 = 2048 (Little Endian)

 

 

3. Super Block

LBA 시작주소인 섹터 2048이 Superblock의 주소이다.

 

[ 섹터 2048, 2049 ]

섹터 2048, 2049는 다음과 같이 0패딩이 되어있어 0으로 채워져 있다.

 

 

[ 섹터 2050 ~ ] 

 

superblock은 총 1024byte로 실제 사용하는 영역은 상위 264byte이고 나머지 하위 영역은 예약된 영역이다.

아래와 같은 구조를 가진다.

•  Log Block Size

  - 블록의 크기 지정

  - 0 : 1KB, 1 : 2KB, 2 : 4KB

  - 0x02 = 2 --> 블록 크기는 4KB이다.

 

•  Block Per Group

  - 각 블록 그룹에 속한 블록 개수

  - 0x8000 = 32768

 

•  Inode Per Group

  - 각 블록 그룹에 속한 아이노드 개수

  - 0x1FF0 = 8176

 

•  Magic Signature

  - 슈퍼블록의 시그니처

  - 0x53EF

 

Super Block은 총 1block의 크기를 지닌다. 

블록의 크기가 4KB이므로 SuperBlock은 8sector의 크기이다. (1KB = 1024byte) 

 

• Boot Sector 영역 (0패딩) = 2sector

• Superblock의 실제 영역 = 2sector

• unused 영역 = 4sector

따라서 Group Descriptor Table 영역 시작 주소는 섹터 2056이다.

 

 

4. Group Descriptor Table

Group Descriptor Table 시작 주소인 섹터 2056으로 이동하자.

연두색 네모 부분이 다음과 같은 구조를 가진다.

맨 처음 32byte 부분이 0번 블록그룹 정보이다.

그 다음도 32byte씩 1번, 2번 등등의 블록그룹 정보가 저장되어 있다.

0번 블록그룹 정보를 자세히 살펴보자.

 

 Block Bitmap 시작 주소 ( Starting Block Address of Block Bitmap )

  - 0x0396 = 918

  - 섹터단위 주소계산

                 = Block Bitmap 시작 주소 x 1 block 크기 + LBA 시작주소

                 = ( 918 x 8 ) + 2048 = 9392

 

 Inode Bitmap 시작주소

  - 0x03A6 = 934

  - 섹터단위 주소계산 = ( 934 x 8 ) + 2048 = 9520

 

 Inode Table 시작주소

  - 0x03B6 = 950

  - 섹터단위 주소계산 = ( 950 x 8 ) + 2048 = 9648

 

 

5. Block Bitmap

Block Bitmap 시작 주소인 섹터 9392로 이동하자.

Block Bitmap은 블록의 사용 현황을 Bit로 표현하여 나타낸 것이다.

 

ex) 0xFF = 0b1111 1111

            --> 1의 개수 = 8

            --> 8개 블록 사용중

 

 오프셋 496000 ~ 496474 : 0xFF로 채워져 있다.

                          --> 8 * ( 16 * 47 + 5 ) = 5056

 오프셋 496475 : 0x0F

                          --> 4

   

                          --> 5056 + 4 = 6060

 

 블록현황 : 6060개 블록 사용 중

 

 

6. Inode Bitmap

Inode Bitmap 시작 주소인 섹터 9520으로 이동하자.

Inode Bitmap은 아이노드의 사용 현황을 Bit로 표현하여 나타낸 것이다.

 0xFFFF = 0b 1111 1111 1111 1111

 아이노드 현황 : 16개 아이노드 사용 중

 

 

7. Inode Table

Inode Table 시작 주소인 섹터 9648으로 이동하자.

Inode 크기 = 256byte

한 섹터 당 두개의 Inode를 지니고 있다.

Inode 2번이 Root Directory이다. 

따라서 Inode 2번을 자세히 살펴보자.

 

 

[ Inode 2번 ]

Inode의 구조는 다음과 같다.

 

 Direct Pointer

   - 파일의 내용이 들어있는 블록의 번호 기록

   - 루트 디렉토리의 포인터

   - 0x23A6 = 9126

   - 섹터주소 계산 : ( 9126 * 8 ) + 2048 = 75056

 

 

8. Directory Entry

Director Entry 구조는 다음과 같다.

 

다음과 같이 lost+found 디렉토리 1개와 KAKAO.jpeg, TEST_FILE, apeach.png, kakao_apeach.png, toystory.jpeg 파일 5개가 이미지 안에 저장되어 있는 것을 알 수 있다.

 

먼저 KAKAO.jpeg 파일을 추출하기 위해 아이노드 12번을 자세히 살펴보자.

 

 

8.1. KAKAO.jpeg

Inode 1번이 섹터 9648이므로 Inode 11번은 섹터 9653이다.

 

[ 아이노드 12번 ] 

 Direct Pointer : 0x8396 = 33686

 주소 계산 : ( 33686 * 8 ) + 2048 = 271536

 

 

KAKAO.jpeg 정보가 저장되어 있는 섹터 271536로 이동하자.

 

 JPEG 파일

   - 헤더 시그니처 : FF D8 FF E0 --> 오프셋 : 8496000

   - 푸터 시그니처 : FF D9 --> 오프셋 : 849CC99

 

1) [편집] - [블록단위 선택]  :  오프셋 8496000 부터 오프셋 849CC99 까지 블록선택을 하고 복사를 한다.

2) [파일] - [새로 만들기]  :  새로운 창에 복사한 값을 붙여넣기 삽입한다.

3) KAKAO.jpeg로 저장한다.

 

KAKAO.jpeg 파일을 열어보면 다음과 같은 사진을 볼 수 있다.

 

 

8.2. TEST_FILE

[ 아이노드 13번 ]

 Direct Pointer : 0x839D = 33693

 섹터 주소 계산 : ( 33693 * 8 ) + 2048 = 271592

 

TEST_FILE 정보가 저장되어 있는 섹터 271592로 이동하자.

2020 FaS filesystem!!!! 라고 저장되어 있는 것을 볼 수 있다.

 

 

8.3. apeach.png

[ 아이노드 14번 ]

파일 사이즈가 0으로 파일을 찾을 수 없다.

 

 

8.4. kakao_apeach.png

[ 아이노드 15번 ]

 Direct Pointer : 0x839E = 33694

 섹터 주소 계산 : ( 33694 * 8 ) + 2048 = 271600

 

kakao_apeach.png 정보가 저장되어 있는 섹터 271600으로 이동하자.

 PNG 파일

   - 헤더 시그니처 : 89 50 4E 47 0D 0A 1A 0A --> 오프셋 : 849E000

   - 푸터 시그니처 : 49 45 4E 44 AE 42 60 82 --> 오프셋 : 855B23F

 

1) [편집] - [블록단위 선택]  :  오프셋 849E000 부터 오프셋 855B23F 까지 블록선택을 하고 복사를 한다.

2) [파일] - [새로 만들기]  :  새로운 창에 복사한 값을 붙여넣기 삽입한다.

3) kakao_apeach.png로 저장한다.

 

kakao_apeach.png 파일을 열어보면 다음과 같은 사진을 볼 수 있다.

 

 

8.5. toystory.jpeg

[ 아이노드 16번 ]

 Direct Pointer : 0x845C = 33884

 주소 계산 : ( 33884 * 8 ) + 2048 = 273120

 

toystory.jpeg 정보가 저장되어 있는 섹터 273120로 이동하자.

 JPEG 파일

   - 헤더 시그니처 : FF D8 FF E0 --> 오프셋 : 8496000

   - 푸터 시그니처 : FF D9 --> 오프셋 : 849CC99

 

1) [편집] - [블록단위 선택]  :  오프셋 849E000 부터 오프셋 855B23F 까지 블록선택을 하고 복사를 한다.

2) [파일] - [새로 만들기]  :  새로운 창에 복사한 값을 붙여넣기 삽입한다.

3) toystory.jpeg로 저장한다.

 

toystory.jpeg 파일을 열어보면 다음과 같은 사진을 볼 수 있다.

 

 

9. 총 정리

따라서 ext4_image1.001의 디렉터리 구조는 다음과 같다.

 

+ Recent posts