MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

アセンブラの基本文法のメモ

たのしいバイナリの歩き方

たのしいバイナリの歩き方

これ読んでいます。これで文法の基礎が勉強できる箇所がありましたので自分用にメモしておきます。

基礎知識

走り書きメモですみません。

Python(核心部分はCで実装)とかRuby(核心部分MRIはCで実装)とかJavaとか(高級言語

コンパイル

バイトコード(中間コード)(より低級言語。パッと見アセンブラに似た感じ)→逆アセンブルアセンブラコードを解読(可読)→バイトコードは逆コンパイルができる!ツールJad、JadClipse

仮想機械(MV)上で実行(JavaだとJITコンパイラ(=Just in Time)が機械語ソースを動的に書き出す(イメージ?))

Cとか

gccなどでコンパイル

アセンブリソースができる

アセンブラ

機械語(バイナリ)→アセンブルアセンブラコードを解読(可読,CTF頻出)

レジスタ

CPUのメモリ領域のこと スタックはメモリの扱われ方でデータがロケット鉛筆式に出入りするデータ型っぽいもの

EAX
ECX
EDX
EBX
ESP スタックの管理に使われる
EBP スタックの管理に使われる
ESI
EDI
EIP 現在のプロセスの管理に使われる

フラグ

C・・・Oまでで0と1の値がはいる。Fをつけてアセンブラ上で扱われることがある

C 0or1:CF
P 0or1:PF
A 0or1:AF
Z 0or1:ZF
S 0or1:SF
T 0or1:TF
D 0or1:DF
O 0or1:OF

頻出文法

= MOV (move)
+= ADD (add)
-= SUB (substract)
++ INC (increment)
-- DEC (decrement)
if == : else: CMP(compare) (ユーザー認証の比較ででるためCTFでキーになる可能性あり)
if == : ZF=1 else: ZF=0 TEST(test) (ユーザー認証の比較ででるためCTFでキーになる可能性あり)
if ZF==1 : else: JE (just exist?)
if ZF==0 : Goto Func() JNE (just not exist?)
Goto Func: JMP (jump)
Func(): CALL

これでバイナリ解析が少しはできそうだ^^

勉強・引用・参考元の本と記事

たのしいバイナリの歩き方

たのしいバイナリの歩き方

bambinya.hateblo.jp

Eclipseで逆コンパイルを行う:JavaTips 〜Eclipse活用編 - @IT