SECCON 2018 Online CTF Writeup その2

前回の続きです.
今回はRunmeUnzipについて書いていきます.

Writeup

Runme (Reversing; 102pt)

問題

runme.

file: runme.exe

やったこと

exeファイルが与えられているのでWindowsで実行してみるも,「The environment is not corrected.」

IDAで開いてみると,startでGetCommandLineを呼び,その後sub_*を順番に辿っていることが分かる.

OllyDbgでステップ実行していくと,各sub_*ではGetCommandLineの結果と”C:/Temp/…”を一文字ずつ比較していた.runme.exeをそのパスで実行すれば良いものと思われる.ということで,途中まではrunme.exeの場所を替えながらOllyDbgで少しずつ追っていたが,途中で面倒くさくなり断念.
なんとなくstringsコマンドを実行してみると.

$ strings runme.exe
(...)
BRj
BRjS
BRjE
BRjC
BRjC
BRjO
BRjN
BRj{
BRjR
BRju
BRjn
BRjn
BRj1
BRjn
BRj6
BRj_
BRjP
BRj4
BRj7
BRjh
BRj}^
(...)

あ……
ということでフラグゲット.

SECCON{Runn1n6_P47h}

これでいいのか……?

Unzip (Forensics; 101pt)

問題

Unzip flag.zip.

file: unzip.zip

やったこと

与えられたunzip.zipを解凍すると中にはflag.zipmakefile.shが含まれていた.問題にはflag.zipを解凍しろとあるのでunzipしてみる.

$ unzip flag.zip
Archive: flag.zip
[flag.zip] flag.txt password:

当然のようにパスワードを求められる.

次にmakefile.shをみる.

echo 'SECCON{'`cat key`'}' > flag.txt
zip -e --password=`perl -e "print time()"` flag.zip flag.txt

これはflag.zipを作成したときのスクリプトらしい.
どうやらflag.zipはいつかの時点でのUnixtimeらしいので,何も考えずに以下の全探索プログラムを書く.

#!/usr/bin/env python3
import os
import sys

args = sys.argv

# 現在時刻からデクリメント
for passwd in range(1540624382,0,-1):
    if passwd % 10000 == 0:
        print(passwd)
    result=os.system('unzip -P ' + str(passwd) + ' ' + args[1])

    if os.path.exists('flag.txt'):
        os.system('mv flag.txt flags/flag-'+str(passwd)+'.txt')

    if result == 0:
        print("password is found!!! ->",passwd)
        with open('passwd','a') as f:
            f.write(str(passwd)+'\n')

print("password is not found")

これを実行して少し放置したのち,解凍されたファイルがあるディレクトリでgrepしてフラグゲット.

$ grep "SECCON" flags/*
flags/flag-1540566641.txt:SECCON{We1c0me_2_SECCONCTF2o18}

これでいいのか……?

おわりに

今回のSECCONは人望不足により一人参加となったが,もう少しポイントを稼げたのでは?感が大きいですね.特にClassic PwnとQRCheckerを解けなかったのは,今になって考えると謎です.解けた問題にしても他の人のスマートなWriteupと比べると,私の解法は限りなく0点に近い気がしてメッチャへこみます.

来年こそは落ち込まなくていいように,メンバーを集めてみんなでワイワイやりたいですね.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする