Thursday, December 27, 2018

FAT 32의 구조와 이해

FAT 32


# BR(Boot Record)= PBR(Partition Boot Record)= VBR(Volume Boot Record)

 File Allocation Table(파일 배치 표)

  • 파일 내용이 저장되어 있는 클러스터 번호를 적는 곳이다.
  • 4Byte 로 나누어져 있다
  • FAT의 위치
    • 첫번째 FAT는 Reserved Sector 바로 뒤에 이어진다.
    • 두번째 FAT는 첫번째 FAT 바로 뒤에 이어진다.



  • FAT파일 시스템의 구조 정보와 부트 스트랩 코드
  • 파티션의 첫번째 섹터에 기록된다.
  • Jump Boot Code
    • Boot Strap Code 부분으로 점프하기 위한 기계어 코드
  • Boot Strap Code
    • Windows NT계열인 경우에 루트디렉토리에서 NTLDR이라는 파일을 찾아서 실행시킨다.
  • OEM Name
    • 파일 시스템을 생성한 프로그램이 기록한다.
  • Bytes Per Sector
    • 섹터 크기 : 보통 512 Bytes  = 0x200
  • Sector Per Cluster
    • 클러스터란?
      • 섹터의 모음
    • 읽고 쓰기 명령의 효율성을 위해서 여러개의 섹터를 하나의 클러스터로 처리한다.
      • 파일을 읽고 쓰는 최소 단위가 클러스터이다.
      • 단점: 파일의 내용이 1바이트라도 클러스터 1개를 사용한다.(공간 낭비 심함)
    • 가장 많이 사용하는 클러스터 크기는 4KB(4096 Bytes)(섹터 8개)
  • SP개수
    • Sector Per Cluster(섹터의 모음)
  • FAT(File Allocation Table)
    • 파일의 내용이 저장된 Cluster의 번호를 기록한 표 (파일 할당표)
  • Total Sector 16
    • 파티션의 전체 sector 개수
  • - Reserved Sector count
    • 예약된 섹터의 개수를 의미
    • 파일 시스템에서 추가로 필요한 정보를 적기 위해서 필요한 공간을 예약해두고 사용한다.
    • 파티션의 첫번째 섹터부터 몇개의 섹터를 예약한 것인지를 의미
    • PBR/FSInfo 구조체/PBR Backup
  • FAT count(개수)
    • FAT의 개수
    • FAT 손상되면 파일 내용을 읽을 수 없게 되므로 FAT를 여러 개 사용한다.
  • FAT Size 32
    • FAT 의 크기를 섹터 개수로 표현
  • Total Sector 32
    • 파티션의 전체 섹터 개수
    • 2^32=4294967296 => 4294967296 * 512 Byte = 2TB
  • File System Information (Fsinfo 구조체)
    • File System Information 구조체의 위치(섹터번호, 상대값)
  • BR Backup Sector
    • BR이 백업된 섹터 번호
    • PBR이 기준이 된다.( PBR을 0번으로 가정하고 계산해라)
  • Root Directory Cluster
    • Root Directory가 있는 첫번째 클러스터 번호
    • 보통 2번으로 나온다. --> 하지만 실제로 2번이 첫번째 클러스터이다.
  • Volume Label
    • 볼륨(파티션)의 이름 (단순 문자열)
  • File System Type
    • 파티션(볼륨)의 파일시스템 종류(단순 문자열)

 Partition Table Entry 구조




  • Bootable Flag
    • 부팅가능여부, 부팅가능(0x80), 부팅불가(0x00)
  • Starting CHS Address
    • CHS 방식으로 파티션의 시작 섹터의 위치 지정, Starting LBA Address항목을 주로 사용하므로 이 필드는 설정하지 않아도 크게 상관없다.
  • Partition Type
    • 파티션의 종류를 표시, 대표적인 타입은 아래 표를 참고한다.
    • 파티션 타입   설명
      • 0x00   비어있음
      • 0x05  
      • 0x06   FAT16
      • 0x07   NTFS
      • 0x0C   FAT32
      • 0x0F   Extended Partition
      • 0x82   Linux Swap Partition
      • 0x83   Linux Partition
  • Ending CHS Address
    • CHS 방식으로 파티션의 마지막 섹터의 위치 지정
  • Starting LBA Address
    • LBA 방식으로 파티션의 시작섹터의 번호 지정, 섹터번호는 0번부터 시작함. (주의)
  • Size in Sector
    • 파티션의 용량을 섹터의 개수로 표현(LBA방식)



FAT32 구조


  • Root Directory


    • 루트 디렉토리의 위치는 마지막 FAT 바로 뒤에서 시작한다.
    • PBR에 Root Directory의 시작 클러스터 번호가 적혀 있다.




  • File System Information
    • 파일 시스템의 사용 현황을 적는 공간



