KENJI’S BLOG このページをアンテナに追加 RSSフィード

Freezed...

2008-11-01

よく使うASM命令ベスト100位に説明つけてみた(7/10)

http://d.hatena.ne.jp/rootkit/20080818/1219042285

ベスト50位の中から、最低限これだけ覚えておけばきっと解析できる命令をまとめてみた。


関数呼び出しやEIP変更関連の命令

push	スタックへ値を格納
pop	スタックから値を取り出す
call	スタックに次の実行命令のアドレスを入れてジャンプ
leave	retの前に置かれるもの("mov esp, ebp"+"pop ebp"と同じ)
ret	スタックのトップにある値を取り出してそこへジャンプ
jmp	指定アドレスへジャンプ

値の操作系の命令

mov	レジスタ値やメモリの値を転送
movzx	渡したレジスタ値やメモリ値のサイズが異っても転送可能なmov
lea	説明しにくい。まぁ[]の中の計算結果がレジスタへ入ると覚えておけばおk
xchg	2つのオペランドを交換する(xchg eax, ebxでeaxとebxの値が交換される)
add	値を加算(足し算)
sub	値を減算(引き算)
inc	インクリメント 値に1加算
dec	デクリメント 値から1減算

条件分岐系の命令(重要

cmp	値を評価してフラグに反映
test	フラグだけ変化するAND命令(真 or 偽 だけを判断する時によく使う)
je	ZF=1 同じならジャンプ
jz	jeと同じ意味
jne	ZF=0 違うならジャンプ
jnz	jneと同じ意味
ja	CF=0 && ZF=0 符号なしで、大きいならジャンプ
jae	CF=0 符号なしで、以上ならジャンプ
jb	CF=1 符号なしで、小さいならジャンプ
jbe	CF=1 && ZF=1 符号なしで、以下ならジャンプ
jl	SF!=OF 符号ありで、小さいならジャンプ
jle	ZF=1 or SF!=OF 符号あり以下ならジャンプ
jg	ZF=0 && SF=OF 符号ありで、大きいならジャンプ
jge	SF=OF 符号ありで、以上ならジャンプ

ビット操作系の命令

xor	ただのxor(C言語の ^ ←これ)
and	ただのand(C言語の & ←これ)
or	ただのor (C言語の | ←これ)
shl	左方向にシフト(C言語でいう << ←これ)
shr	右方向にシフト(C言語の >> ←これ)
not	1の補数値にする(要するにビット反転命令)
neg	2の補数値にする(符号ありの値に対して、符号を反転させる)

データ列の操作命令(文字列処理など)

rep	ECXが0になるまで次の命令を繰り返す(比較命令時はZFフラグも見る)
movs	repと組み合わせることで大量のデータを一気に転送できる(EDIやESIと連動)

デバッグ系命令

int3	デバッグ用割り込み
nop	何もしない

並べてみると少し心許ない気もしますが、とりあえずこれだけ暗記しておけば何とかなると思う。

関連記事:http://07c00.com/text/revasm/revasm.txt

zzoruzzoru 2008/11/02 23:20 非常にいい情報だったので自分のブログ非公開で載せたんですけどもし良かったら公開してもいいですか?お返事お願いします

kenjiaikokenjiaiko 2008/11/02 23:46 全然OKですよー、このブログはcopyleftなんで基本何やってもいいでつ(笑