Pragyan CTF 2018 writeup part2
本番中着手してて解けずに終了後に解いたやつ
[web] Unfinished buisiness (100pts)
[web] Authenticate your way to admin (150pts)
[binary] Unbreakble Encryption (350pts)
[web] Unfinished buisiness (100pts)
I'm admin にチェックを入れてログインすると、admin.php -> unavailable.php とリダイレクトされる。
burp suiteを使ってadmin.phpの中身を除くとフラグがある。
[web] Authenticate your way to admin (150pts)
ログインフォームと、ソースコード2つを渡される。
adminとしてログインできればフラグが表示される。
ソースコードを見ると、ログインの認証処理をする前に $_SESSION["id"] = $identifier; としているのがわかる。
そこで、ブラウザでログインフォームを2つ開いておく。
片方は普通にログインをする。
もう片方で、admin/(適当) としてログインを試行し、失敗する。
先ほどログインした方をリロードすると、$_SESSION["id"] = "admin"; として上書きされているため、フラグが表示される。
[binary] Unbreakble Encryption (350pts)
CBCモードでAESの暗号化/復号を行うプログラム。
鍵、IVは不明であり、フラグの暗号文が渡される。
ユーザの入力を受け付けて暗号化/復号を行うが、脆弱性は自明なFSB、BOFが存在する。
おそらく色々な解法があるが、方針としては以下の通り。
1周目
・FSBにより.fini_arrayを書き換えmainに戻す
・同時に、スタックのアドレス、canaryの値をリークする
2周目
・BOFによりROPを仕込む
・ROPによりサーバ上のIV、keyを出力させる
ROPの内容
・read_AES_key を呼び、bss領域に鍵を読み込む
・putsを呼び出力(fflushしてないため出力はされない)
・read_AES_IV を呼び、bss領域の鍵の直後に読み込む
・putsを呼び出力
・fflushを呼ぶmain内に戻り出力
これにより、サーバ上の鍵とIVを手に入れる。
最後のfflushは直接呼ぼうと思ったらアドレス内に\x0bがあったのでこのような形をとった。
鍵:BEGIN-KEY{4x@$^%`w~d##*9}END-KEY
IV:IV{212&5^V!-!}IV
これらを用いて、適当な方法で暗号を復号する。
pctf{th4t_m0m3n1-wh3n~f0rm41`SpiLls_0v3r}
せっかくなので、サーバの生きてるうちにwebの残り2問もやりたいと思う。