FC2ブログ
2017/06/06

jtalesを解析してみる その2

アセンブリ言語の解析をやる上で押さえておいたほうが良さそうなことをまとめてみました。

レジスタ
ebp : 関数のアドレスを確保するのに使用する主なレジスタ
esp : 関数のアドレスをebpに移すために一時的に使うレジスタ
eax/ax/al/ah : アキュムレータレジスタ。算術演算操作の結果が格納される。
ecx/cx/cl/ch : カウンタレジスタ。シフトローテート命令?とループ命令に使用される。
edx/dx/dl/dh : データレジスタ。算術演算操作とi/o操作?に使用される。
ebx/bx/bl/bh : ベースレジスタ。セグメントモードでのds(データへのポインタ)に格納されたデータを指し示すために使用される。
esi/si : ソースレジスタ。ストリーム操作でのソースへのポインタとして使用される。
edi/di : デスティネーションレジスタ。ストリーム操作でのデスティネーションへのポインタとして使用される。

レジスタによって扱えるビット数が違うらしい
32ビット: eax、ecx、edx、ebx(80386以降で拡張され使用可能)
16ビット: ax、cx、dx、bx
8ビット: al、cl、dl、bl(ax、cx、dx、bxのlsb?側8bit)
8ビット: ah、ch、dh、bh(ax、cx、dx、bxのmsb?側8bit)

(上記レジスタの情報はWikiより)

うん、ポインタとか懐かしい響き。

各種命令

ロードとストア

movl (%<src>), %<dest>
レジスタ %<src> の値に offset を足したアドレスのメモリの内容 32bit (1 word)分を、レジスタ %<dest> に読み込む。オフセット付きレジスタ間接アドレッシングによる

movl %<src>, (%<dest>)
レジスタ %<dest> の値に offset を足したアドレスに、レジスタ %<src> の内容 32bit (1 word)分を書き込む。オフセット付きレジスタ間接アドレッシングによる

movl $<integer>, %<dest>
をレジスタ %<dest> に書き込む。 load immediate (ロード即値)命令。

movl %<src>, %<dest>
レジスタ %<src> の値をレジスタ %<dest> に書き込む。

pushl %<r>
レジスタ %<r> の値をスタックに積む。 つまり、レジスタ %esp の値 - 4が指すアドレスにレジスタ %<r> の値を書きこみ、%esp の値を -4 増やす。

演算命令

addl %<r>, %<s>
レジスタ %<r> とレジスタ %<s> の値を加算した結果を、レジスタ %<s> に書き込む。

subl %<r>, %<s>
レジスタ %<s> からレジスタ %<r> の値を減算した結果を、レジスタ %<s> に書き込む。 引かれる数がレジスタ %<s> であることに注意。

imull %<r>, %<s>
レジスタ %<r> とレジスタ %<s> の値を乗算した結果を、レジスタ %<s> に書き込む。

cmpl %<r>, %<s>
レジスタ %<r> とレジスタ %<s> の値を比較し、結果を条件レジスタに書きこむ。 %<r> > %<s> なら less、%<r> < %<s> なら greater である。

分岐命令

je

jl

jmp

call

ret
次の命令のアドレスをスタックから pop し、そこへ分岐する。 Return 命令。

leave
%ebp の値を %esp にコピーし、スタックから pop した値を %ebp に保存する。

関数呼び出しに必要な命令

スタック(PUSH・POP命令)
スタック は、引数やローカル変数の保持など一時的に保存するのに使われる。
スタックに対してできる操作は、PUSHとPOPの2つ。 PUSHで、データをスタックに積み(スタックではデータを格納することを「積む」ともいう)、POPで、データを取り出す(一番最後に格納したデータが取り出されることです。)
イメージしやすい一例として四角い箱(スタック)にちょうど収まるような大きさの紙(データ1から順に1,2,3とします)を順に積んでいきます。(PUSH)そしてその四角い箱から紙を2枚取り出す(POP)場合、四角い箱の一番上に入ってる紙はデータ1です。

アセンブリの記述方法
SolarisはLinuxなのでAT&T記法と呼ばれる方法で記述される。
[ニーモニック] [操作元] [操作先]

ところでアセンブリ言語を解析しようとしている人がもしいたならまずC言語などのプログラミング言語をある程度できるようになってから挑戦した方がいいと思います。変数ってなに?条件分岐?関数??アドレス???となってしまうのはよくあることなので(汗)

とりあえずこれくらい覚えておけば多少は読めるかな~。解析してる最中わからない所があればまたグーグル先生にでも聞くとします。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

コメント

非公開コメント