196の日記

セキュリティ系の勉強、その他開発メモとか雑談、忘れそうな計算式などを書き溜める場所になっています. githhubはUnity触っていた頃ものがメイン https://github.com/196kakinuma

スタックベースバッファオーバーフローがうまくいかない(ネズミ本)

あらかじめ言いますが、今から話すこと解決してません。今後わかるようになった時ように残しておくだけです。なので、何か期待してる方はブラウザバックで、、、ごめんなさい!


ubuntuの環境は18.04

CTF界ではおそらくお馴染み?のハリネズミ

を初心者ながら頑張って読んでたのですが、、p.102の2.4.1スタックベースオーバーフローの章です。
隣り合って宣言された変数の片方に、fgetsを用いて文字入力を行う際、変数のバッファー以上に入力のバッファー?を用意すると、エラーなしに変数の上限以上の値を入れることができる。ちょっと何言っているかわかりにくいので、コードを貼ります。



上のbufferは10文字確保してますが、fgetsでは64文字分入力が可能です。ここで、10文字以上入力するとbufferに隣り合ったzeroにも入力が反映されるという仕組み。ということで、入力には以下のものを使用します。これは、bufferには10文字分とりあえず入れておいて、zeroに12345678を入れようとする入力です。

echo -e 'AAAAAAAAAA¥x78¥x56¥x34¥x12' | bof2

これで本では成功しているのですが、"congrats!"が出力されていません。。。
f:id:thinline196:20180626003107p:plain


で、色々と試行錯誤を行いました。ひとまずたどり着いた方法がこちら


f:id:thinline196:20180626004128p:plain

ifを行なった後に、もう一度printfをしてやると成功します。。




僕の予想では、ifでzeroが呼ばれる際にあらかじめ保存してあった、本来のzeroの値(0)が呼び直されて、上書きした値が本来の値に上書きし直されるのかと思います。が、後ろでまたzeroが呼ばれる際は、使い回されるため(効率的に使用するため?)本来のzeroが呼び直されないのではないかと思います、、多分(根拠はないです)。

わかる人教えてくれたらとても勉強になるのになぁ、、頑張ります、、







、、ちなみに、これ確か前に調べて、関数として定義したものをmainで読んであげれば回避できるというようなものを見かけた気がします。

f:id:thinline196:20180626005053p:plain



追記

stackoverflow.com

こちらを参考にしてください。それと、ubuntu14.04ではこの問題は発生しないので、勉強だけなのであればこちらを使用してください
Ubuntu 14.04.5 LTS (Trusty Tahr)