きゅうり。

主にCTF関係のことを書いていく気がします

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の中身を除くとフラグがある。

f:id:Kyuri:20180305194942p:plain

 

[web] Authenticate your way to admin (150pts)

ログインフォームと、ソースコード2つを渡される。

adminとしてログインできればフラグが表示される。

ソースコードを見ると、ログインの認証処理をする前に $_SESSION["id"] = $identifier; としているのがわかる。

そこで、ブラウザでログインフォームを2つ開いておく。

片方は普通にログインをする。

もう片方で、admin/(適当) としてログインを試行し、失敗する。

先ほどログインした方をリロードすると、$_SESSION["id"] = "admin"; として上書きされているため、フラグが表示される。

f:id:Kyuri:20180305195250p:plain

 

[binary] Unbreakble Encryption (350pts)

CBCモードでAESの暗号化/復号を行うプログラム。

鍵、IVは不明であり、フラグの暗号文が渡される。

ユーザの入力を受け付けて暗号化/復号を行うが、脆弱性は自明なFSBBOFが存在する。

おそらく色々な解法があるが、方針としては以下の通り。

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問もやりたいと思う。