LabyREnth 2016 Writeup

この大会は2016/7/16 9:00(JST)~2016/8/15 9:00(JST)に開催されました。
個人戦の大会ですが、順位とか点数とかがよくわからない大会でした。
解けた問題をWriteupとして書いておきます。

unix tier level 1

perlスクリプトで、スクリプトコードやデータがBase64エンコードされている。それぞれデコードするスクリプトを作成する。

key_begin   = '. MIME::Base64::decode'
key_begin_e = 'eval MIME::Base64::decode'
key_end     =  '")'

def decode(a, data):
    index = 0
    while True:
        i_begin = data.find(key_begin, index)
        if i_begin < 0:
            break
        i_end = data.find(key_end, i_begin)
        enc = data[i_begin + 24:i_end]
        a += enc.decode('base64')
        index = i_end

    i_begin = data.find(key_begin_e)
    if i_begin < 0:
        return a, ""
    i_end = data.find(key_end, i_begin)
    e_data = data[i_begin + 27:i_end].decode('base64')

    return a, e_data

with open('bowie.pl', 'r') as f:
    data = f.read()

a = ''

while True:
    a, e_data = decode(a, data)
    if e_data == "":
        break
    data = e_data

with open('flag.gif', 'wb') as f:
    f.write(a)

print data

実行すると、gifファイルが生成され、フラグが埋め込まれている。
f:id:satou-y:20160901205727g:plain

PAN{L3ts_533_h0W_U_deal_w_th1s_little_511CE}

threat tier level 1

GETのアクセス先URLの文字列がフラグに関係ありそう。Base64文字列になっているので、いろいろ試してみる。

/[A].php?[B]&L4bry1nth_(数字)?[C]-<***>の形式。
[A]をBASE64デコードすると2桁数値
[C]+[B]をBASE64デコードするとよくわからないデータ。
ASCIIアートの一部かもしれない。

[A]のデコードした数値の順に[C]+[B]のデコードしたものを並べるスクリプトを書く。

from scapy.all import *
import base64
import re

pattern = 'GET /(.{4})\.php\?(.+)&L4bry1nth_.+\?(.+)-.+'

packets = rdpcap('dopefish_labyrinth.pcap')

d = {}
for p in packets:
    if p['TCP'].dport == 80:
        l = p['Raw'].load
        m = re.match(pattern, l)
        p1 = m.group(1)
        p2 = m.group(2)[::-1]
        p3 = m.group(3)[::-1]
        id = base64.b64decode(p1).replace('\n', '')
        data = base64.b64decode(p3 + p2).replace('\n', '')
        d[id] = data

for key, val in sorted(d.items()):
    print val

これを実行すると、魚のようなASCIIアートが出来上がる。

