"h4v3_4_n1c3_pwn_c4mp!"のあとは任意の文字を入力しておけるということがわかる。memo.(memo)cccc次に、文字列が読み込まれる場所を見ると3つともStack上に読み込んでいる。3回それぞれの文字列の読込先もStack上に存在しており、さらに2回目と3回目の読込先は、1回目の文字列で上書きすることができる。↑3回目読込先32文字入力した後から、2回目と3回目の読込先情報がOverwriteできる。次に、書き込み可能な箇所を調べるためにメモリマップを見てみる。rw-p[stack]rwxな領域も存在することがわかる。ここで攻撃方針が立つ。1回目の書き込みで、2回目の読込先をrwx領域に、3回目の読込先をどこかのgotに変える。文字列と、その後にシェルコードを送り込む3回目の書き込みで、どこかのgotをシェルコードの先頭を指すよう書き換えるgotに飛んだときにシェルコード発動しかし、静的解析をしていると3回目のfgets(赤線)の後にはlibcの関数を呼ばずにmainが終了していることがわかる。x86のためBruteForceでリターンアドレスを書き換えることはできるがもっと良い方法はないものか。呼んでいる箇所があった。'__main__':main(sys.argv)これでシェルを取得することができた。#mainの後とか意識していなかったので勉強になった。echonetcatで接続すると、メッセージを入力するように言われ、入力するとそれを返すプログラムの模様。bytesAAAAABye!ファイルは同じくx86バイナリ。