
ごあいさつhabrayuzer! 最近、年次UFO CTF 2017 Information Security Olympiadが終了しました。この記事では、
PPCセクションの
「King Arthur」というワンタスクのライトがあり、最大ポイント数600を獲得できます。
始めましょう
割り当ての説明には次のものがありました。
ナイトファンから奇妙なメールの添付ファイルを受け取りました。 著者が何を念頭に置いていたかを理解してください。
また、ファイルはダウンロード可能です。
輸入蛇行はすぐに注目を集めます。 グーグルの
「python serpent sword」のリクエストに応じて、
gitレポジトリに出くわすことができ
ます 。これは、説明から判断すると必要なものです。
コード
serpent.pyを調べたところ、コードを剣に「変換」する原理の説明が見つかりました。
16進数65が与えられた場合:
65%32 = 1
床(65/32)= 2
したがって、65のアルファベット記号は、インデックス1の記号:「PT」です。
65は、1の32モジュラスの3番目のオカレンスでもあります(1
もちろん最初の出現であり、33は2番目の出現です。)
したがって、この16進記号のコードはPT2です
しかし、最も興味深いのは以下にあります:
elif scriptType is _SERPENT: pyc = _serpent_sword_alphabet_to_hex(_lex_hex(sys.argv[0])) pycout = ".".join(sys.argv[0].split(".")[0:-1])+".pyc" with open(pycout, "wb") as f: for val in pyc: f.write(chr(val))
このコードは、変換されたファイルを読み取り、
.pycに変換して戻します。 ファイルの名前を
sword.pyから
sword.ss.pyに変更し 、元に戻します:
redihi@kali:KingArthur$ python sword.ss.py RuntimeError: Bad magic number in .pyc file
sword.ss.pycファイル
が削除されないようにコードをわずかに変更すると、受信したファイルに破損したヘッダーがあることがわかります。
長い検索の後、
.pycファイルのヘッダーのおおよその
説明を見つけます。 しかし、それをtrueに変更する試みはすべて成功しませんでした。
同じ記事には、ファイル全体ではなく、コードの別のセクションをコンパイルする例があります。 おそらく同じ方法で、ヘッダーをバイパスして、残りのコードを復元します。 これらの目的のために小さなスクリプトを投げています。
開始後、出力を取得します。
redihi@kali:KingArthur$ ./unserpent.py sword.ss.py Offset found: 7 argcount: 0 code: 6401006400006c00005a00006402008400005a01006501008300000164000053 consts count: 3 <type 'NoneType'>: None <type 'int'>: -1 <type 'code'>: <code object task at 0x7f7e85aa9eb0, file "D:\Downloads\UFOCTF\TASKS\serpent\sources\Serpent-master\Serpent-master\test.py", line 4> filename: D:\Downloads\UFOCTF\TASKS\serpent\sources\Serpent-master\Serpent-master\test.py firstlineno: 1 flags: 0 name: <module> nlocals: 0 stacksize: 2 varnames count: 2 'serpent' 'task'
ご覧のとおり、もう1つの
コードオブジェクトがあります。必要です。 さらに数行追加して、逆コンパイルします。
import uncompyle6 ... uncompyle6.main.uncompyle(2.7, code.co_consts[2], sys.stdout)
もう一度実行して、完成したスクリプトを取得します。
受け取ったコードによると、フラグは復元されます。
ufoctf {XBMggg9qvX6P61yYBwfhBkg497vWa3}
割り当て完了! 評価に+600!