ichirin2501's diary

いっちりーん。

自作したフォレンジック問題

フォレンジック問題を自作してみました。

問題のファイル


2011/10/03 14:46 追記:解説書きました




解説の追記が遅れてしまった><

解説

問題ファイルをダウンロードします。
fileコマンドで何のファイルかを調べると、zipだとわかります。
解凍すると、 usb.bin というファイルが出てきます。
同様に調べてみると、
ファイルシステムNTFSのイメージファイルだとわかります。

[ichirin@ichirin forensic]$ file 581e3877231b0394a9d9abf5d2a9fb70c63d3180.bin 
581e3877231b0394a9d9abf5d2a9fb70c63d3180.bin: Zip archive data, at least v2.0 to extract
[ichirin@ichirin forensic]$ unzip 581e3877231b0394a9d9abf5d2a9fb70c63d3180.bin 
Archive:  581e3877231b0394a9d9abf5d2a9fb70c63d3180.bin
  inflating: usb.bin                 
[ichirin@ichirin forensic]$ file usb.bin 
usb.bin: x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", sectors/cluster 8, reserved sectors 0, Media descriptor 0xf8, heads 255, hidden sectors 32, dos < 4.0 BootSector (0x0) 


とりあえず、マウントして中身を見てみましょう。

[root@ichirin forensic]# mount -o loop usb.bin /mnt/usb
[root@ichirin forensic]# cd /mnt/usb/
[root@ichirin usb]# ls -l
合計 20
-rwxrwxrwx. 1 root root  3348 2011-09-18 22:21 a.out
drwxrwxrwx. 1 root root 16384 2011-09-19 01:04 pic
[root@ichirin usb]# file a.out 
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
[root@ichirin usb]# cd pic
[root@ichirin pic]# ls -l
合計 1588
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 0
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 1
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 10
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 11
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 12
-rwxrwxrwx. 2 root root 390283 2011-09-18 18:00 12_vision_1920.jpg
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 13
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 14
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 15
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 16
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 17
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 18
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 19
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 2
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 20
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 21
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 22
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 23
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 24
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 25
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 26
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 27
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 28
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 29
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 3
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 30
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 31
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 32
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 33
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 34
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 35
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 36
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 37
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 38
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 39
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 4
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 40
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 41
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 42
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 43
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 44
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 45
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 46
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 47
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 48
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 49
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 5
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 50
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 51
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 52
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 53
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 54
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 55
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 56
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 57
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 58
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 59
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 6
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 60
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 61
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 62
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 63
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 64
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 65
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 66
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 67
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 68
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 69
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 7
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 70
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 71
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 72
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 73
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 74
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 75
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 76
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 77
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 78
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 79
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 8
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 80
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 81
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 82
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 83
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 84
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 85
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 86
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 87
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 88
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 89
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:04 9
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 90
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 91
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 92
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 93
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 94
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 95
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 96
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 97
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 98
-rwxrwxrwx. 1 root root  10240 2011-09-19 01:05 99
-rwxrwxrwx. 1 root root   1141 2011-09-18 21:09 qr.png

1つのELF形式実行ファイルと、picフォルダがあるのが確認できます。
picフォルダには2つの画像と、その他のファイル名が数字のものがあります。
ファイル名が数字のものはヌルバイトで埋め尽くされています。
これはフォレンジック問題なので、ただマウントするだけでは前に進むことは出来ません。
私自身、フォレンジックツールに詳しくないのであれですが、
Linuxなら、Autopsy
Windowsなら、FTK Imager
を使用しています。
今回の解説ではAutopsyを使用して進めていきますが、
Autopsyのインストール、使い方の説明は省かせていただきます。
初めての方はこちらを参考にすると良いと思います。
デジタルフォレンジック入門


Autopsyで usb.bin ファイルを開くと、削除されたフォルダ foo があるのがわかります。


削除されたフォルダ foo の中身を見てみると以下のように
129個のファイルがあったことが確認できます。


fooフォルダ内にあったファイルを全て復元します。
(Autopsyだと同時に複数のExport方法が分からなくて精神が死にました)
復元したファイルを調べると、全てzipファイルです。
全てのzipファイルは1つのテキストファイルが圧縮されており、
そこには文字列が記述されています。
ただ解凍しただけでは、その文字列が何を意味するのかわかりません。
zipファイルを調べると、コメントが付加されています。

[ichirin@ichirin foo]$ unzip -z vol1-C..foo.0040c 
Archive:  vol1-C..foo.0040c
3c

