お兄ちゃん!
色々なコマンドを覚えて
操作の幅を広げたいんだ!
今回はバイナリに関する
コマンドを見ていこう!
file
コマンドfile
は
ファイル形式を
表示するよ
file [オプション]... ファイル...
もしかしてテキストファイルにも使えるのかな?
うん、使えるよ! HTML などの種別も判別してくれるんだ
では
ls
のファイル形式を見てみようfile /bin/ls
ちょっとワクワクするね!
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=3ccc0d8aa8dc371f9c762c6e76823aa5b9d4041b, for GNU/Linux 3.2.0, stripped
この「ELF (Executable and Linkable Format)」 というのがLinux のバイナリ実行ファイル形式だよ
Windows の EXEみたいなものなのね!
strip
コマンド次は
strip
だよバイナリ実行ファイルからデバッグ情報などを削除してファイルサイズを大幅に減らしてくれるんだstrip [オプション]... ファイル...
デバッグ情報って普通の人は使わないと思うけど削除しても問題ないのかな?
基本的には大丈夫だよ
配布されているパッケージはほとんどがストリップ済みなんださっきの
file
の出力の最後をみてごらんstripped
)」strip
を使う機会は少ないけどstrings
コマンドstrings
はバイナリの中からテキストを探して抜き出すよstrings [オプション]... ファイル...
ls
に対して実行してみよう!strings /bin/ls
ls
の中に普通のテキストが混じっているの?/lib64/ld-linux-x86-64.so.2
v,nv
_ITM_deregisterTMCloneTable
__gmon_start__
...
.data
.bss
.gnu_debuglink
.gnu_debugdata
おわっ!たくさんの行が出力されたよ!
でも…その中に「help」とか 見覚えのある単語もあるね
バイナリ実行ファイルの中にはエラーやヘルプのメッセージが含まれていることが多いんだ
出力が多いので
less
でページ送りしながら見たりgrep
で探したい文字列だけ抜き出すといいよstrings /bin/ls | less
strings /bin/ls | grep 'help'
ldd
コマンドldd
は実行ファイルが参照しているライブラリを表示してくれるんだldd [オプション]... ファイル...
ls
を対象に調べてみよう!ldd /bin/ls
どんなライブラリを参照しているのかな?
linux-vdso.so.1 (0x00007fff41b49000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb3e6187000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fb3e617d000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb3e5e00000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fb3e60e1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb3e61e1000)
各行が必要としているライブラリだよもしこれらのライブラリが見つからないと
ls
は動かないんだコマンドが動かないときの原因調査に使えそうだね!
od
コマンドod
はファイルの中身を八進数や十六進数の数値で表示するよod [オプション]... [ファイル]...
オプション | 役割 |
---|---|
-x | 十六進数2バイト表示 |
-o | 八進数2バイト表示 |
バイナリは生のデータだから数字として見るんだね!
ls
を od
で覗いてみよう!表示が膨大なのでhead
と一緒に使うねod /bin/ls | head
どれどれ?
0000000 042577 043114 000402 000001 000000 000000 000000 000000
0000020 000003 000076 000001 000000 065420 000000 000000 000000
...
数字だらけでよく分からないね!
ls
の中身を八進数で表示しているんだ数字を理解できる必要は無いよ「 とだけ覚えておこう!
od
でバイナリの中身が読める」dd
コマンドdd
は入力元から出力先へデータを書き出すよdd [操作]...
操作 | 説明 |
---|---|
bs=バイト数 | 入出力ブロックサイズを バイト数 にする(デフォルトは 512 ) |
ibs=バイト数 | 入力ブロックサイズを バイト数 にする(デフォルトは 512 ) |
obs=バイト数 | 出力ブロックサイズを バイト数 にする(デフォルトは 512 ) |
count=個数 | ブロックを 個数 だけ処理する |
skip=個数 | 最初のブロックを 個数 だけスキップする |
if=ファイル | 入力を ファイル から読み込む(デフォルトは 標準入力 ) |
of=ファイル | 出力を ファイル へ書き出す(デフォルトは 標準出力 ) |
主にバイナリデータのコピーなどで使われるんだ
ちょっとどう使っていいのかわからないコマンドだよ…
確かにわかりづらいよねいくつか例を紹介するのでそれらを見てみよう!
以下のコマンドは1024 バイトのランダムな内容を持つ
data
ファイルを作成するよdd bs=1024 count=1 < /dev/random > data
1024 バイトを1ブロックとして1回だけ処理するんだね入力は
/dev/random
でランダムな内容を読み込みそれを data
ファイルに書き出しているんだダミーファイル作成などで使えそうだね!次のコマンドはストレージ
/dev/sda
の内容全てを二進数の 0
(ゼロ) で上書きするよdd < /dev/zero > /dev/sda
/dev/zero
は二進数の 0
(ゼロ) を出力し続けるファイルだよそれをストレージ
/dev/sda
に書き出しているんだねストレージの内容を全消去しているのかな?そのとおり!ストレージ上の全データを
0
(ゼロ) で上書きしてまっさらに消去するときに使われるコマンドだよこのコマンドはストレージ
/dev/sda
の先頭 512 バイトのデータをsda-mbr
ファイルに書き出すよdd bs=512 count=1 < /dev/sda > sda-mbr
ストレージ先頭512 バイトはストレージ内の構成が書かれている場合がほとんどだよこのデータのバックアップを作成しているんだ
dd
は特殊なコピー用途で使うんだね!他にも入出力の間でちょっとした変換を挟むこともできるけどここでは省略するね
今回はバイナリ関連コマンド
file
, strip
, strings
,ldd
, od
, dd
を学んだよ!バイナリを直接扱う機会はあまり多くないので最初はこのぐらいのコマンドを知っていれば十分だよ!