6日目 メモリのセグメント化その2
↑育毛の広告がおおいですね
前回に引き続きメモリを詳しく見ていくぞい
参考にしてる本がx86向けなのでレジスタの名前とか所々変かもしれません。
単純なプログラムです。
これについて詳しく調べていきます。
main関数と定義した関数をそれぞれ逆アセンブルします。結果は以下の通り。
main+0~1をプロシージャプロローグといいます。プロプロです。関数プロローグともいいます。多分。
これらの命令でフレームポインタをスタック上に退避してこの関数で宣言した局所変数のメモリをスタックに確保します。
ということはtest_function関数の関数プロローグは+0~4ですね
私的メモですが、esp、ebpはそれぞれ現在のスタックフレームの局所変数を参照する為のもの、スタックの一番上を指すものです
だからebpがプッシュ、ポップされてるんですね。
さらにmain+4~19に引数を渡してtest_func+8~17でスタックに配置してるっぽいです。
本だとそのままesp+XXに引数をmovしてるけど
違ったみたいですね。
因みにFILO(先入れ後出し)だから逆順で引数が渡されてます。
test_func+35あたりに着目してみると
0x7a69=31337(10)なのでrbp-0x24がflagのアドレスだと気づきます
+42の0x41はAの文字コードと一致&BYTE PTRでcharと同じ1バイトなのでAを配列にぶち込んでるとこだとおもいます。そこから伸びるのがbufferってことですかねー
あとmain+24のcallで0x400546のtest_funcが呼び出されてるみたいです。
callでeipを関数の先頭にしてるんですね。
そのあとtest_funcの関数プロローグがスタックフレームの作成を引き継いでます。
まずebpの現在の値がスタックにプッシュされます。
この値は退避されたフレームポインタ(SFP)といいます。
mainに制御を返す時にebpの値を復元するために使うらしいです。へー
そしてebpに現在のespの値をコピーします。
新しいフレームポインタを作って
局所変数を参照するためらしい。
イメージ図。
字が酷いやが。
上がスタックの先頭(積んでくところ)
先頭の方は低位アドレス。
どうやったら画像大きく出来るんじゃろ
これで本の3ページ分。先が遠いやばいw