WeSeong ログイン
← 記事一覧に戻る
ディスク

MBR、VBR復元、MFT、およびデータ領域構造

MBR、VBR復元、MFT、およびデータ領域構造

Ⅰ. 概要

今回は、DISK サンプルイメージを使用して、MBR と VBR の復元を実践します。復元後は、FAT および NTFS のデータエリアを探し、構造を調べます。



Ⅱ. ディスク演習 - MBR、VBRの復元

サンプルのDISKイメージを使用して、HxDを介してVBRバックアップを使用してMBRとVBRを復元します。



上の両画像を見ると、MBRとVBRが破損していることがわかります。通常、0番セクターにはMBR情報が格納されており、512バイトで構成されるMBR内の最後のパーティション関連情報が失われていることがわかります。この復元作業では、まずVBRのバックアップセクターを特定します。次に、VBR内のパーティションがNTFSかFATかを判別します。その後、VBR内のパーティションの総セクターサイズを計算し、その情報を元に元のVBRの場所を特定します。最後に、バックアップVBRセクターを元のVBRの場所にコピーして復元し、MBR内のパーティション情報を関連情報に基づいて回復します。これらの作業を順に行います。


  1. VBR バックアップセクターの検出

VBR でバックアップセクターを見つけるにはいくつかの方法があります。ここでは、シグネチャを使用する方法を紹介します。HxD で hexadecimal 55 AA を検索すると、次のような結果が得られます。


これがその仕組みです。結果を検索していくと、次のようなものを見つけることができます。


この場合、最後の 2 バイトは 55 AA で、「Uª」が表示されます。これは署名です。ここで注意すべきことは、55 AA が署名であるということです。単に文字形式ではないということです。上の赤い部分を見ると、NTFS であることがわかります。NTFS の VBR 構造に関する関連ブログがたくさんありますので、それを参照するとより理解できるようになると思います。


  1. NTFS VBRの復元

NTFS の場合、バックアップセクターは通常、NTFS パーティションの最後のセクターになります。したがって、バックアップセクターからパーティションのセクターサイズを確定できれば、元のバックアップセクターの場所も確定できます。


この構造を確認すると、Total Sectors の情報が VBR で 0x20 から 0x27 までの合計 8 バイトに格納されていることがわかります。


上の画像では、A67FFはパーティション内のセクタ数をリトルエンディアン形式で表しています。計算すると、得られる値は「681,983」です。バックアップセクタの現在の位置は「682,111」であるため、この値からパーティション内のセクタ数を引くと「128」となり、これがオリジナルのVBRの開始セクタになります。



バックアップ VBR をコピーした後は、それをセクタ 128 に貼り付けて保存します。


  1. NTFSパーティションをMBRに復元する

次に、これらの値を使用して MBR を復元します。

[SKシリヤーズ SeSAC ソンドン第1バッチ] ZIP構造、DISK

前回の記事で述べたように、MBRには、446バイトから510バイトまで、各パーティションに関する情報が16バイト単位で格納されています。セクタ128から始まるNTFSパーティションの場合、MBRの最初の16バイトに必要な情報を挿入します。実際には、1バイト、4バイト、8バイトから11バイト、および12バイトから16バイトだけが必要なので、これらの情報だけを再入力します。1バイトのBoot Flagを80に、4バイトのファイルシステムタイプを07に(NTFSを意味します)変更します。8バイトから11バイトのパーティション開始アドレスは、128セクタを16進数で変換した80になります。最後の12バイトから16バイトは、パーティションのサイズであるA67FFになります。


※ 代替する場合、実際の表記は Big Endian となります。現在では Little Endian として読まれています。



挿入および保存が完了したら、FTK Imager を使用して復元が成功したかどうかを確認します。


回復が成功していることがわかります。その後、同じ方法で FAT を続行できます。


  1. FAT の回復が進行中


この方法でバックアップ VBR を探し出し、ここから -6 である '682,112' のバックアップ VBR をコピーして貼り付けます。


その後、MBR を再度復元する場合は、単にブートフラグ 80、0B または 0C、A6880 に変換された開始アドレス '682,112'、およびセクタサイズを入力するだけです。


出典 hec-ker.tistory.com / 以下に添付

FAT32 ファイルシステム構造

上記の構造から、全パーティションセクタサイズが0x20から4バイトであると計算すると、A6800です。そして、この値をMBRに入力すると、


これを入力できるはずです。次に、保存した後、再度 FTK Imager で確認すると、


とてもよく復元されているのが分かりますね。



Ⅲ. DISK演習 - データ領域の検索

前回の投稿で簡単に触れたように、FAT32 で DataArea を見つける方法は次のようになります。FAT32 の構造は VBR (予約領域) - FAT1 & FAT2 - MFT が表示されます。次に、VBR のスタートセクタには、予約領域と FAT1 があります。 & FAT2 セクターサイズを追加すると、データ領域の場所が得られるでしょうか。


