sekai013's blog

JavaScriptとかを勉強する

KSNCTF #31 KanGacha [わからん!!!!!!!!!!]

問題

ksnctf - 31 KanGacha

考えたこと

与えられてるソースにはだいたいこんなことが書いてる.

  • $salt: フラッグ.

  • $shipname : 大きさ11 の配列で $shipname[10]$salt が含まれてる.

  • 0..9 までの整数のなかからランダムにひとつ選ぶ.

  • ship: cookie. ランダムに選んだ整数をコンマ区切りで保存してる.

  • signature: cookie. $saltship を連結した文字列のSHA512ハッシュ.

  • $saltship を連結して暗号化したものと, signature が一致していれば, ship の各数字 n について $shipname[n] を出力する.

要は ship=10; signature=hogehoge という感じで cookie を作れればいいという話だと思うけど, 肝心の $salt がわからないと正しい signature がわからない.
shipsignature の組はたくさん手に入るけど SHA512 の前には無力!!!!死!!!!!!

と思ってググってたらこういう記事たちを見つけた.

Length extension attack っぽい.

未知の文字列 salt に対して hash(salt + hoge), hoge, salt.length が既知のとき任意の文字列 piyo に対して hash(salt + hoge + padding + piyo) を求められるというようなことが書いてある気がする.

とりあえず紹介されている Hashpump を導入して, ガチャを回して ship=1; signature=24b7447578c89ea8f5f8854d60e253f23bb5b8856d8a135c19af423db354ac60a1a4c932cecd800a0550211e8cc6e28e73e1ac93e7b9c786adc24702e48701c5 となることを確認して, 2つのブログ記事とか, もっと近そうな
write-ups-2014/plaid-ctf-2014/mtpox at master · ctfs/write-ups-2014 · GitHub とかを参考にしてコード書いたけど, 何回書いても通らない.

gist.github.com

これで $salt の長さを正しく指定してたら '1' + padding + ',10' とそれに対応する signature が得られて, ソース中の

hash('sha512', $salt.$_COOKIE['ship']) === $_COOKIE['signature']

を通過できて$shipname[10]が表示できると思うんだけど $salt の長さ1~500まで試しても上の条件を通過できていなかった.

さっぱりわからん・・・数ヶ月くらい考えては諦めしてていい加減投げたいけど方針間違ってない気がしててそれでも通らないの気持ち悪くて投げるに投げられない・・・

何かおかしいのはわかるけどわかるけど Length Extension Attack の問題の writeup 見てもこれと似たようなことをしていて何がおかしいのかわからん・・・しんどい・・・