ファイルの中身で種類を見分ける
怪しいファイルは、名前や拡張子で、別の種類に見せかけることがあります。しかし、ファイルの中身の最初の数バイトは、種類を表す印で、簡単には隠せません。
このレッスンでは、中身から種類を見分ける方法と、動いているプロセスを調べる方法を学びます。
このレッスンのゴール
メモ
中身の印で怪しいファイルを見分け、動いているプロセスを調べることができる。
キーワード
| ことば | いみ |
|---|---|
| プロセス | 動いているプログラム。1つずつ番号(PID)がつく |
| ファイルシグネチャ | ファイルの先頭にある、種類を表す決まったバイト |
| バイト | コンピュータが扱う、データの最小のまとまり。16進数で2文字 |
| 16進数 | 0から9とaからfで書く数。1バイトは2文字 |
| カービング | 大きなデータの塊から、印を手がかりにファイルを切り出すこと |
| オフセット | 先頭から数えた位置 |
学生が入力するセルは、このプレビューでは空白です。
プロセスは、動いているプログラム
プログラムを動かすと、プロセスになります。プロセスには番号があり、PID と呼びます。どのプロセスが、どのプロセスから起動されたか(親)も、記録されます。
怪しいプロセスは、名前だけで決められません。実行ファイルの場所と、親と、起動した時刻を見ます。
例: プロセスの一覧の読み方(作り物)
| PID | 親 | 名前 | 実行ファイルの場所 | 気になる点 |
|---|---|---|---|---|
| 1 | 0 | systemd | /usr/lib/systemd/systemd | ふつう |
| 812 | 1 | nginx | /usr/sbin/nginx | ふつう |
| 4410 | 1 | update-helper | /tmp/.cache/update-helper | 一時フォルダの隠しフォルダから動いている |
学生が入力するセルは、このプレビューでは空白です。
いま端末で動いているプログラム名
ps -p $$ -o comm=ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
そのプロセスの本体はどこか
readlink /proc/$$/exeここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ファイルの種類は、最初の数バイトに出る
画像、文書、プログラムなどは、先頭に決まったバイトを持ちます。これがファイルシグネチャです。拡張子は名前の一部にすぎず、あとから書き換えられます。
バイトは16進数で書きます。1バイトは2文字です。たとえば、PNG画像は 89 50 4e 47 で始まります。
よくあるファイルシグネチャ
| 種類 | 先頭のバイト(16進数) | 文字で見ると |
|---|---|---|
| PNG画像 | 89 50 4e 47 0d 0a 1a 0a | 最初が読めない文字で、次に PNG |
| PDF文書 | 25 50 44 46 2d | %PDF- |
| ZIP圧縮 | 50 4b 03 04 | PK |
| JPEG画像 | ff d8 ff | 読めない文字 |
| Linuxのプログラム | 7f 45 4c 46 | 読めない文字で、次に ELF |
学生が入力するセルは、このプレビューでは空白です。
名前はjpg、中身はPNGのファイルを作る
printf '\211PNG\r\n\032\n' > photo.jpgここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
先頭の8バイトを16進数で読む
od -An -tx1 -N8 photo.jpgここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
文字で読める印を見る
printf '%%PDF-1.4\n' | head -c 5ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
塊の中から、印を頼りに切り出す
消したファイルの中身は、ディスクの上に残っていることがあります。ディスクのコピー(イメージ)の中から、先頭の印を探し、そこから切り出します。これがカービングです。
手順は3つです。印を探す。位置を知る。その位置から、決まった長さを切り出す。
小さなディスクの見本を作る
printf 'xxxx\211PNG\r\n\032\nyyyy' > disk.imgここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
印の文字PNGの位置を探す
grep -oba PNG disk.imgここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 見本の中のバイトの位置
| 位置(オフセット) | バイト | 意味 |
|---|---|---|
| 0から3 | xxxx | ただの詰め物 |
| 4 | 89 | PNGの印の最初のバイト |
| 5から7 | 50 4e 47 | 文字の PNG |
| 8から11 | 0d 0a 1a 0a | PNGの印の残り |
| 12から15 | yyyy | ただの詰め物 |
学生が入力するセルは、このプレビューでは空白です。
位置4から8バイトを切り出す
dd if=disk.img of=carved.bin bs=1 skip=4 count=8 2>/dev/nullここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
切り出したものを読む
od -An -tx1 carved.binここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
拡張子が .txt だから、ただの文字のファイルだ、と決める人がいます。拡張子は、誰でも付け替えられます。見るのは中身の先頭です。ただし、文字だけのファイルには印がなく、種類は「不明」になります。