KSNCTF #31 KanGacha [わからん!!!!!!!!!!]
問題
考えたこと
与えられてるソースにはだいたいこんなことが書いてる.
$salt
: フラッグ.$shipname
: 大きさ11 の配列で$shipname[10]
に$salt
が含まれてる.0..9 までの整数のなかからランダムにひとつ選ぶ.
ship
: cookie. ランダムに選んだ整数をコンマ区切りで保存してる.signature
: cookie.$salt
とship
を連結した文字列のSHA512ハッシュ.$salt
とship
を連結して暗号化したものと,signature
が一致していれば,ship
の各数字 n について$shipname[n]
を出力する.
要は ship=10; signature=hogehoge
という感じで cookie を作れればいいという話だと思うけど, 肝心の $salt
がわからないと正しい signature
がわからない.
ship
と signature
の組はたくさん手に入るけど 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 とかを参考にしてコード書いたけど, 何回書いても通らない.
これで $salt
の長さを正しく指定してたら '1' + padding + ',10'
とそれに対応する signature
が得られて, ソース中の
hash('sha512', $salt.$_COOKIE['ship']) === $_COOKIE['signature']
を通過できて$shipname[10]
が表示できると思うんだけど $salt
の長さ1~500まで試しても上の条件を通過できていなかった.
さっぱりわからん・・・数ヶ月くらい考えては諦めしてていい加減投げたいけど方針間違ってない気がしててそれでも通らないの気持ち悪くて投げるに投げられない・・・
何かおかしいのはわかるけどわかるけど Length Extension Attack の問題の writeup 見てもこれと似たようなことをしていて何がおかしいのかわからん・・・しんどい・・・