Port 53

明日のための技術メモ

BCACTF WriteUP その2

BCACTFのWriteUP続き。programmingからwebまで。
前回の記事はこちら

programming

プログラミング問題。解けたのは4つ。

1+1=window (75pt)

問題文にhex+hex=hexとあったので、2つのテキストファイルに書いてある
16進数の和を求める。num1にone.txt, num2にtwo.txtの内容を格納。
そして16進数をASCIIデコードしてフラグが得られた。

# coding:utf-8
import codecs

num1 = [0x23, 0x49, 0x16, 0x46, 0x45, 0x16, 0x3c, 0x3c, 0x45, 0x64, 0x16, 0x37, 0x3c, 0x3c, 0x3c, 0x16, 0x46, 0x45, 0x37, 0x1e, 0x49, 0x16, 0x46, 0x49, 0x16, 0x1e, 0x16, 0x32, 0x32, 0x3c, 0x32, 0x49, 0x3c, 0x64, 0x1e, 0x32, 0x3c, 0x18, 0x64, 0x32, 0x32, 0x50, 0x14, 0x64, 0x32, 0x5a, 0x45, 0x32, 0x32, 0x55, 0x50, 0x49, 0x3c, 0x14, 0x3c, 0x5f
]
num2 = [0x26, 0x2b, 0x0a, 0x23, 0x2e, 0x0a, 0x29, 0x25, 0x2e, 0x15, 0x0a, 0x37, 0x25, 0x25, 0x2c, 0x0a, 0x23, 0x2e, 0x37, 0x09, 0x2b, 0x0a, 0x23, 0x2b, 0x0a, 0x21, 0x0a, 0x30, 0x31, 0x25, 0x31, 0x2b, 0x2a, 0x17, 0x13, 0x2d, 0x2c, 0x18, 0x0c, 0x01, 0x2d, 0x29, 0x1c, 0x11, 0x2d, 0x1b, 0x2e, 0x01, 0x2d, 0x1b, 0x29, 0x2b, 0x2c, 0x1c, 0x32, 0x1e
]

num = []

for (i, j) in zip(num1, num2):
    num.append(i+j)

print(num)

for n in num:
    print(chr(n), end="")
    #bcactf{1_h0p3_y0u_us3_pyth0n}

bca-store (75pt)

サンプルの長さが大したことなかったのでそのまま計算してしまった。

C, B, B, C, A, 250 → 5.70
A, C, D, A, 230 → -1
A, B, C, D, 240 → 1.00
D, D, D, 225 → 75.00
A, A, A, A, 150 → -1
A, A, A, A, B, B, B, B, B, C, C, C, C, C, D, D, D, D, 1000 → 77.40
A, A, A, A, B, B, B, B, B, C, C, C, C, C, D, D, D, D, 900 -1

flag: 5.70 -1 1.00 75.00 -1 77.40 -1

instructions (175pt)

こういう問題大好きなんだよね。結構楽しかった。
ちなみにオペレーション名になっている16進数をASCIIデコードしたら、

0xWork on the puzzle, stop reading hex!

怒られました笑

さて、本題に戻ります。flag.txtは長文ですが解読に使う行は以下の通り。

  1. 行の長さが3で割り切れ、かつ&が入っていない行

  2. 1行目の数字が、1で抽出した行の何文字目を拾うかを示す

ということでコードを書きます。

# coding:utf-8

out_list = []
path = "flag.txt"
with open(path) as f:
    lines = [s.strip() for s in f.readlines()]

for l in lines:
    if len(l) % 3 == 0 and "&" not in l:
        out_list.append(l)

#print(out_list)

with open("text_for_write.txt", 'wt') as f:
    for ele in out_list:
        f.write(ele+'\n')

# 1行目にあった数字の列
num = [20, 30, 8, 14, 17, 24, 44, 19, 17, 29, 20, 34, 35, 27, 42, 34, 7, 25, 7, 21, 8, 38, 13, 25, 14, 13, 42, 14, 20, 23, 3, 27, 38, 9, 18, 41, 3, 11, 35]

for (e, n) in zip(out_list, num):
    print(e[int(n) -1], end = "")
    #bcactf{f0110w_tH3_r00lz_<3_l0ve_m3_pls}

pythonのzip関数超便利。

public-library (200pt)

PublicLibrary.classをバイナリエディタで開くとフラグが見えた。

bcactf{t4k3_4_j4v4_c7a55_789208694209642475}

quest

なぞなぞ系。2つしか解けなかった。free-real-estate一体何だったし。

copypasta (0pt)

Discordのcopypastaチャンネルをひたすら漁るだけ。以上。

you-wanted-it (50pt)

どう見てもpythonっぽい。1を出力するように編集するだけ。

def main():
    print(1)

main()

reversing

ソースファイルの解析など。動作を追っていく問題。4つ解けた。

basic-pass-1 (150pt)

実行ファイルをそのままバイナリエディタで開くとフラグが確認できた。

scratch-that (150pt)

Scratchのソースコードのうち、generate_flag関数の処理を追いかける

basic-pass-2 (200pt)

これも実行ファイルをそのままバイナリエディタで開いて完了。

basic-pass-3 (200pt)

ncで接続した先でPWを求められる。正解した文字の部分だけ1が出るので
それを手掛かりに頑張ってブルートフォース決める。疲れた。

web

web脆弱性関連の問題。唯一全問正解できた。

the-inspector (50pt)

ブラウザの検証ツールを使ってソースを見てみる。
コメントでフラグが入っている。

<!-- bcactf{1nsp3ct_3l3m3nt} -->

wite-out (50pt)

ブラウザの検証ツールを使ってソースを見てみる。
透明な文字でフラグが入っている

<span style="color: transparent;">
bcactf{17s_r1gh7_h3r3_1n_wh1t3_1397856}</span>

dig-dug (100pt)

digと言えばDNS、TXTと言えばTXTレコード。

$ dig -t txt hole.sketchy.dev

; <<>> DiG 9.10.6 <<>> -t txt hole.sketchy.dev
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12070
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;hole.sketchy.dev.      IN  TXT

;; ANSWER SECTION:
hole.sketchy.dev.   3599    IN  TXT "bcactf{d1g-f0r-h073s-w/-dns-8044323}"

;; Query time: 172 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jun 21 18:26:40 JST 2019
;; MSG SIZE  rcvd: 94

cookie-clicker (150pt)

そういや昔こんなゲーム流行ったな。あれまだ開発してるんだろうか。
burpsuite等のプロキシを使って、cookieの値をFlagに必要な個数以上に書き換える。

総評

初めて時間制限のあるCTFに参加して、途中で問題が追加されたり、
隠し問題みたいなものもあったりと程良いレベルで楽しい1週間を過ごせた。
解けなかった問題も多いので、他の人のwriteupを見つつ勉強していきたい。