Monday, January 7, 2019

EXT2 File System 분석

2019-01-07 

EXT2 파일 시스템

[아래 내용의 환경]
CentOS 6 
3GB-HDD, 2GB-파티션
EXT2 Format
NewMonday.txt 파일, 10글자내용
-> poweroff -> centos의 하드디스크를 분석용 PC에 달기

EXT File System

  종류

  • EXT2 :  리눅스 계열의 주 파일시스템
  • EXT3 :  EXT2 + Journaling file system
  • EXT4

  • EXT2


    • Block(Data Block) : 섹터의 모음 (=Cluster)
    • 파티션의 처음부터 블록단위로 사용한다.
[참고] UFS의 경우: cluster == EXT의 경우 : block

    EXT 2 파일 시스템의 구조 개요

  • First Block(0번 Block)
    • Boot Sector(0~1번 Sector)
    • Super Block(2번 Sector)
  • GDT(Group Descriptor Table)
    • Group Descriptor Entries
  • Block Groups
    • Block Bitmap
    • Inode Bitmap
    • Inode Table
      • Inodes
        • 파일에 대한 정보 모두 가지고 있음 without 파일이름
        • 파일 하나에 Inode 하나
  • Data Blocks
    • Root Directory
    • Sub Directories
    • Filies

  • First Block(0번 Block)

[ MBR의 위치 확인 ]
0x3F = 0번 block의 상대값 

  • Boot Sector

파티션의 첫번째, 두번째 섹터는 Boot Strap Code가 기록되는 공간

  • Super Block

[ Super Block의 구조 ]

    • 파티션의 구조 정보
    • Block count: 파티션의 Block의 개수
      • 파티션의 크기(Byte) = Block 개수 * Block 크기
    • 파티션의 크기(Byte) = Block 개수 * Block 크기
   [ 참고 ] Block?
      - 섹터의 모음
      - 일반적으로 가장 많이 사용하는 블록의 크기는 4KB(4096 Byte, 섹터 8개)

  • Inode count: 파티션의 Inode의 개수
  • Reserved Block count
    • 예약된 블록의 개수
    • 파티션이 꽉찼을 때를 대비하여 예비공간을 확보하는 개념
  • Free Block count 
    • 사용되지 않고 있는 블록의 개수
  • Free Inode count
    • 사용되지 않고 있는 inode의 개수
  • Log Block Size
    • Block 의 크기를 의미한다.
    • 0 -> DataBlock의 크기가 1024 Bytes
    • 1 -> DataBlock의 크기가 2048 Bytes
    • 2 -> DataBlock의 크기가 4096 Bytes
  • Block per Group : 블록 그룹이 몇개의 데이터블록으로 구성되었는지 기록되어 있다.
  • Inode per Group : 블록 그룹에 몇개의 inode이 있는지 기록되어 있다.


[Super Block - Magic Signatuer ]


  • GDT entry


    • Starting Block Address of Block Bitmap
    • Starting Block Address of Inode Bitmap
    • Starting Block Address of Inode Table


[ 첫번째 비트맵의 시작하는 블록 ]
0x84 = Starting Block Address of Inode Table
0x84=132
(132*8)+63
block addr. * Sector per block + 0번 block의 섹터 절대값


  • Block Group

    • 데이터 블록을 관리하기 용이하게 하기 위해서 그룹으로 묶어 놓았다.
    • 그룹 별로 Inode Table, Data Block 등의 구조가 따로 만들어 진다.
    • GDT (Group Descriptor Table) Entry에 그룹의 위치와 구조가 기록되어 있다.

  • Block Bitmap


    • Block의 사용현황을 빠르게 파악할 수 있도록 표의 형태로 관리
      • 예) 0번 비트가 1이면 0번 블록은 사용중임
      • 1번 비트가 0이면 1번 블록은 사용중이지 않음
      • 예) BitMap의 값이 0xFF07 이면 1111 1111 0000 0111 
      • => 1111 1111 1110 0000 으로 바이트 단위로 상위 주소에서 하위 주소로 읽는다. 

  • Inode Bitmap

   Inode의 사용현황을 빠르게 파악할 수 있도록 표의 형태로 관리

  • Inode Table

    Inode를 모아놓은 공간

  • Inode 

    • 파일의 속성 정보를 기록
    • 파일의 권한, 크기, 소유자, 소유그룹, 시간정보, 파일 내용이 기록된 블록번호
    • 파일의 이름은 디렉토리 엔트리에 기록되고 inode에는 기록되지 않는다.
    • 파일이 생성되기 위해서는 inode가 필요하다.
    • 파일 시스템을 생성할 때 inode의 개수가 결정되므로 inode가 부족한 경우 파일을 생성할 수 없다.
