1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python Wrangling

Posted at

Python Wrangling

tags:PicoCTF General Skills 2021

問題

Pythonスクリプトは、ターミナルのプログラムのように呼び出されます...このパスワードを使用してこのPythonスクリプトを実行し、フラグを取得できますか?

Python scripts are invoked kind of like programs in the Terminal... Can you run this Python script using this password to get the flag?

問題サイト:PicoCTF
配布されたファイル:

ende.py
import sys
import base64
from cryptography.fernet import Fernet



usage_msg = "Usage: "+ sys.argv[0] +" (-e/-d) [file]"
help_msg = usage_msg + "\n" +\
        "Examples:\n" +\
        "  To decrypt a file named 'pole.txt', do: " +\
        "'$ python "+ sys.argv[0] +" -d pole.txt'\n"



if len(sys.argv) < 2 or len(sys.argv) > 4:
    print(usage_msg)
    sys.exit(1)



if sys.argv[1] == "-e":
    if len(sys.argv) < 4:
        sim_sala_bim = input("Please enter the password:")
    else:
        sim_sala_bim = sys.argv[3]

    ssb_b64 = base64.b64encode(sim_sala_bim.encode())
    c = Fernet(ssb_b64)

    with open(sys.argv[2], "rb") as f:
        data = f.read()
        data_c = c.encrypt(data)
        sys.stdout.write(data_c.decode())


elif sys.argv[1] == "-d":
    if len(sys.argv) < 4:
        sim_sala_bim = input("Please enter the password:")
    else:
        sim_sala_bim = sys.argv[3]

    ssb_b64 = base64.b64encode(sim_sala_bim.encode())
    c = Fernet(ssb_b64)

    with open(sys.argv[2], "r") as f:
        data = f.read()
        data_c = c.decrypt(data.encode())
        sys.stdout.buffer.write(data_c)


elif sys.argv[1] == "-h" or sys.argv[1] == "--help":
    print(help_msg)
    sys.exit(1)


else:
    print("Unrecognized first argument: "+ sys.argv[1])
    print("Please use '-e', '-d', or '-h'.")
    
flag.txt.en
gAAAAABgUAIVX7N_dNxY0j5lWtsDEN2b-h0mN-Lyhm_9QaEdwFK4em1kGiAV52ewbKv8wZJL2QwecZ7kTsVQ11PYEL3BJLD4LVyKrCKAvTFu5-1yuNGFAXKBY8GO3nIReXuOUbaSwVHl
pw.txt
192ee2db192ee2db192ee2db192ee2db

sys.argvとは

この問題で重要な要素となっているende.pyを読み解いていく上でこの問題で躓く人が最も多い関数はsys.argvの取り扱いかと思われる。これを簡潔に説明するとコマンド実行の際の引数を格納しているリストとなる。
pythonファイルを実行する時、コマンドではpython3 ファイル名とするがpython3コマンドもls -aのようにコマンド+(オプションや引数)、という風になっていると解釈できる。
sys.argvにはpython3の後に来る実行するpythonファイル名を先頭の要素argv[0]とするリストであり、[1]以降はファイル名の後に入力された順番に格納される。
例を示すと次のようになる。

$python3 ende.py          #sys.argv = [ende.py]

$python3 ende.py -d       #sys.argv = [ende.py,'-d']

解法

上記の説明を踏まえて与えられたpythonファイルを読み解いていくと、実行時のファイル名指定の後に'-d'や'-e'、'-h'といったオプションが指定できるようになっている。また、そのあとには暗号化・復号化を行う対象のファイルが必要である。パスワードは求められた際にコピペでも良いが引数として一番最後に置いておくと勝手に読み込んでくれるようになっている。

以上より下のように実行するとflagの復元ができる。

$ cat pw.txt
192ee2db192ee2db192ee2db192ee2db
$ python3 ende.py -d flag.txt.en 192ee2db192ee2db192ee2db192ee2db
picoCTF{4p0110_1n_7h3_h0us3_192ee2db}

復元成功
picoCTF{4p0110_1n_7h3_h0us3_192ee2db}

1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?