picoCTF : store
久しぶりの記事です。今回はpicoCTFのstoreに挑戦したいと思います。
環境:VMware,DebianベースのLinuxを使っている
解説
問題は以下の様にある。
まず、sourceとstoreをダウンロードしてファイル形式を調べる。storeはelfファイル、sourceは普通にCのスクリプトですね。storeの方を実行してみます。すると以下の様になりました。
質問文を読むにflagを買えってことなんでしょうね。という事で、残高(account balance)を聞いてみました。すると、今は1100入ってることが確認できました
次に、[2]の"Buy Stuff"をやってみることにしました。直ぐに買えるといいなぁ、という淡い期待を抱きながらReal Flagである2番を選びましたが、普通に預金では買えない額ですね(笑)。100000$要るそうです。
という事で、今度は"1"の"I Can't Believe its not a Flag!"を選択してみました。1つは買えましたけど、意味ないですね…預金も減ってしまいました。
これまでの事を鑑み整理すると、私がしたいことは正解であろうRealFlagを購入できるだけの金額に預金を増やすことです。次は、ダウンロードしたソースコードを読むことにしました。
必要な部分だけ、ピックアップしてみることにしました。これから、分かることはfake flagの合計金額(total_cost)は、1000*number_flagsとして算出されているという事と、そして残高はaccount_balance = account_balance - total_costと処理されているという事です。これらの事から、number_flagsに巨大な整数を入力し整数オーバーフローを実行できることが予想出来ました。(number_flagsに対する入力チェックもなされていない)
予想から、大きな数字を入力してみると残高が莫大な数字に増えた。これで、RealFlagが買える。買ってみると、picoCTF{~~~}形式の答えが現れた。
終わりに
記事を出すのは久しぶりだったが、picoCTFをしていた。この"store"という問題は面白いなと思ったので記事にしてみた。入力された変数が適切な値であるかチェックすることが大切そうですね。