317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317W.317.;317;;317;;317.W317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317W.317;;317;;317;;317;W317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317;;317;;317;;317;;317;W317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317W.317.W317WW317WW317WW317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317W.317;;317;;317;;317;;317.W317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317..317;;317.W317WW317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317W.317..317;;317;.317..317..317..317;;317..317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317.;317;.317.W317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317..317.;317;;317;;317P;317;;317;;317;;317;;317;;317;;317;;317;.317.W317WW317WW317WW317WW317WW317WW317WW317WW317WW317W.317;;317;.317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317.;317;;317;;317;;317;;317;A317;;317;;317;;317;;317;;317;;317;;317;;317;;317..317WW317WW317WW317WW317WW317WW317WW317WW317W.317;;317;;317..317WW317WW317WW
317WW317WW317WW317WW317WW317W;317;;317;;317;;317;;317;;317;;317;;317N;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317.W317WW317WW317WW317WW317WW317WW317W.317;;317;;317;.317.W317WW317WW
317WW317WW317WW317WW317W.317;;317;;317;;317;;317;;317;;317;;317;;317;{317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317.W317WW317WW317WW317WW317WW317W.317;;317;;317;;317..317WW317WW
317WW317WW317WW317W.317..317.;317;;317;;317;;317;;317;;317;;317;;317;;317t;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;.317WW317WW317WW317WW317WW317.;317;;317;;317;;317;.317.W317WW
317WW317WW317W.317WW317W.317.W317WW317WV317..317;;317;;317;;317;;317;;317;h317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;+317..317WW317WW317WW317W.317;;317;;317;;317;;317;.317.W317WW
317WW317W.317WW317WW317WW317WW317WW317WW317WW317WW317;;317;;317;;317;;317;;3173;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;.317.W317WW317W.317;;317;;317;;317;;317;;317;.317.W317WW
317WW317.V317W.317..317..317.W317WW317WW317WW317WW317.;317;;317;;317;;317;;317;D317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;.317..317.;317;;317;;317;;317;;317;;317..317WW317WW
317WW317.W317W.317..317..317.W317WW317WW317WW317WW317W.317;;317;;317;;317;;317;;3170;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;.317.W317WW317WW
317WW317..317WW317W.317..317..317WW317WW317WW317WW317V.317;;317;;317;;317..317.;317;p317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317..317WW317WW317WW317WW
317WW317.;317.W317.W317WW317WW317WW317WW317WW317WW317.;317;;317;;317;;317;.317.;317;;3173;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;.317WW317WW317WW317WW
317WW317..317.;317.V317W.317.W317WW317WW317WW317W.317;.317.;317;;317;;317;.317.;317;;317;f317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317..317WW317WW317WW
317WW317W.317..317..317.;317;;317..317..317..317;;317;;317;;317..317;;317;.317.;317;;317;;317s;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;.317.W317WW317WW
317WW317W.317WW317.V317V.317..317..317..317..317..317..317..317;;317;;317;.317.;317;;317;;317;h317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317..317WW317WW
317WW317W.317WW317.W317WW317WV317.;317;;317;;317;.317;.317..317.;317;;317..317.;317;;317;;317;;317l;317;;317;;317;;317;;317;;317;;317;;317;.317..317.;317;;317;;317;;317;;317;;317..317WW317WW
317WW317W.317WW317.W317WW317WV317..317..317;;317;;317;;317;.317.;317;;317..317;;317;;317;;317;;317;1317;;317;;317;;317;;317;;317;;317;.317.W317WW317W.317.;317;;317;;317;;317;;317..317WW317WW
317WW317W.317WW317.W317WW317WV317.;317;;317;;317;.317;;317;;317.;317;;317;;317;;317;;317;;317;;317;;317v;317;;317;;317..317;;317..317..317WW317WW317WW317..317;;317;;317;;317;;317..317WW317WW
317WW317W.317WW317.W317WW317WV317..317..317.;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;3317.;317;;317;.317..317.W317WW317WW317WW317WW317WW317.;317;;317;;317;.317.W317WW317WW
317WW317W.317WW317.W317WW317WV317.;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317s;317;.317..317..317WW317WW317WW317WW317WW317WW317.;317;;317;;317;.317.W317WW317WW
317WW317W.317..317.W317WW317WV317..317;;317;;317;;317;.317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317.}317..317..317WW317WW317WW317WW317WW317WW317WW317.;317;;317;;317..317WW317WW317WW
317WW317WW317WW317W.317..317WV317.W317W.317..317..317.+317;;317;;317;;317;;317;;317;;317;;317;;317;;317;;317;.317..317WW317WW317WW317WW317WW317WW317WW317W.317;;317;;317;;317.W317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317W.317.;317;;317;;317;;317;;317;;317;;317;;317;;317..317.W317WW317WW317WW317WW317WW317WW317WW317WW317W.317;;317;.317.W317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317..317;;317;;317;;317;;317;.317..317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317.;317;.317WW317WW317WW317WW317WW317WW
317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW317WW

このアスキーアートの中に斜めにフラグが入っている。

PAN{th3D0p3fshl1v3s}

docs tier level 1

デバッグしながら実行すると、以下のURLにGETでアクセスしていることがわかる。

http://10.1.33.7/b64/x58/MDgxOTE2MjMwZTMxMDIzMTNhNjk2YjA3NjgzNjM0MjE2YTJjMzA2ODJiNmIwNzBmMzA2ODA3MTMz\nNjY4MmYwNzJmMzA2YjJhNmI2YTM0Njg2ODMzMjU=/evil.exe

でも実際にアクセスしても接続することはできない。URLのパスをヒントにして、まず以下の部分を "\n" は改行に変え、Base64デコードする。

MDgxOTE2MjMwZTMxMDIzMTNhNjk2YjA3NjgzNjM0MjE2YTJjMzA2ODJiNmIwNzBmMzA2ODA3MTMz\nNjY4MmYwNzJmMzA2YjJhNmI2YTM0Njg2ODMzMjU=
→081916230e3102313a696b07683634216a2c30682b6b070f3068071336682f072f306b2a6b6a3468683325

