Zuck3r’s Study

エンジニアではありません

picoCTF : store

久しぶりの記事です。今回はpicoCTFのstoreに挑戦したいと思います。

環境:VMware,DebianベースのLinuxを使っている

解説

問題は以下の様にある。

f:id:Zuck3r:20190403211657p:plain

問題

まず、sourceとstoreをダウンロードしてファイル形式を調べる。storeはelfファイル、sourceは普通にCのスクリプトですね。storeの方を実行してみます。すると以下の様になりました。
質問文を読むにflagを買えってことなんでしょうね。という事で、残高(account balance)を聞いてみました。すると、今は1100入ってることが確認できました

f:id:Zuck3r:20190403212751p:plain


次に、[2]の"Buy Stuff"をやってみることにしました。直ぐに買えるといいなぁ、という淡い期待を抱きながらReal Flagである2番を選びましたが、普通に預金では買えない額ですね(笑)。100000$要るそうです。

f:id:Zuck3r:20190403213401p:plain

[2] Buy Stuffの結果

という事で、今度は"1"の"I Can't Believe its not a Flag!"を選択してみました。1つは買えましたけど、意味ないですね…預金も減ってしまいました。
これまでの事を鑑み整理すると、私がしたいことは正解であろうRealFlagを購入できるだけの金額に預金を増やすことです。次は、ダウンロードしたソースコードを読むことにしました。

f:id:Zuck3r:20190403214148p:plain

預金がぁぁ…

必要な部分だけ、ピックアップしてみることにしました。これから、分かることはfake flagの合計金額(total_cost)は、1000*number_flagsとして算出されているという事と、そして残高はaccount_balance = account_balance - total_costと処理されているという事です。これらの事から、number_flagsに巨大な整数を入力し整数オーバーフローを実行できることが予想出来ました。(number_flagsに対する入力チェックもなされていない)

f:id:Zuck3r:20190403215905p:plain

ピックアップした部分

予想から、大きな数字を入力してみると残高が莫大な数字に増えた。これで、RealFlagが買える。買ってみると、picoCTF{~~~}形式の答えが現れた。

f:id:Zuck3r:20190403221637p:plain

答え

終わりに

記事を出すのは久しぶりだったが、picoCTFをしていた。この"store"という問題は面白いなと思ったので記事にしてみた。入力された変数が適切な値であるかチェックすることが大切そうですね。