全てを手動で調べるのは面倒なので、私はPythonでプログラムを書きました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# python2.7

import commands
import zipfile

def zip_comment():
    names = commands.getoutput('ls vol1-C*').split()
    data  = []

    for name in names:
        zp = zipfile.ZipFile(name, 'r')
        comment = zp.comment
        data.append(int(comment,16))
        zp.close()

    data.sort()
    print data


def main():
    zip_comment()

if __name__=="__main__":
    main()

(同じフォルダ内で実行しないと動きません)
コメントは16進の値で記述されているので、10進に直し、
ソートさせてから出力させています。

[ichirin@ichirin foo]$ python test.py
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128]

0から128までの全ての数値があります。
コメントの数値を昇順として、順にzipファイルを解凍し、テキスト内の文字列を繋げる。
若干の発想が必要ですね。
私が書いたPythonのコードです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# python2.7

import commands
import zipfile

def solve():
    names = commands.getoutput('ls vol1-C*').split()
    data  = []

    for name in names:
        zp = zipfile.ZipFile(name, 'r')
        filename = zp.namelist()[0]
        comment = zp.comment
        out = zp.open(filename).read()

        data.append((int(comment,16),out))

        zp.close()

    data.sort()
#    print data

    ret = ""
    for i in data:
        ret += i[1]

    print ret

def main():
    solve()

if __name__=="__main__":
    main()
[ichirin@ichirin foo]$ python test.py
H4sIAJSodU4AA+2US3KDMAyGWesUHMEyYNrjAGmnbLpI2/vXlh/Y4JAuMtPJzP8pE4TR0zK8zm+GR9VP8zKooZuMuQw9m3G5mPF97l+aB6AsxvRyHXdXi9asGmbTDZ3uRjM0igc23LTqEcnv8fP1PV3btlmXj/W6ft60u/f8SdGK2Y7AioWt7kQUHUQgt2TRIs5CtGgjC+5KQckXNScJD9jGS+GzVHpbDFqyixFEk5KLCui0hZSHybuFpPvCop3tQ8LkAaLN1p8TCv2IhU/hikxajE5pU1x0/ysCOX+7SLtyNqd447NQvfjDhlIop2KdN6IoOpUTVtmsxZfKyZaydaLoOIljBcU54G2706Sdv7+jQ5vFaFJUihtZqT13oSJPtIuDcf9KTvsf8mb7cnb+vAfFs1IZR25P2e2NoflzmoZ1HpNOyque032ymh2Xb0ieMlZBuafLzLK18jXx9fg3i/77OwgAAAAAAAAAAAAAAAAAAAAAAAAA8Kz8AiEiF7YAKAAA

base64エンコードされたものっぽい文字列になります。
というわけで、base64でデコードします。

[ichirin@ichirin foo]$ python test.py | base64 -d > out.bin
[ichirin@ichirin foo]$ file out.bin 
out.bin: gzip compressed data, from Unix, last modified: Sun Sep 18 17:15:16 2011

エンコードされたのはgzipのバイナリでした。さくさく行きましょう。

[ichirin@ichirin foo]$ mv out.bin out.gz
[ichirin@ichirin foo]$ gunzip out.gz
[ichirin@ichirin foo]$ file out 
out: POSIX tar archive (GNU)
[ichirin@ichirin foo]$ tar xvf out 
9be61704abc5053a66d54167cd67fb48
[ichirin@ichirin foo]$ file 9be61704abc5053a66d54167cd67fb48 
9be61704abc5053a66d54167cd67fb48: ASCII text
[ichirin@ichirin foo]$ cat 9be61704abc5053a66d54167cd67fb48 
201100202000011101010011102020202000000
011111121212110012121220202020100120201
001202020201001202021212121212202020110
020202020011020202020220202020012020202
020202021212121202121110021212122020202
020200001110101001110202020202020011021
212121011020212121212122020202020011001
110100202020202021220202001202020202020
202011002021011021212001102121212121220
202020201100100100112020202020202021100
121212202020202202020110020220202101102
021212121212202020202020200110202020202
121200121212121212202020200120202020200
110202021212121100121202110012121212122
020201001202020202020202020220202020210
001110101001110202121212121220202020110
020202020110020202021212120210101212121
212202020202020202020202020212121220202
020211001202110012121212122020202020202
020212121202110012121100100110100011121
212202020202020202020202020212121212122
020200001110101001110202020202020202021
110020212121212122020202001102020202020
011020202021212202020200120202020211001
212110012021212121212202020200110202020
202000011101010011102020202121212121220
202020202020012020202021202121212121220
202011002020202020202020011020212122020
212021212121010111000101111000011021220

