お兄ちゃん!
色々なコマンドを覚えて
操作の幅を広げたいんだ!
今回はバイナリに関する
コマンドを見ていこう!
/bin などに置かれている
コマンドのファイルは
バイナリだったね!
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 を学んだよ!バイナリを直接扱う機会はあまり多くないので最初はこのぐらいのコマンドを知っていれば十分だよ!