7日目 メモリのセグメント化その3

前回の続き

 

GDBでスタックフレームが作られる様子を確認してみましょう

 f:id:simauma1203:20180116000536j:image

こんな風に関数の行と関数名でbreakするように設定すると、最初のブレークポイントが引数のプッシュ直前になって、次のブレークポイントが関数プロローグの直後になるらしい

 f:id:simauma1203:20180116230953j:image

x/5i $ripでそれが確認できる。

お引数を渡す直前なってますね👏

 

あとrip,rbp,rspの確認も。

復習ですが、これらはそれぞれ命令のアドレス、スタックフレームの局所変数のアドレス、スタックの一番上を指すレジスタです。

 

f:id:simauma1203:20180116000606j:image 

contつって進める

2つ目のブレークポイントに来たので関数プロローグが終わった直後ですね

ここでまたレジスタ確認。

rspの値もrbpの値も減ってますね。

スタックが積まれたからですね🎉

(スタックは低位アドレスに成長する為。)

 

 f:id:simauma1203:20180116000708j:image

 

ここでtest_funcを逆アセンブル

+20のfs:0x28って何だろ

わからん、+33まで何してるかわからん、、

とまあ、ここは飛ばしましょう!w

 f:id:simauma1203:20180116000724j:image

 

とまあ、取り敢えずflagとbuffer[0]のアドレスを指定してprint。

そしてx/16xw $rspってやる

 

すると上段が引数であることに気づきます

 

あれ、本の言ってることと違うなあ

高位アドレスにスタック伸びてるようにみえる。

 http://itpro.nikkeibp.co.jp/article/OPINION/20051018/222943/?ST=spleaf

このサイト見た感じこれ仕様な気がしますね

 

知識ある方ご教授下さい(-_-)