7日目 メモリのセグメント化その3
前回の続き
GDBでスタックフレームが作られる様子を確認してみましょう
こんな風に関数の行と関数名でbreakするように設定すると、最初のブレークポイントが引数のプッシュ直前になって、次のブレークポイントが関数プロローグの直後になるらしい
x/5i $ripでそれが確認できる。
お引数を渡す直前なってますね👏
あとrip,rbp,rspの確認も。
復習ですが、これらはそれぞれ命令のアドレス、スタックフレームの局所変数のアドレス、スタックの一番上を指すレジスタです。
contつって進める
2つ目のブレークポイントに来たので関数プロローグが終わった直後ですね
ここでまたレジスタ確認。
rspの値もrbpの値も減ってますね。
スタックが積まれたからですね🎉
(スタックは低位アドレスに成長する為。)
ここでtest_funcを逆アセンブル。
+20のfs:0x28って何だろ
わからん、+33まで何してるかわからん、、
とまあ、ここは飛ばしましょう!w
とまあ、取り敢えずflagとbuffer[0]のアドレスを指定してprint。
そしてx/16xw $rspってやる
すると上段が引数であることに気づきます
あれ、本の言ってることと違うなあ
高位アドレスにスタック伸びてるようにみえる。
http://itpro.nikkeibp.co.jp/article/OPINION/20051018/222943/?ST=spleaf
このサイト見た感じこれ仕様な気がしますね
知識ある方ご教授下さい(-_-)