KDOC 210: 『0と1のコンピュータ世界 バイナリで遊ぼう!』
この文書のステータス
- 作成
- 2024-08-04 貴島
- レビュー
- 2024-08-11 貴島
概要
0と1のコンピュータ世界 バイナリで遊ぼう!はバイナリによる遊び方を紹介する本。バイナリへの親しみは特定の分野で必要な技能だが、とっつきにくさがある。遊んで親しむのが有効だという。
メモ
- 親指から薬指までの4本なら、2進数を自由に数えられる。このような指でのカウントを日々行うことで、2進数の数え方は自然と身につくだろう。2進数に慣れるまでは、これをトイレや電車の中で、1日1回はやるようにするとよい。1ヶ月もしないうちに驚くほど2進数の感覚が見についているだろう(p7)
echo "obase=16; ibase=16; ABCD+1111" | bc
BCDE
echo ABCDEFGHIJKLMNOPQRSTUVWXYZ | xxd echo abcdefghijklmnopqrstuvwxyz | xxd echo 0123456789 | xxd
00000000: 4142 4344 4546 4748 494a 4b4c 4d4e 4f50 ABCDEFGHIJKLMNOP 00000010: 5152 5354 5556 5758 595a 0a QRSTUVWXYZ. 00000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70 abcdefghijklmnop 00000010: 7172 7374 7576 7778 797a 0a qrstuvwxyz. 00000000: 3031 3233 3435 3637 3839 0a 0123456789.
- 本書のテーマは、バイナリで遊ぶことだ。もっと遊びを通して、楽しみながら慣れる。積極的に体を動かすことで、頭で考えるだけよりも、より早くバイナリに親しむことができる可能性がある。「バイナリ筋トレ」だ(p21)
- バイナリけんけんぱ(p22)
- バイナリ体操(p23)
- SECCONのようなセキュリティ系のイベントでバイナリかるたのような競技が行われるのは、バイナリデータを目視で判別することがあるから。一般に「目grep」と呼ばれ、セキュリティ分野で注目されている技術、だという(p26)
echo "hello, world" > input tar cvf out.tar input xxd out.tar | head -n 50 rm input out.tar
input 00000000: 696e 7075 7400 0000 0000 0000 0000 0000 input........... 00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: 0000 0000 3030 3030 3636 3400 3030 3031 ....0000664.0001 00000070: 3735 3000 3030 3031 3735 3000 3030 3030 750.0001750.0000 00000080: 3030 3030 3031 3500 3134 3635 3334 3433 0000015.14653443 00000090: 3031 3400 3031 3134 3532 0020 3000 0000 014.011452. 0... 000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000100: 0075 7374 6172 2020 006f 7261 6e67 6500 .ustar .orange. 00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000120: 0000 0000 0000 0000 006f 7261 6e67 6500 .........orange. 00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000200: 6865 6c6c 6f2c 2077 6f72 6c64 0a00 0000 hello, world.... 00000210: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000220: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000230: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000240: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000250: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000260: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000270: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000280: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000290: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000300: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000310: 0000 0000 0000 0000 0000 0000 0000 0000 ................
- ファイルフォーマットに応じて、様々な特徴が見てとれることになる。ほかの圧縮形式ではどのような特徴を持ったビットマップになるか試してみるとよい。tar, zip, LHA, GZIP…(p43)
- 実行ファイルには、太い縦縞模様になるという特徴がある。実行ファイルは、機械語コードの領域や文字列リテラルなどのリードオンリーなデータ、性的変数などの読み書き可能なデータ、など様々な種類のデータが領域分けして配置されているため。機械語コードは先頭付近にある場合が多く、乱数的なビットマップが見られる。機械語コードの縦に細い線が出るのは固定長命令のRISCプロセッサの特徴。(p43)
- さらにはっきりと線が出るのはARMプロセッサの機械語コードの特徴である。ARMは1命令が4バイト固定長なのだが、機械語コード中の最上位ビットに「条件コード」という4ビットの領域を持っている。その命令を実行するかどうかを指定するビット列で、条件判断を命令単位で行える。しかし多くの命令では「無条件に実行する」という指定になり、それが2進数で「1110」つまり「0xE」になる。このためARMの機械語コードは0xEで始まる場合が多い(p43)
- 機械語コードが雑然としているときは、x86などの可変長命令である。逆にRISC系などの固定長命令だと、整然とする(p45)
- x86の機械語コードは総体アドレス指定が多用されるために0xFFというバイトデータがコード中に出やすく、横長の白い点がビットマップに出やすい(p45)
- 実行ファイルはビットマップ中に規則的な縦線が出る領域が存在する場合が多い。これは再配置情報などの配列状のデータの特徴である(p45)
- バイナリかるたの生成システムでも、XPMを利用してビットマップ画像を生成している(p51)
- バイナリカレンダー。ビットマップ画像とダンプリストとASCII表示の画像を絵柄にしたカレンダー(p61)
- システムコール・クロスワード(p70)
- NOP命令はほんとうに「何もしない」という命令が定義されているわけではなく、実はこのように「実際には動作が定義されている命令なのだけど、結果的に影響が出ないことになっているので、その命令をNOPとして扱っている」という場合が多い(p76)
- 16進かるた(p88)
- このような暗記による学習は意外に効果的だ。不明なバイナリダンプを解析する際には、パッと見て何かに気づくかというひらめきが重要になる。そのようなひらめきのためには、機械語コードをどれだけ覚えているかが助けになるだろう(p96)
- もともとx86のレジスタ名はABC順なわけではなく、それぞれ意味を持っている名前である。たまたまABCDになっているだけ。またEAX,ECX,EDXは関数呼び出しによって値が破壊されうる「揮発性」のレジスタ、それ以外は値が保存される「不揮発性」のレジスタとして定義されている(p100)
- アセンブラ短歌(p108)
- セキリュティ分野で攻撃手法として利用されるバッファオーバランなどの脆弱性の根本を理解するためには、アセンブラの知識は必須である。アセンブラを知らなければ、脆弱性の根本原理を知ることはできない。しかしアセンブラ・コーディングの技術は空洞化している部分もあり、教育や学習が難しい。このような状況に対して、気軽に学習するための題材が必要である(p120)
- バイナリ鑑賞(p204)
- フォーマットを知らなければファイルを読めないということはまったくない。音楽の理論を知らなければ音楽を楽しめないということはないし、作文ができなければ読書を楽しめないということもない。バイナリもそれと同じで、まずはなんとなく眺めてみて、感じてみることが大切(p219)
- 鑑賞していてもっとも面白いバイナリファイルは実行ファイル、だという(p220)
- あまり難しいことは調べずにもっと感覚的に、複数のアーキテクチャを横並びにしてなんとなく違いを感じるような見方をするのも悪くない(p233)
- 低レイヤーを学習することは、セキュリティ業界では重要視されている。攻撃手法の理解のために重要なためである(p235)
関連
なし。