M.A.C Time
Modified Date/Time- 마지막으로 변경된 날짜/시간
Accessed Date/Time- 마지막으로 읽은 날짜/시간
Created Date/Time - 최초 생성 날짜/시간
시간정보가 있어야 Time Line Analysis ; 기준시간 + 지나간 시간




  • Directory Entry

    • 디렉토리에 들어있는 파일이나 하위 디렉토리에 대한 정보를 적는 항목
    • 크기는 32 Byte(1줄에 16byte)
    • Name : 이름
      • 8 bytes (영문 8글자, 한글 4글자)
      • 이름의 첫번째 바이트가 0xE5이면 삭제되었다는 표시임.
      • 짧게 수정할 경우,  탐색기에서 읽는게 불가능
    • Extender : 확장자
      • 3 Bytes (영문 3글자)
    • Attributes : 파일 속성
      • 0x01 Read Only 읽기 전용 파일 속성
      • 0x02 Hidden 숨김 파일 속성
      • 0x04 System 운영체제 파일 속성
      • 0x08 Volume Label 볼륨의 이름. 루트 디렉토리에 한 개만 허용된다. 이 속성이 설정되면 First Cluster High/Low 항목이 0이 된다. 볼륨의 이름을 나타내므로 클러스터를 사용할 일이 없기 때문이다.)
      • 0x10 Directory 디렉토리임을 나타낸다.
      • 0x20 Archive 기록문서 속성. 백업할 때 주로 사용된다.
      • 0x0F Long File Name Entry 일반 Directory Entry가 아니라 LFN Entry임을 나타낸다


    • File Size : 파일 크기(Byte)
    • First Cluster Low/High : 파일 내용이 들어 있는 첫번째 클러스터의 번호
    • 루트 디렉토리의 첫번째 Entry는 다른목적으로 사용된다.
      • 볼륨의 이름


  • 파일 조각화

    • File Fragmentation
    • 파일의 내용이 클러스터 한개 이상을 필요로 하는 경우에 다음 클러스터를 배정하는 것이 원칙이나 다음 클러스터를 다른 파일이나 디렉토리가 사용하고 있으면 그 다음 클러스터를 사용해야 한다.
    • 파일 조각 모음
      • File Defragmentation
      • 헤드의 움직임을 최소화 하여 읽기 성능을 높이기 위한 작업
        • 파일내용이 쭉 이어져 있으라고..그래야 빨리 읽음
    • 대부분의 운영체제와 파일시스템은 파일이 조각나는 것을 고려해서 만들어졌다.
      • FAT32 방식은 FAT(File Allocation Table)을 사용해서 조각나서 저장된 파일을 정확하게 읽을 수 있도록 설계됐다.


  • Slack Space

    • 파일을 저장할 때 클러스터 단위로 할당이 되므로 아무리 적은 데이터를 저장해도 클러스터 하나를 사용해야 한다. 데이터가 저장되고 남은 공간은 다른 파일의 내용을 저장하는데 사용할 수 없다.
    • 클러스터의 크기가 커지면 낭비되는 공간(Cluster Slack)이 증가한다
      • 윈도우즈에서는 32GB를 넘어가는 볼륨을 FAT32로 포맷하는 것을 지원하지 않음

  • High Level Format 된 경우 데이터 복구

    • 사용하던 파일시스템을 다시 포맷할 경우
      • FAT 초기화
        • 조각난 파일은 첫번째 클러스터 내용만 찾을 수 있다.(directory Entry를 보고)
      • 루트 디렉토리 초기화
        • 루트 디렉토리에 있던 파일은 파일이름과 첫번째 클러스터 번호가 없어졌기 때문에 아무것도 찾을 수 없다.
        • 하지만 하위 디렉터리에 있던 파일들은 복구가 가능하다.
    • 디렉토리 엔트리 O  & 파일 크기가 클러스터 1개 크기보다 작은 경우
      • 시작 클러스터 번호와 파일 크기를 읽어서 복구(복구율 100%)
    • 디렉토리 엔트리 O & 파일 크기가 클러스터 1개 크기보다 큰 경우
      • 첫번째 클러스터 내용을 분석(파일의 종류, 파일의 다음 내용을 유추)



[ 참고 ]

[ 하드디스크 파티션 모음의 구조 ]



[실습] 

WINDOWS 7, HDD 읽어보기

순차적으로 읽으며 훑어보기



LBA Start Addr. = 0x800



만들어진 하드디스크 확인




LBA Start Addr. = 0x800 = 2048
     ->BR주소의 시작점
FAT Size 32 : 0x27f2=10226
RS개수 : 0x101c=4124


 eX.=EB5890
: MBR의부트스트랩코드가 BR의 부트스트랩코드로 넘어가는 과정





