大熱血!アセンブラ入門 Part1メモ
理由:正しいサポート付きでアセンブラを読む練習を積みたかったから。
本の序盤、「はじめに」からも学べることがあるとても良い本。
アセンブラを学習する上で参考になったこと、読む上で参考になったことを以下にメモ。
・アセンブラ学習には、検体コードとコンパイラと逆コンパイラの3つが最低限必要
→バイナリエディタも必要。
・アセンブラを読むときに失敗する一番の原因は、とにかく「きちんと読もうとすること」。
・「調べる」のではなく、「推理」「推測」をすること。
・一字一句解析していこうとすると、難しいですしつまらないです。「目的」を意識して読むことが大切です。
・大切なのは「処理の目的」を意識すること。一字一句正確に解読するのはその後の話。
→しかしこのためには、推理をする対象であるアセンブリ前の高級コードの存在が必須?
・コンパイラが機械的に生成するアセンブラにはパターンがある。
1スタック確保
2スタックへのレジスタの退避や自動変数生成
3関数終端での戻り値準備とスタックからのレジスタ復旧処理
→ブロックとして処理を捉える
※自動変数:関数中で利用されるローカル変数のこと。
・オペコードはバイト列の先頭にあることが多いが、先頭と終端に分かれていたり、はたまた中央に寄っていたりと個性的。
・アセンブラの推理推測は類似処理の比較で行うが、その際には、16進だけでなく2進表現も比較してみると幸せになれるかもしれない。
・「アドレス」というのはメモリのお話。他方「オフセット」というのは実行ファイルの中でのあるポイントを先頭アドレスとした場合のその先頭からの距離の話。
・アセンブラのオペコードのアルファベットに敏感になると、それだけで意味が推測できるかもしれない。
例:
w→word
h→half
s→short
l→long
b→byte
他のアセンブラ業界用語も覚えておくと読みやすくなる。
例:
pc→program counter(実行アドレスを格納)
lr→link register(関数からの戻り先アドレスを格納)
スタックポインタ:メモリ領域のどこまでを使用しているかを表すレジスタ
スタックフレーム:スタック領域の占有領域の区切りの単位のようなもの?
branch→条件分岐によるアドレス移動
jump→条件分岐によるアドレス移動
・スタックポインタの利用して自動変数を利用する時の手順:まず大きく下方伸長してスタック領域を確保する。次に下方伸長した位置から下方伸長開始時の位置まで戻って行くかのように順次自動変数に代入していく。
・長い処理を見るときのコツは対となる処理を見つけること。だいたいその関数の最初と最後に集まっている。
CTFとかでも絶対出てくるバイナリ関連の問題ですが、アセンブラ読解のお作法は最低限身に着けておかないとダメだなと、改めて思いました。次は2章。