レジスタの命令のお勉強

前回、C言語とGo言語のコンパイル後のバイナリ比較などをやってました。

 

syachineko.hatenablog.com

 

今回は、どちらかというとReversingに向けて命令の勉強を・・・。

 

ということで、それぞれのバイナリで出てきた命令の意味を確認してみます。

 

# C言語

C言語で出てきた命令は以下。

push, mov, lea, call, pop, retn, jmp

 

それぞれ確認してみます。

 

## push

push rbp

 →rbpをスタックにpushしている。

  呼び出し元のメモリ番地をスタックに保存するらしい。

  処理の最初に入るおまじないの一つ。

 

## pop

pop rbp

 →スタックから番地を取り出してrbpへ格納する。

  関数の終わりで利用される。

 

## mov

mov rbp, rsp

 →rspをrbpに代入している。

  rspはスタックのトップのメモリ番地のようです。

  処理の最初に入るおまじないの一つ。

  mov自体は

   ・レジスタに値を入れる

   ・レジスタ間で値を転送する

   ・メモリからレジスタへ値を転送する

   ・メモリへレジスタから値を転送する

  が可能

 

## lea

 lea rax [0x602060]

 →[0x602060]のアドレスをraxレジスタに代入する

  2番目の引数には必ずメモリのアドレスが入る

 

参考資料:x86-64プロセッサのスタックを理解する - Qiita

 

思ったより理解に時間がかかってしまっていたので、また次回・・・。。

 

以上。