問題
解いてみた
ソースを見てみます。
flag()が実行されればflagの中身が表示されそうです。
ですけど、flag()はどこからも呼ばれていないんです。
処理の流れとしては
30行目のmain()が実行される。
36行目の処理で23行目のvuln()に移動する。
28行目でvuln()が終わって呼び出しもとの次の処理37行目に移動する。
終了。
という感じです。
vuln()からmain()に戻るアドレスをいじってflag()に飛ばす作戦でいいのかな。
つまり28行目のvuln()が終わったときに「次は37行目ですよ」という処理を書き換えて「次は11行目ですよ」とすれば良い。
と、理論は分かっても実際やれるかどうかはわからない。
とりあえず、shellの方で実行してみます。
実行してみます。
実行すると1回入力状態になって何か入力するとジャンプのアドレスが表示されて終了する。
この表示されるアドレスはソースをみたところ
vulnが戻る先のアドレスっぽいです。
ということで長い文字を入れればスタックが書き換わってここのアドレスも書き換わるはずです。
長めの文字を入れてみます。
さっきの実行でジャンプ先は「0x8048705」だということが分かってます。
この1回目をみると「0x8048705」で合っています。
2回目がジャンプ先が2個出てくる意味はよく分かりません。
3回目をみると「0x8040061」に変わってます。61はaの意味です。
aを増やすごとに61が増えていくことが分かります。
なのでこれで書き換えることができます。
次にやることは、flag()のアドレスです。
gdb ./vuln
を実行したあと
とやるとflagのアドレスがわかります。
「0x80485e6」です。
*とか&はよくわかってません。
全部やってみましたが、全部一緒の結果でした。
リトルエンディアンに注意しながら実行すると
ということでflagが出ました。