ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 저장장치의 구조 & MBR
    Digital Forensics/분석하며 알아가는 File System 2019. 11. 26. 15:51
    반응형
    SMALL

    안녕하세요. Luke입니다. 최근 진로를 디지털 포렌식 분야로 변경한 후 디지털 포렌식을 열심히 공부하고 있는데요. 배운 내용에 대해 정리할 겸 저장장치의 구조와 그중 일부인 MBR에 대해 글을 써보려 합니다. 저도 포렌식을 공부하면서 정리하는 만큼, 추후에 누군가가 이 글을 봤을 때 선행지식이 없더라도 이해할 수 있도록 글을 작성해보도록 하겠습니다. (이해하기 쉬운 보고서 작성은 분석가의 역량이기도 하니까요!) 저도 공부를 하면서 작성하는 글입니다. 혹시 잘못된 내용이 있다면 댓글로 남겨주시면 더욱더 공부하도록 하겠습니다 ㅎㅎ

     

    저장장치는 파일을 저장할 때 사용되는 장치입니다. 하드디스크, SSD, USB 등의 모든 저장장치의 구조와, 그 중 일부인 MBR에 대해 설명해보고자 합니다.

     

     

    목차

    1. 저장장치의 구조
      1. MBR
      2. MBR Slack
      3. VBR
      4. Volume Data
    2. 부팅절차
       
    3. MBR
      1. MBR 소개
      2. 부트코드
      3. MBR 파티션 테이블

     

    저장장치의 구조


    저장장치의 추상적인 구조는 다음과 같이 이루어집니다.

    저장장치의 추상적 구조

    그럼 조금 더 자세히 각 부분이 무엇이고, 어떤 역할을 하는지에 대해 자세히 알아보도록 하겠습니다.

     

    MBR(Master Boot Record)

    MBR

    MBR은 오늘 저희가 자세히 알아볼 부분으로 다음과 같은 특징을 가지고 있습니다.

    • 모든 저장장치의 가장 처음 존재합니다.
    • 그러나, MBR 파티션 테이블에는 2TB라는 용량 제한으로 인해, 각 파티션을 아무리 크게 만들려 해도 2TB까지 밖에 만들지 못합니다.
    • 최근에는 이러한 단점을 보완한 GPT가 사용되기도 합니다.

     

    MBR Slack

    MBR Slack

    MBR Slack은 MBR과 VBR 사이에 존재하며, 낭비되는 공간입니다.

    의미 없는 공간이지만, 악성코드가 악용하기도 하며, 보안 솔루션에서 사용되기도 합니다.

     

    크기는 운영체제에 따라 다르며 다음과 같습니다.

    • Windows XP/2K3: 63 섹터
    • Windows Vista/7/8: 2048 섹터

     

    VBR(Volume Boot Record)

    VBR

    VBR은 볼륨의 시작에 위치하는 구조로, 볼륨의 클러스터* 크기만큼 할당됩니다.

    (클러스터*: 여러 섹터*를 묶은 파일시스템에서의 파일 저장 시 최소 단위이며, 볼륨 포맷 시 지정)

    (섹터*: 하드디스크의 물리적 최소 단위, 512kb)

    파일시스템의 BPB*와 부트로더 로딩 코드가 존재합니다. 볼륨의 부트로더를 로딩하여 운영체제를 부팅하기 때문에, 해당 영역이 손상되면 제대로 된 부팅이 불가능하게 됩니다.

    (BPB*: 볼륨과 파일시스템구조 레이아웃에 관해 정보가 저장되어있는 block)

     

    Volume Data

    Volume Data

    파일 시스템에 의해 할당된 볼륨 데이터입니다.

    파일의 전체적인 간단한 구조를 나타내는 메타데이터와 파일데이터로 구성되어 있습니다.

    • 메타데이터 영역:
      디렉토리 및 파일의 구조를 표기하는 영역으로, 파일명, 위치, 크기, 시간정보, 삭제 유무 등이 기록되어 있습니다. 파일 삭제 시 복구할 수 있는 이유는 실제 파일데이터 영역을 삭제하는 것이 아닌, 메타데이터 영역에 삭제 유무만 변경되기 때문입니다. 그렇기에 파일데이터 영역이 덮어씌워지지 않았다면 파일 삭제는 복구가 가능합니다.
    • 파일데이터 영역:
      파일의 데이터가 기록되는 영역입니다.

     

     

    부팅 절차


    이제까지 우리는 저장장치의 구조에 대해 알아보았습니다. 그럼 운영체제도 어디에 저장된 파일의 일종 아닐까요? 그렇다면 컴퓨터는 어떻게 부팅을 해서 운영체제를 불러오는 것일까요? 저장장치의 구조를 알아보았으니 간단히 부팅의 절차에 대해 알아보도록 합시다.

     

    부팅의 절차는 다음과 같습니다.

    1. BIOS*
      컴퓨터가 탑재된 가장 낮은 수준에서 입출력을 담당하는 펌웨어 입니다. 메인보드 내에 내장된 ROM BIOS에 내장도어 있습니다.
      (BIOS와 CMOS의 차이: http://forensic-proof.com/archives/181)

    2. Pre POST
      CPU의 이상 유뮤를 확인하고, POST 작업을 위한 기본 테스트를 진행합니다. 테스트 결과 값이 ROM BIOS에 저장된 값과 일치할 경우 POST를 시작합니다.

    3. POST(Power On Self Test)
      POST는 운영체제를 불러오기 전 다양한 주변장치를 검사합니다. UEFI에서는 Fastboot가 활성화 된 경우 이 과정을 생략합니다. POST의 절차는 더 정리가 잘 되어 있는 블로그가 있어 링크를 걸어두겠습니다.
      http://forensic-proof.com/archives/178

    4. MBR
      운영체제를 로드하기 위해 드라이브의 첫 번째 섹터를 읽는데, 그곳에는 MBR이 위치해 있습니다. MBR의 부트코드(446바이트)를 읽고 실행합니다. 오류 발생 시 오류 메시지를 출력합니다.
      그 후 MBR 파티션 테이블에서 부팅 가능한 파티션을 찾습니다.

    5. VBR
      부팅 가능한 파티션을 찾았다면 부팅 가능한 파티션의 VBR을 읽습니다. VBR에는 파티션에서의 클러스터 크기, MFT 위치, 전체 섹터 수 등 해당 볼륨의 추가적인 정보와 함께 부팅에 필요한 시스템 파일의 위치와 실행할 수 있는 코드가 들어있습니다. 그 후 운영체제에 맞게 절차에 따라 부팅됩니다.

    개인적으로 공부를 하면서 궁금했던 점이 만약, 드라이브가 여러개라면(MBR이 두개 이상이므로) 어떻게 부팅이 되는지 궁금하여 아는 형님께 여쭤보니, 아래 그림과 같은 바이오스에서의 Boot Priority 설정을 통해 어떤 MBR에서 먼저 검사를 할 것인지를 확인한다고 하였습니다.

    출처: http://www.boot-disk.com/boot_priority.htm

     

    MBR


    그럼 이제 원래 목표로 알아보기로 했던 MBR에 대해 조금 더 자세히 알아보겠습니다.

     

    MBR은 Master Boot Record의 약자로, 모든 저장장치는 이 영역을 가지고 있습니다.

    저는 MBR에 대해 더 자세히 알아보기 위해, 가상머신을 만들어 실제 환경에서 MBR이 어떻게 구성되는지를 직접 실습해보려 합니다. 기회가 되신다면 글을 읽으면서 같이 실습해보시는 것도 좋을 것 같습니다.
    VMware 가상 머신 파일을 함께 첨부하도록 하겠습니다.

    https://drive.google.com/file/d/1EGyj-pC79QjJ6v3GuWSqgRDiL1uRhNCp/view?usp=sharing

    2022.01 추가
    현재 파일이 삭제되어 해당 파일을 다운로드할 수 없습니다. 따로 MBR 디스크를 만드셔서 실습하시기 바랍니다.

     

    먼저 가상머신의 저장장치에서 MBR 부분을 확인해 보도록 하겠습니다.

    MBR

    MBR은 저장장치의 첫 섹터에 위치하고 있으며, 512바이트 즉 1섹터의 크기를 가지고 있습니다.

    MBR의 구조

    MBR의 구조는 차례대로 부트 코드(446바이트), 파티션테이블(16*4 = 64바이트), MBR시그니처(0x55 0xAA, 2바이트)로 이루어져 있습니다.

    그럼 조금 더 자세히 각 부분에 대해 쪼개서 알아보도록 하겠습니다.

     

     

    부트코드<0x00 - 0x1BD>

    부트코드 영역

    부트코드는 말 그대로 부팅을 하기 위한 코드입니다. 파티션 중 부팅이 가능한 파티션을 찾아 해당 파티션의 부트섹터로 넘겨주는 일을 합니다. 부팅 가능한 파티션을 찾지 못해 에러가 발생될 경우에는,

    부트코드 영역의 에러 메시지

    위 그림과 같은 부트코드 영역에 기록된 에러 메시지를 출력하게 됩니다.

     

    부트코드 영역에서 다시 한번 잘 살펴봐야 할 부분이 하나 더 있습니다. 바로 <0x1B8-0x1BB>에 위치한 저장장치의 고유 ID가 담긴 GUID입니다.

    저장장치의 GUID

    위의 DC 34 82 B8 은 해당 저장장치 고유의 ID인 GUID(Globally Unique ID)이다. 이는 윈도우의 레지스트리
    HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
    에서 확인할 수 있습니다.

    삽입되었던 저장장치는 위의 그림과 같이 레지스트리에 GUID가 남습니다. 예를 들어 D드라이브와 E드라이브의 경우 제가 예전에 삽입했었던 USB입니다. 이를 통해 특정 USB가 삽입되었는지의 여부를 확인할 수 있습니다.

    아까의 GUID값이었던 dc 34 82 b8과 일치한다는 것을 알 수 있습니다. GUID 다음 8바이트는 각 파티션의 시작 섹터 위치입니다.

     

     

    MBR 파티션 테이블<0x1BE - 0x1FD>

    MBR 파티션 테이블 영역

    MBR 파티션 영역은 MBR의 446바이트 부터 시작되며 파티션 용량, 부팅가능 여부, 파티션 시작 위치 등 현재 해당 디스크의 파티션에 대한 정보를 담고 있습니다. 먼저 한 파티션을 가지고 분석해보도록 하겠습니다.

     

    MBR 파티션 테이블 중 첫 번째 파티션

    MBR 파티션 테이블에서 한개의 파티션은 16바이트로 이루어져 있으며, 최대 4개의 파티션까지 나타낼 수 있습니다.(즉, GPT가 아닌 MBR을 사용하는 컴퓨터에서는 한 디스크 당 최대 만들 수 있는 파티션은 최대가 4개 입니다.)

     

    위 그림에서는 저의 현재 파티션 테이블을 알 수 있는데요, 제가 분석한 환경에서는 파티션이 C드라이브 하나만 생성되어 있었습니다.

    제 컴퓨터의 파티션 환경

    그렇기 때문에 위의 MBR 파티션 테이블에서도 하나의 파티션 즉 16바이트만이 존재하고, 나머지는 전부 0x00으로 기록된 것을 알 수 있습니다.

     

    그럼 조금 더 상세히 분석을 해보도록 하겠습니다.

     

    부트 플래그

    16바이트의 파티션 정보에서 가장 첫 바이트는 부트플래그를 의미합니다. 이는 부팅 단계에서 부팅 가능한 파티션이 어느 위치에 있는지 확인할 때 사용됩니다.

    부팅 가능 파티션의 부트 플래그: 0x80

    부팅 불가능 파티션의 부트 플래그: 0x00

    저의 환경에서는 C드라이브가 유일한 파티션이자 부팅 가능한 파티션이므로 하나의 파티션이 0x80으로 표기되어 있는 것을 확인할 수 있습니다.

     

    시작 CHS 주소

    2번째 ~ 4번째 바이트의 값은 CHS 주소지정방식의 파티션 시작 위치를 나타냅니다.

    CHS 주소지정방식이란 하드디스크의 구조인 실린더(C), 헤더(H), 섹터(S)를 기준으로 한 주소 방식입니다. 현재 위 파티션의 시작 CHS 주소는 0x002120입니다.

     

    파티션 유형

    5번째 바이트는 해당 파티션의 유형을 나타냅니다. 이 값을 조작해 파티션을 숨길 수 있습니다. 파티션의 다양한 유형은 다음과 같습니다.

    출처: https://github.com/proneer/Slides/blob/master/Filesystem/(FP)%20MBR%2CGPT%2C%20Filesystem.pdf

    위 그림에서 파티션 유형의 값은 0x07이므로 Advanced Unix, exFAT, NTFS 중 하나입니다.

    제 파티션은 NTFS입니다.

    저의 파티션 파일시스템은 NTFS이므로, 해당 파티션 유형값이 맞는 것을 알 수 있습니다.

     

    CHS주소지정방식에서 해당 파티션의 끝

    6 ~ 8번째 바이트는 CHS주소지정방식에서 해당 파티션의 끝을 나타냅니다. 현재 해당 파티션의 CHS 끝 주소는 0xFFFFFE입니다.

     

    LBA 주소지정방식의 시작위치

    9 ~ 12바이트는 LBA주소지정방식에서의 시작 위치입니다. LBA 주소지정방식이란 CHS 주소지정방식처럼 실제 위치를 기준으로 하는 주소지정방식이 아닌 가상의 주소를 이용해 주소를 지정하는 주소지정방식입니다. 대용량 저장장치의 위치를 지정할 수 있다는 장점이 있지만 바이오스에서 지원해야만 사용이 가능합니다. 해당 파티션의 LBA 시작 주소는 0x00000800입니다.

     

    섹터 수

    13~16바이트인 마지막 4바이트는 해당 저장장치의 섹터 수를 나타냅니다. 한 섹터는 512byte이므로, 총 섹터 수에 512바이트를 곱하면 해당 저장장치의 용량을 알 수 있습니다. 위 값을 통해 LBA주소지정방식에서 끝 값이 기록되어 있지 않아도 해당 파티션의 LBA 주소지정방식 끝 주소값을 계산할 수 있습니다.

    위의 파티션에서는 0x077FF000섹터를 가지고 있으므로,

    계산결과

    총 ‭64422412288‬ byte임을 알 수 있습니다. 제 저장장치는 약 60GB이므로 해당 값이 정확함을 알 수 있습니다.

     

     

    파일시스템 공부를 시작하면서 인터넷하고 각 발표자료 등 다양한 자료를 통해 공부한 뒤 직접 hex로 분석해가면서 포스팅을 해보니 더욱 머리에 잘 남는군요. 이 글을 쓰는데 생각보다 오랜 시간이 걸렸지만, 막상 완성되고 나니 뿌듯합니다 ㅎㅎ. 다음 포스팅으로는 NTFS나 FAT와 같은 파일시스템을 들고 와보겠습니다(사실 이 글을 마쳤을 때는 이미 FAT32 분석을 마쳤습니다 ㅋㅋ). 긴 글 읽어주셔서 감사합니다 :)

    반응형
    LIST

    댓글

Copyright ⓒ 2019, WeekHack