De1CTF 2020 Writeup

この大会は2020/5/2 10:00(JST)~2020/5/4 10:00(JST)に開催されました。
今回もチームで参戦。結果は350点で755チーム中133位でした。
自分で解けた問題をWriteupとして書いておきます。

Welcome_to_the_2020_de1ctf (Misc)

Telegramに入ると、メッセージにフラグがあった。

De1CTF{m4y_th3_f0rc3_b3_w1th_y0u}

NLFSR (Crypto)

LFSRの問題。z3で条件を満たすものを探す。このとき、以下のlfsrのロジック部分はシフトで表現するよう変更する。

def lfsr(r, m): return ((r << 1) & 0xffffff) ^ (bin(r & m).count('1') % 2)

dataのファイルをどこまでチェックするかは調整する。

from z3 import *

ma, mb, mc, md = 0x505a1, 0x40f3f, 0x1f02, 0x31

class lfsr():
    def __init__(self, init, mask):
        self.init = init
        self.mask = mask

    def next(self):
        count = 0
        for i in range(24):
            count += ((self.init & self.mask) >> i) & 1
        nextdata = ((self.init << 1) & 0xffffff) ^ (count % 2)
        self.init = nextdata
        return nextdata

def combine(a, b, c, d):
    [ao, bo, co, do] = [i & 1 for i in [a, b, c, d]]
    return (ao*bo) ^ (bo*co) ^ (bo*do) ^ co ^ do

a = BitVec('a', 24)
b = BitVec('b', 24)
c = BitVec('c', 24)
d = BitVec('d', 24)

l1 = lfsr(a, ma)
l2 = lfsr(b, mb)
l3 = lfsr(c, mc)
l4 = lfsr(d, md)

s = Solver()

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

s.add(a >> 18 == 1)
s.add(a >> 19 == 0)
s.add(b >> 18 == 1)
s.add(b >> 19 == 0)
s.add(c >> 12 == 1)
s.add(c >> 13 == 0)
s.add(d >> 5 == 1)
s.add(d >> 6 == 0)

for i in range(64):
    s.add(combine(l1.next(), l2.next(), l3.next(), l4.next()) == data[i])

r = s.check()
if r == sat:
    m = s.model()
    print m
    ai = m[a].as_long()
    bi = m[b].as_long()
    ci = m[c].as_long()
    di = m[d].as_long()
    flag = 'De1CTF{' + ''.join([hex(i)[2:] for i in [ai, bi, ci, di]]) + '}'
    print flag
else:
    print 'Not found!'

実行結果は以下の通り。

[b = 494934, a = 363445, c = 4406, d = 63]
De1CTF{58bb578d5611363f}
De1CTF{58bb578d5611363f}

De1CTF 2020 Questionnaire (Misc)

アンケートに答えてもフラグは表示されない。アンケートフォームのHTMLソースでDe1CTF{で検索すると、metaタグ内にフラグが書いてあった。

<meta property="og:image:height" content="200"><meta property="og:description" content="Hello everyone, it may take you a few minutes to finish this questionnaire to help us to do better next time, Thanks.
We hope you had fun in De1CTF, and apologize deeply for the faults during the game.

If you think De1CTF is good, please vote for us at ctftime, thx~: https://ctftime.org/event/1033/weight

PS. After submit your flag, please come back to finish this survey seriously :)
Here is a flag for you: De1CTF{hav3_fun_1n_De1CTF_2020}">
De1CTF{hav3_fun_1n_De1CTF_2020}