さらに0x58とXORをとり、ASCIIコードとして文字に変換する。

enc = '081916230e3102313a696b07683634216a2c30682b6b070f3068071336682f072f306b2a6b6a3468683325'
key = 0x58

dec = ''
for i in range(0, len(enc), 2):
    code = int(enc[i:i+2], 16)
    dec += chr(code ^ key)

print dec
PAN{ViZib13_0nly2th0s3_Wh0_Kn0w_wh3r32l00k}

docs tier level 2

マクロを参照しようとしたが、パスワードがかかっている。https://home.ayra.ch/unlock/でパスワードを解除した後、マクロのUserForm1のコードを見る。

Private Sub button_Click()
    x = suchcrypto(key.Text, "General Vidal")
    If x = "171,184,42,184,88,26,47,154,20,219,203,130,52,19,180,214,156,94,186,74,30,248,119,235,139,130,175,141,179,197,8,204,252," Then
        MsgBox "Wow. Good Job! Such crack."
    Else
        MsgBox "U can do. Try harder..."
    End If
End Sub

Function suchcrypto(sMessage, strKey)
    Dim kLen, x, y, i, j, temp
    Dim s(256), k(256)
    kLen = Len(strKey)
    For i = 0 To 255
        s(i) = i
        k(i) = Asc(Mid(strKey, (i Mod kLen) + 1, 1))
    Next
    j = 0
    For i = 0 To 255
        j = (j + k(i) + s(i)) Mod 256
        temp = s(i)
        s(i) = s(j)
        s(j) = temp
    Next
    x = 0
    y = 0
    For i = 1 To 3072
        x = (x + 1) Mod 256
        y = (y + s(x)) Mod 256
        temp = s(x)
        s(x) = s(y)
        s(y) = temp
    Next
    For i = 1 To Len(sMessage)
        x = (x + 1) Mod 256
        y = (y + s(x)) Mod 256
        temp = s(x)
        s(x) = s(y)
        s(y) = temp
 
        suchcrypto = suchcrypto & (s((s(x) + s(y)) Mod 256) Xor Asc(Mid(sMessage, i, 1))) & ","
    Next
End Function

Private Sub UserForm_Click()

End Sub

途中までそのまま計算し、計算結果とIf文のチェックの内容とをXORで元に戻していく。

strKey = 'General Vidal'
strCode = '171,184,42,184,88,26,47,154,20,219,203,130,52,19,180,214,156,94,186,74,30,248,119,235,139,130,175,141,179,197,8,204,252,'

kLen = len(strKey)

s = []
k = []
for i in range(256):
    s.append(i)
    pos = i % kLen
    k.append(ord(strKey[pos:pos+1]))

j = 0
for i in range(256):
    j = (j + k[i] + s[i]) % 256
    s[i], s[j] = s[j], s[i]

x = 0
y = 0
for i in range(1, 3073):
    x = (x + 1) % 256
    y = (y + s[x]) % 256
    s[x], s[y] = s[y], s[x]

codes = strCode[:-1].split(',')

sMessage = ''
for i in range(1, len(codes) + 1):
    x = (x + 1) % 256
    y = (y + s[x]) % 256
    s[x], s[y] = s[y], s[x]
    pos = (s[x] + s[y]) % 256
    sMessage += chr(s[pos] ^ int(codes[i - 1]))

print sMessage
PAN{L4$t_Night_@f@iry_Vizited_M3}

docs tier level 3

PDF Stream Dumperで見ようとしても見ることができない。どうやら壊れているようだ。https://www.pdf-online.com/osa/repair.aspx で修復し、修復したファイルをPDF Stream Dumperで見る。赤で表示されている「10 HLen: 0x189」のところを見ると、フラグが入っていた。

<<
	
	/JS ty.i.f.(.e.v.e.n.t...v.a.l.u.e.=.=.".P.A.N.{.g.0.o.b.y.g.o.0.b.y.d.0.0.w.h.3.r.3.r.u.?.}.".).{.a.p.p...a.l.e.r.t.(.".y.e.s.".).;.}.e.l.s.e.{.a.p.p...a.l.e.r.t.(.".n.o.".).;.}.

	/S /JavaScript
	/Type /Action
>>
PAN{g0obygo0byd00wh3r3ru?}