さて、0と1と2から成る文字列が得られました。
この時点ではもう手詰まりです。絶対に解けません。
一先ず置いておいて、もう少しAutopsyで探索します。


マウントした状態では、0,1,2,3,etc のように
同じファイルサイズのヌルバイトだけのファイルと、
お遊びの画像ファイルがあるだけでした。
削除されていなかったフォルダ pic を見てみると、
マウント時には見られなかったファイルがあります。


$が付いたこれらのファイルはNTFSファイルシステム
「代替データストリーム」という機能を使ったファイル情報です。
詳しいことはこちらを読むと良いと思います。
2005-09-08 - アンタイ・フォレンジック伝道者の独り言
ファイルサイズに着目すると、どれも1byteのように見えますが、
1つだけ異なるものがあります。

64:$ファイルだけがファイルサイズ337と異なります。
情報を見ると、Rar!〜と続いているのがわかります。
rarファイルですね、復元して解凍します。

[ichirin@ichirin forensic]$ file vol1-C..pic.64 
vol1-C..pic.64: RAR archive data, v1d, os: Win32
[ichirin@ichirin forensic]$ unrar x vol1-C..pic.64 

UNRAR 3.93 freeware      Copyright (c) 1993-2010 Alexander Roshal


Extracting from vol1-C..pic.64

Extracting  _                                                         OK 
All OK
[ichirin@ichirin forensic]$ file _
_: ASCII text, with very long lines
[ichirin@ichirin forensic]$ cat _ 
0+ACAAOgAgMN0wpDDzML8wbjCkMPMwrzDqMOEw8zDIMFkwiwAK-1+ACAAOgAgMN0wpDDzML8wbjDHMK8w6jDhMPMwyDBZMIsACg-20+ACAAOgAgMN0wpDDzML8wTGMHMFlQJDCS-11+WJcwhDBZAAo-21+ACAAOgAgMN0wpDDzML8wTGMHMFlQJDCS-2+bhswiTBZAAo-22+ACAAOgAgMN0wpDDzML8wTGMHMFlQJDCSUfpSmzBZMIsACg-0+ACw-1+ACw-2+TuVZFjBuZYdbVzBvcSGJljBVMIwwizACAAow4TDiMOowb1FoMGY-0+MGdSHWcfUxYwVTCMMGYwizCCMG4waE7uW5owVzBmMEQwizACAAoAIAAgAAo-BNF+AAoAPA-Program+AD4AIAA6ADoAIAAi-0+ACIAIAA8-Program+AD4AIAB8AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAi-1+ACIAIAA8-Program+AD4AIAB8AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAi-2+ACIAIAA8-Hoge+AD4AIAA8-Program+AD4AIAB8ACAAPA-EOF+AD4ACgA8-Hoge+AD4AIAA6ADoAIAAi-0+ACIAIAB8ACAAIg-1+ACIAIAB8ACAAIg-2+ACI-

一部の人には人気のある UTF-7 です。
てきとーにデコードしてください。
私はhtmlファイルにutf-7指定をしてブラウザに読み込ませましたw

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-7">
</head>
<body>
0+ACAAOgAgMN0wpDDzML8wbjCkMPMwrzDqMOEw8zDIMFkwiwAK-1+ACAAOgAgMN0wpDDzML8wbjDHMK8w6jDhMPMwyDBZMIsACg-20+ACAAOgAgMN0wpDDzML8wTGMHMFlQJDCS-11+WJcwhDBZAAo-21+ACAAOgAgMN0wpDDzML8wTGMHMFlQJDCS-2+bhswiTBZAAo-22+ACAAOgAgMN0wpDDzML8wTGMHMFlQJDCSUfpSmzBZMIsACg-0+ACw-1+ACw-2+TuVZFjBuZYdbVzBvcSGJljBVMIwwizACAAow4TDiMOowb1FoMGY-0+MGdSHWcfUxYwVTCMMGYwizCCMG4waE7uW5owVzBmMEQwizACAAoAIAAgAAo-BNF+AAoAPA-Program+AD4AIAA6ADoAIAAi-0+ACIAIAA8-Program+AD4AIAB8AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAi-1+ACIAIAA8-Program+AD4AIAB8AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAi-2+ACIAIAA8-Hoge+AD4AIAA8-Program+AD4AIAB8ACAAPA-EOF+AD4ACgA8-Hoge+AD4AIAA6ADoAIAAi-0+ACIAIAB8ACAAIg-1+ACIAIAB8ACAAIg-2+ACI-
</body>
</html>

