LoginSignup
0
0

More than 3 years have passed since last update.

picoCTF 2019 OverFlow 1 - Points: 150

Posted at

問題

image.png

解いてみた

ソースを見てみます。

image.png

flag()が実行されればflagの中身が表示されそうです。
ですけど、flag()はどこからも呼ばれていないんです。

処理の流れとしては

30行目のmain()が実行される。
36行目の処理で23行目のvuln()に移動する。
28行目でvuln()が終わって呼び出しもとの次の処理37行目に移動する。
終了。

という感じです。
vuln()からmain()に戻るアドレスをいじってflag()に飛ばす作戦でいいのかな。
つまり28行目のvuln()が終わったときに「次は37行目ですよ」という処理を書き換えて「次は11行目ですよ」とすれば良い。

と、理論は分かっても実際やれるかどうかはわからない。
とりあえず、shellの方で実行してみます。

image.png

実行してみます。

image.png

実行すると1回入力状態になって何か入力するとジャンプのアドレスが表示されて終了する。
この表示されるアドレスはソースをみたところ

image.png

vulnが戻る先のアドレスっぽいです。
ということで長い文字を入れればスタックが書き換わってここのアドレスも書き換わるはずです。
長めの文字を入れてみます。

image.png

さっきの実行でジャンプ先は「0x8048705」だということが分かってます。
この1回目をみると「0x8048705」で合っています。
2回目がジャンプ先が2個出てくる意味はよく分かりません。
3回目をみると「0x8040061」に変わってます。61はaの意味です。
aを増やすごとに61が増えていくことが分かります。
なのでこれで書き換えることができます。

次にやることは、flag()のアドレスです。

gdb ./vuln

を実行したあと

image.png

とやるとflagのアドレスがわかります。
「0x80485e6」です。
*とか&はよくわかってません。
全部やってみましたが、全部一緒の結果でした。

リトルエンディアンに注意しながら実行すると

image.png

ということでflagが出ました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0