[ 위의 내용을 도면화하면 한눈에 확인하기 쉬움 ]



[ FAT의 마지막 섹터 ]
$RECYCLEBIN 의 값으로 아래표랑 대조




[ 파일 시스템 정보 ]


[ Cluster 정보 ]





  • LFN(Long File Name)


    • 파일 이름이 8글자(8 Byte)를 넘어가면 Directory Entry로는 이름을 기록할 공간이 없기 때문에 LFN Entry를 사용하여 긴 이름을 추가로 기록한다.

    • LFN Directory Entry

      • 이름만 기록하는 공간
      • 엔트리 한개의 크기는 32 바이트
      • 이름을 유니코드로 기록한다.(1글자에 2바이트가 필요하다.)
      • .(점) 표시도 파일이름 길이로 계산한다.
      • 이름과 확장자 구분을 하지 않는다. 
        • 확장자 길이가 3글자 제한이 없어진다.
      • .을 여러번 사용할 수 있다. 
        • 마지막 점(.) 뒷부분을 확장자로 인식한다.
      • LFN 엔트리 한개에는 이름을 점(.)과 확장자를 포함하여 총 26 바이트 기록할수 있다.
        • 13글자 기록가능
        • 13글자를 넘으면 LFN 엔트리를 추가로 사용하여 기록한다.
        • LFN 엔트리의 첫번째 바이트에 순서번호가 기록되어 있다.
        • 마지막 엔트리는 0x40이 추가된다.
    • 이름이 8.3규격을 벗어나면 LFN엔트리에 4파일이름을 기록하는데 기존의Directory Entry의 이름을 적는 부분에는 6글자(6바이트)만  기록하고 ~(숫자)형태로 기록한다.

  • 실습

    • 파일명 abcdefgh.txt -> 8.3 일치
      • Directory Entry만  사용
    • 파일명 abcdefghi.txt  -> 8.3 넘음, 13글자 넘지 않음
      • Directory Entry 와 LFN Entry 1개 추가 사용
    • 파일명 abcdefghijkl.txt -> 8.3 넘음 , 13글자 넘음
      • Directory Entry 와 LFN Entry 2개 추가 사용



[ 실습 ]


  • 파일이름이 13자인 경우
    • abcdefghi.txt라는 이름으로 파일설정
    • 2개의 행을 사용함





  • 파일이름이 16자인 경우
    • abcdefghijkl.txt라는 이름으로 파일설정
    • 4개의 행을 사용함




   - 같은 이름으로 시작해서 ABCDEF~1TXT로 구별
   - 확장될 때 마지막 Entry는 0x40으로 시작(42)
   - 00으로 끝맺음을하고 FF로 채움


  •  FAT 구조


    • 4 Byte 단위로 엔트리 구성된다.
    • 엔트리 번호는 따로 적혀 있지 않지만 0번 부터 시작
    • FAT 엔트리는 번호가 같은 클러스터의 상태를 나타낸다.
    • 0,1번 엔트리는 실제 클러스터를 가리키지 않고 특수 목적으로 사용된다.
    • FAT 엔트리의 값이
      • 0x00000000
        • 클러스터가 사용되지 않고 있다.
      • 0x0FFFFFFF 
        • 클러스터에 파일의 내용이 들어 있다. 그리고 파일의 마지막 클러스터
      • 0x???????? 
        • 클러스터에 파일의 내용이 들어 있다. 그리고 ????????번호에 해당하는 FAT 엔트리에 가서 파일 내용이 들어 있는 클러스터를 더 찾아보기 

*FAT의 Entry 에 Cluster의 상태표시
0,1,2,3/4,5,6,7,8Enrty(2번Entry부터시작)->2



*7번 클러스터>>FAT마지막섹터(26624)+16*5



클러스터의 내용과 메모장의 내용이 일치함




[실습] 

shift+del로 삭제하고 내용 복구


[ 파일 위치확인 ]

26624+16*(10-2)
RootDirectory + SPCluster*from 2nd cluster to 10th cluster



0A cluster에 내용있음 (FFFFFF0F)





내용확인됨



8kb가 넘으면 다음 클러스터로



파일을 삭제해서 E5로 표시됨



[E5 : 삭제된 파일 ]
E5였던 파일이름을 유효한 글자로 변경해서 저장


[ FAT엔트리 변경 ]
0A자리에 내용을 넣어주고 
그 전의 클러스터에 최종 사용클러스트의 숫자를 넣어줌


2018-12-27

No comments:

Post a Comment

List

MobSF

MobSF는 오픈소스 모바일 앱 자동 보안 진단 프레임워크로 자동 분석 시스템 구축할 때 사용한다. 정정 및 동적 분석이 가능하며, Android, iOS, Windows에 대해 침투 테스트, 멀웨어 분석 및 보안 평가를 할 수 있다. 참고자료 필...