これは何?
実際にバイナリがどうなっているのか色々と見ていくものです。
今回はTarコマンドなどを利用して遊んでいきます。
※ セキュリティや低レイヤについての学習を目的としています。悪用目的等では行わないでください。
tarとは複数のファイルを一つにまとめる形式の一種です。
tar化すると圧縮っぽく見えることもありますが、今回の場合はファイルを圧縮する内容よりもtar化した際の方が大きくなります。
理由としてはファイル圧縮時に必要な情報も生成しているからです。
何が違うのか、その差分を実際に見ていきましょう
まず最初にファイルを作り上げていきましょう。
% echo "hello world" > hello.txt
% tar cf hello.tar hello.txt
% ls
hello.tar hello.txt
この二つがあるとします
実際にその二つのファイルのバイナリを見ていきましょう
% hexdump -C hello.txt
00000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a |hello world.|
0000000c
合計でファイルサイズは 12バイトとなります
% hexdump -C hello.tar | tail -n 1
hexdump -C hello.tar | tail -n 1
00001000
となっており計算すると4096バイトとなります。
明らかにサイズが増えてますよね。
それは必要なメタ情報なども含めてまとめているからです。
実際に中身をバイナリとしてみるとその差を感じます。
(長いので抜粋)
% hexdump -C hello.tar | head -n 2
00000000 2e 5f 68 65 6c 6c 6f 2e 74 78 74 00 00 00 00 00 |._hello.txt.....|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
このような形で色々と書かれています。
バイナリを見ながら色々
hello.txtについての実行権限も確認しておきましょう
% stat -f "%A %Sp %N" hello.txt
644 -rw-r--r-- hello.txt
このように
所有者は書き込み権限、読み取り権限
グループの権限は、読み取り
その他、読み取り
となっており、実行権限は誰にもついていない現状です。
これを一回バイナリで見てみましょう。
これは
% hexdump -C hello.tar | grep 00000060
00000060 00 00 00 00 30 30 30 36 34 34 20 00 30 30 30 37 |....000644 .0007|
ここには、tarファイルのmode(権限)が記録されています。
tar形式では、100バイト目(0x64)からの8バイトがmodeフィールドです。
この場合:
- 100バイト目から 30 30 30 36 34 34 20 00
があり
- これは ASCII で "000644"
を意味します
つまりこのtarアーカイブのファイルは、権限 644
(rw-r--r--)が設定されていることが分かります。
次に権限を変更してみたらバイナリがどのように変更されるのかやってみましょう。
% chmod 755 hello.txt
としてみて
% stat -f "%A %Sp %N" hello.txt
755 -rwxr-xr-x hello.txt
これは
- 7 -rwxr 自分は全権限
- 5 - xr グループは実行と読み取り権限
- 5 -x 他は実行権限のみ
と変更しました。
さて先ほどのバイナリはどのように変化するでしょうか
% hexdump -C hello.tar | grep 00000060
00000060 00 00 00 00 30 30 30 36 34 34 20 00 30 30 30 37 |....000644 .0007|
あれ?何も変わってない!?
まぁそうですよね...
だって、変更前のものをアーカイブしているものですから。
てなわけでもう一回、tarファイルを生成します。
% hexdump -C hello.tar | grep 00000060
00000060 00 00 00 00 30 30 30 37 35 35 20 00 30 30 30 37 |....000755 .0007|
このようにしてバイナリが変更されていることがわかります。
少し補足しておくと、直接バイナリを変更することもできるのですがその場合はチェックサムの数値が合わなくなりエラーを吐きます。
ので、チェックサムを再計算してバイナリ側の辻褄を合わせる必要があります。
(今回はここまでしません)
最後に
ここまで見てくださってありがとうございました。
なかなか低レイヤまで見ることもないのでいい機会にもなりました。
何度も言いますが、悪用は厳禁です。