[ inode table 의 inode 구조 ]
inode가 연속적으로 나타남


[ 1개의 Inode ]



[ 여기로 찾아가보기 ]

Directory Entry

  • File Mode


 [linux - chmod : rwx 부분 ]


[ 파일 모드 ]
0x41ED 
4000[Directory] +100[소유자:읽기] + E[소유자: 쓰기, 실행, 소유그룹: 읽기] +D[소유그룹: 쓰기, 기타: 쓰기, 실행]



예) Root Directory = 0x41ED

  drwxr-xr-x

  - d --> 0x4000

  - 소유자 권한 rwx -->  0x100 + 0x80 + 0x40
  - 소유그룹 권한 r-x --> 0x20 + 0x8
  - 기타 권한 r-x --> 0x4 + 0x1
  ==> 0x41ED
  • UID(16bit) 
         이 파일의 소유자의 ID (UID)
  • Size (Byte)(32bit)
         파일의 크기( 32bit => 2^32 -> 4GB)
  • Last Modified Time(32bit)
    • 파일 내용이 변경되는 경우에 업데이트된다.
    • 파일 수정, touch 명령 사용 시
  • Deleted Time (32bit)
    • 파일이 삭제된 시간 정보
    • 파일이 삭제될 때 기록된다.
  • GID(16bit) 
    • 이 파일의 소유그룹의 ID (GID)
  • Hard Link (16bit)
    • 디렉토리 엔트리는 다른 것을 사용하지만 Inode는 같은 것을 사용한다. 
  • Block Count (32bit)
  • Flags(32bit)
  • OS Description 1(32bit)
  • Direct Pointer (32bit * 11=352 bit)
    • 파일의 내용이 들어있는 블록의 번호가 기록되어 있다.
    • 12개의 Direct Pointer가 있으므로 기록할 수 있는 파일의 크기는 최대  48KB이다.
      • 12 * 4KB = 48KB
  • Single Indirect Pointer (32bit)
    • 추가한 Direct Pointer가 있는 블록의 번호가 기록되어 있다.
    • 여기에 적혀있는 블록을 가보면 Direct Point가 1024개가 있다.
    • Single Indirect Pointer를 사용하면 최대 1024개의 Direct Pointer가 추가되므로 4MB
      • 1 * Single Indirect Pointer --> 1024 * Direct Pointer --> 1024 * 4KB = 4096KB =4MB
  • Double Indirect Pointer (32bit * 11=352 bit)
    • 추가한 Single Indirect Pointer가 있는 블록의 번호가 기록되어 있다.
    • 여기에 적혀있는 블록을 가보면 Single Indirect Point가 1024개가 있다.
    • Double Indirect Pointer를 사용하면 최대 1024개의 Single Indirect Pointer가 추가되고 Single Indirect Pointer 1개마다 1024개의 Direct Pointer가 있기 때문에 최대 저장할 수 있는 파일을 크기는 4GB
      • 1024 * 1024 * 4KB =4GB
  • Triple Indirect Pointer (32bit)
    • 추가한 Double Indirect Pointer가 있는 블록의 번호가 기록되어 있다.
    • 여기에 적혀있는 블록을 가보면 Double Indirect Point가 1024개가 있다
      • 1024 * 1024 * 1024 * 4KB = 4TB
  • Generation Number(32bit)
  • File ACL(32bit)
  • Directory ACL(32bit)
  • Block Address of Fragmentation(32bit)
  • OS Description 2(96bit)


[ 예약된 INODE ]


[ 1 섹터당 2개의 INODE TABLE ]
2번 Inode는 Root Directory


[ Directory Pointer ]
루트디렉토리의 포인터로 이동
0x268 번째 Block의 첫번째 섹터


Directory Entry



[ Directory Entry ]
2번 INODE : ROOT Directory
0x0A : lost+found directory 의 주소 (1번노드시작점부터 11번째 노드가 주소)




[참고] 
lost+found --> fsck
파일이 있었는데 fsck(검사)를 했더니 사라지는 경우는!
 lost+found에 넣어뒀을것임


[ Root Directory 이후의 directory 중 3번째 ]
0x3008 의 주소로
























No comments:

Post a Comment

List

MobSF

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