ぺんぎんさんのおうち

日本語勉強中のドイツ産ペンギンがいろんなことを書く

34C3 Junior CTF [Write-up]

34C3 Junior CTFにKHKOで参加しました.
弊部で一緒に挑戦する人を募ってみたところ, 参加者は誰1人来ませんでした.
後から1人参加してくれました. 感謝!!
最終的に137p取得して208位でした(全体435チーム) そのうち僕は3問解いて137p取得しました.
Write-upです.

[Crypto 49] top

問題ファイルです.

import random
import sys
import time

cur_time = str(time.time()).encode('ASCII')
random.seed(cur_time)

msg = input('Your message: ').encode('ASCII')
key = [random.randrange(256) for _ in msg]
c = [m ^ k for (m,k ) in zip(msg + cur_time, key + [0x88]*len(cur_time))]

print(cur_time)
print(bytes(c))

time.time() で時刻を取得し, それをrandomのシード値にしています.
シード値によってkeyが作成されるのでまずはkeyを特定しましょう.

zip(msg + cur_time, key + [0x88]*len(cur_time))
より, 0x88とxorを取っていけばcur_timeがわかります.

手元で str(time.time()).encode('ASCII') を動かすと cur_timeは17, 18文字である事がわかるので, c[:-17], c[-18:] で復号します.
得られたseedを適用してkeyを得られれば, 後はkeyとXORでフラグが得られます.

solverです.

import random

#cur_time = "1513719133.8728752"

f = open("top_secret", "rb")
data = f.read()
flag = data[:-18]
xur_time = data[-18:]

cur_time = "".join([chr(ch^0x88) for ch in xur_time])
random.seed(cur_time)

key = [random.randrange(256) for _ in flag]
c = [m ^ k for (m,k) in zip(flag, key)]
print(bytes(c))

Here is your flag: 34C3_otp_top_pto_pot_tpo_opt_wh0_car3s

CAPTCHAと遊んでいたらfirst solver逃してました.

[Reversing 41] ARM1

$ strings arm_stage1.bin

34C3_I_4dm1t_it_1_f0und_th!s_with_str1ngs

[Misc 47] babybash

baby> help

    Welcome to babaybash!

    This is a challenge where you find yourself in a bash-jail.

    You want to execute /get_flag to get the flag!

    But the following characters are banned:
        - a-z
        - *
        - ?
        - .

    Good luck!

親切なことに答えの出し方を教えてくれています.
が, 小文字は使えないので大文字で戦わなければなりません.
bash 大文字 小文字 とかで検索していたら, ${CMD,,}で大文字を小文字に変換できることがわかりました(CMDは変数).

試しに V="ECHO";${V,,} "HOGE" をしてみたら

baby> V="ECHO";${V,,} "HOGE"
HOGE

でました. あとは/GET_FLAG を代入してあげれば良さそうですね.

baby> V="/GET_FLAG";${V,,}
Usage: /get_flag gimme_FLAG_please

はほーん.
変数で分割して, あとで結合してあげればいけそうです.

baby> V1="/GET_FLAG ";V2="GIMME_";V3="FLAG_";V4="PLEASE";${V1,,}${V2,,}$V3${V4,,}
Good job!

Here's your flag: 34C3_LoOks_lik3_y0U_are_nO_b4by_4ft3r_4ll

34C3_LoOks_lik3_y0U_are_nO_b4by_4ft3r_4ll

1行に全部書かないと変数は初期化されるようでした.