auの日記

プログラミング初心者の日記。(auはハンドルネームです)

ESPとEBPについて悩んでみた

auです。

アセンブリについて勉強していたのですが、ESPとEBPの扱いでめちゃめちゃに悩みながらやっていたので、理解できたことを少しでもまとめようと思います。

EBP

EBPは、ベースポインタと呼ばれ、実行している関数の底を指します。

labelで関数が呼ばれた際に、EBPを関数分の領域の底まで下げる(スタックだとアドレスが小さくなっていくため下げると表現する)ことによって、新しく呼び出された関数の底を指すことができます

ESP

ESPは、スタックの一番上のデータを指します。スタック領域に何かデータが積まれるたびにこれは一番上に持ち上がります。つまり、EBPとESPの差分がその関数の使用している領域になるのです。

関数が終わり次第、EBPの場所までESPを上げることで、関数の終了処理が始まり、EBPのバックアップ(EIPのことなのかな?)をpopし、returnすることで、元のmainの底までEBPを下げることができ、mainの続きの処理に戻ることができます。この際に、returnの指す先のアドレスをscanfなどにより無理やり書き換えることにより、普段使用しないような関数に飛ぶことができるのです。



頭の中で計算が追いつかなかったので、文字でまとめてみたら、そこそこスッキリしました。ただ、EIPとreturnの違いがよく分からなかったので、もう少し調べてみる必要があると思いました。