Firefoxなら動きましたが、Chromeだとだめでした。
ブラウザ表示のままだと表示がおかしいです。
ソース表示で見ると、

0 : ポインタのインクリメントする
1 : ポインタのデクリメントする
20 : ポインタが指す値を11増やす
21 : ポインタが指す値を2減らす
22 : ポインタが指す値を出力する
0,1,2以外の文字は無視される。
メモリは全て0で初期化されてるものと仮定している。
  
BNF
<Program> :: "0" <Program> |
             "1" <Program> |
             "2" <Hoge> <Program> | <EOF>

<Hoge> :: "0" | "1" | "2"

仕様書が表示されます。
簡易brainf*ckの亜種のようなものですね。
ここで、先ほど0,1,2だけで構成された文字列を
上記の仕様に沿ったインタプリタを作成し、解読させます。
私が書いたC言語によるインタプリタ

#include <stdio.h>
#include <stdlib.h>
char data[100000];
int main(){
    int c;
    char *ptr = &data[50000];

    while( (c=getchar())!=EOF ){
        if( c=='0' ){
            ptr++;
        }
        else if( c=='1' ){
            ptr--;
        }
        else if( c=='2' ){
            char tmp;
            for(;;){
                tmp = getchar();
                if( tmp==EOF ){ perror("tmp is eof."); exit(0); }
                else if( tmp=='0' || tmp=='1' || tmp=='2' ){
                    break;
                }
            }
            
            if( tmp=='0' ){
                *ptr+=11;
            }
            else if( tmp=='1' ){
                *ptr-=2;
            }
            else if( tmp=='2' ){
                putchar(*ptr);
            }
            else{
                perror("tmp is ?"); exit(0);
            }
        }
    }
    return 0;
}

インタプリタ作成時には、仕様書に書かれている
”それ以外の文字は無視する”に注意です。
0,1,2で構成された文字列は一定数で区切られて改行が入っているからです。
予め入力させる文字列を繋げておけば問題ありません。
まぁ、些細なことですがw


作成したインタプリタにその文字列を読み込ませると、

[ichirin@ichirin foo]$ ./a.out < 9be61704abc5053a66d54167cd67fb48 
Congrats!!
key is HomuHomu

というわけで、答えは


HomuHomu
でした!

おまけ

■実行ファイルの出力文字に関して

普通に実行すると、「aemaeth」
引数に 2501 という文字列を与えて実行すると、「maeth」
元ネタはアニメのイノセンスです。
通常にマウントした人はa.outを調べるだろうと考えたので、
このような仕掛けにしました。

QRコードの画像ファイルに関して

picフォルダにあったQRコードを読み込むと、
すーぱーそに子の公式サイトに繋がります。
そに子かわいいです、それだけです。
バイナリでこのpng画像ファイルを見ると、
さらにもう1つpngフォーマットがあるのがわかります。
分離させてファイルにすると、QRコードの画像になります。
読み込むと…。
そに子かわいいです、それだけです。

あとがき

いかがだったでしょうか。
今回、初めてフォレンジック問題を自作しました。
実は、身内によるちょっとしたイベントで
問題を作成して提供する機会があり、乗じて作成した問題です。
それを個人的にここで公開した、という流れです。
フォレンジックにも触れてほしいなぁー、
という意図の元、作成した問題ですので、
フォレンジックフォレンジックな仕上がりにはなっていませんw
そういうことを期待された方には拍子抜けだったかもしれません。
(そもそも私には知識も技術力も足りません)
ただ、ツールを使えば解ける、という安易な流れは避けたかった思いがあり、
事前知識、発想が必要とされる部分や、プログラミングの機会も設けました。
なので、複合問題と言えばそうかもしれないですね。
問題作成したはいいものの、テスターは私一人だったので
本当に解けるかどうか(問題が間違ってるなど)は不安でした。
でも、

軽々解いてる方も見受けられたので、安心しましたw
えっと、まぁそんな感じで、
トライしていただいた方、ありがとうございました!

参考URL

「デジタルフォレンジック入門」
http://ruffnex.oc.to/kenji/text/for/
「NTFS 代替データストリームに関するメモ」
http://d.hatena.ne.jp/hideakii/20050908