LoginSignup
0

More than 3 years have passed since last update.

picoCTF 2019 flag_shop - Points: 300

Posted at

問題

image.png

解いてみた

ソースを見てみます。
ちょっと長いのでキモとなる部分を抜粋します。
まずはflagを表示する処理のところ。

image.png

ソースを見る限り

if(account_balance > 100000){

を満たせばflagが表示されそうです。
account_balanceについて確認してみます。

image.png

定義段階では1100が入っています。

image.png

42行目でaccount_balanceの値を書き換える処理があるのでここをどうにか頑張る問題のようです。

account_balance = account_balance - total_cost;

の計算後account_balanceが100000より大きな値になればいいので

1100 - total_cost > 100000
total_cost < - 98900

となるようにtotal_costがなればよいわけです。
total_costはどこで書き換えられているのでしょうか。

image.png

ほぼさっきと同じところで処理されているだけのようです。

int total_cost = 0;
total_cost = 900*number_flags;

number_flagsは36行目で入力した数値が入ります。
ということでnumber_flagsに大きめのマイナスの値を入力したらよさそうですが、37行目で>0があるので正数である必要があります。

たしかintの仕組みを考えると最大値を超えると桁あふれがおきて最小値に行ってしまうはずです。
∵一番上のけたは符号を判断するための桁なので、桁あふれで1になって1はマイナスを示すから。

intの最大値について調べます。

データ型の最大値の確認 - Qiita
https://qiita.com/hryshtk/items/b848ed3bd78f940ac5af

image.png

最大値は2147483647とのこと。
試しにこの最大値を入力してどうなるか確認してみます。

image.png

-900になりました。方針はこれであってそうです。

今やりたいことはtotal_cost < - 98900を満たしたい。
そのためには

-98900 > 900*number_flags
-109 > number_flags

となるようなnumber_flagsにする。
2147483647+100=‭2147483747を設定すれば良いんでしょうか。
と思ったらなんかバグって駄目でした。

ちょっと混乱してきました。
逆に引くのか?
2147483647-100=2147483547でやってみます。

image.png

おお、引くのが正解みたい。
2147483647-1000=2147482647とかやればゴールできるか。

image.png

できた。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0