1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バイナリで見る tar の中身と権限のしくみ

Posted at

これは何?

実際にバイナリがどうなっているのか色々と見ていくものです。
今回は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|

このようにしてバイナリが変更されていることがわかります。

少し補足しておくと、直接バイナリを変更することもできるのですがその場合はチェックサムの数値が合わなくなりエラーを吐きます。
ので、チェックサムを再計算してバイナリ側の辻褄を合わせる必要があります。
(今回はここまでしません)

最後に

ここまで見てくださってありがとうございました。
なかなか低レイヤまで見ることもないのでいい機会にもなりました。
何度も言いますが、悪用は厳禁です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?