計算すると、予約セクター数の情報は0x0E~Fと6,874です。FATセクターサイズは0x24~7なので、659です。しかし、FAT1と2があるので、2で掛けると1,318になります。これらの値をすべて足した場合、6,874 + 1,318 + 682,112(FATの開始セクター - VBR)で690,304となります。では、そのセクターに移りましょう。


復元された FAT32 のデータ領域を見つけることができました。FAT32 の場合、データ領域の構造は次のとおりです。


出典 dotaky99.tistory.com / リンクは下にあります

[ファイルシステム] FAT32 - 第3部 (データ領域、復元)

このようになります。重要なことは、SFN(Short File Name)構造とLFN(Long File Name)構造を区別する必要があることです。区別するには、12バイトの値が使用されます。これらを区別する理由は、構造が異なるためです。


ソース blog.forensicresearch.kr / 以下にリンクを貼っています

ディレクトリエントリ分析 - SFN、LFN

デフォルトでは、32バイトが区切られており、SFN構造は以下のようになっているため、調べることができます。しかし、LFNの場合は、さらに考慮すべき事項があります。まず、32バイトのうち11バイトが0x0Fである場合、それらの32バイトがLFN構造です。次に、0x0位置の1バイトを見ると、シーケンス番号であることがわかります。この値は重要です。


上の画像では、開始 SeqNum が 42 で、12 バイトが 0x0F であることがわかります。したがって、上の 2 行は LFN 構造になっています。同様に、下の 32 バイトでは、SeqNum が 1 です。まとめると、LFN 構造は 2 つのファイルからなります。これを知る方法は、SeqNum によるもので、複数の LFN 構造がある場合、32 バイト構造内の最後の SeqNum は 0x40 または演算の結果です。他の LFN 構造の SeqNum は 0x01 から 1 ずつ増加するため、0x40 または演算の値が 0x40 を超える場合、ファイル内の LFN 構造の数を示しています。したがって、0x42 を再び XOR すると、2 となり、ファイルには 2 つの LFN 構造があることがわかります。


上の例画像からもわかるように、ファイルには3つのLFN構造体があることも計算できます。


NTFS では、状況が少し異なります。NTFS パーティションには VBR、MFT、およびデータ領域があります。もう少し詳しく見てみると、VBR と MFT がそれぞれ 1 つあり、実際には MFT は MFT エントリの集合です。各 MFT エントリはファイルまたはディレクトリに対応します。MFT エントリの署名は FILE です。ヘッダ構造をもう少し詳しく見てみると、


こんな感じです。


その場合、MFT エントリを見つける方法について紹介したいと思います。前述の NTFS VBR 構造を参照すると、セクタあたりのバイト数、クラスターあたりのセクタ数、および MFT エントリの開始クラスター位置を知る必要があります。


この例では、必要な3つの値は次のとおりです。まず、1セクターが512バイトであることを示す200です。クラスターあたりのセクター数は8です。MFTエントリの開始クラスター位置は6F00で、整数では28,416です。では、実際のMFTエントリの開始セクター位置はどれでしょうか。各クラスターには8セクターが含まれているため、開始クラスター位置を8で掛けます。その結果、227,328となります。現在、セクター128から始めていますので、128を足すと227,456になります。このセクターに移動すると、次のようになります。


これは MFT エントリの署名です。この MFT エントリのヘッダーを見ると、合計 48 バイトから構成されています。


まず、これらの二つの値を見てみると、24バイトから27バイトに対応する最初の赤い部分は、MFTエントリの実際のサイズを表し、その後ろの28バイトから31バイトの部分は、MFTエントリに割り当てられたサイズを表しています。これは通常、1,024バイトです。MFTエントリは、単一のファイルまたはディレクトリに対応しています。1セクタ(1,024バイト)戻った場合、次のようになります。


また、MFTエントリが始まることがわかります。信頼性を高めるために、Fixup構造はMFTエントリヘッダーの後に配置されます。MFTエントリの4バイト目と5バイト目、および5バイト目と6バイト目は、それぞれFixup配列の値と配列の長さを表します。16進数で表すと、30と3です。したがって、48バイト目から始め、2バイトの長さがFixup値であり、その後に先ほど計算した長さの3バイトとFixup値がそれぞれ2バイトずつありますので、それらを掛け合わせると、Fixup値で置き換えられたデータを格納するスペースとして6バイトになります。このFixup値は、データを解釈する前に、またはセクタの内容が異常に変化する前に、エラーを事前に検出するために使用されます。次に、属性ヘッダーと内容が繰り返されますが、これに関連した良いブログを紹介したいと思います。

[ファイルシステム] NTFS - 第3部 (属性、$Properties)



レビュー

今週の最後の投稿になると思います。NTFSのMFTエントリにおけるプロパティの構造をまだ完全には理解していないので、少しがっかりしていますが、学ぶことが多すぎて、まだまだ空白を埋めなければならないような気がしています。