れぷすたぶろぐ

思ったことを適当に書く

SECCON Beginners 2019 Writeup

学科同期で参加してチームでは35位。

初めは調子よかったのに後半思ったより解けなくてくやしさある。

Welcome (Misc)

がんばる

ctf4b{welcome_to_seccon_beginners_ctf}

Seccompare (Reversing)

0x4006b9strcmpしているので、そこにブレークポイントおいて実行するとRDIにフラグが入っている

ctf4b{5tr1ngs_1s_n0t_en0ugh}

So Tired (Crypto)

  1. Base64のテキストが与えられる
  2. デコードするとzlibのファイル
  3. 解答するとまたBase64のテキスト(つまり繰り返し)

何回繰り返すのかわからないので、とりあえずpythonでがんばったのが以下。 めんどくさかったのでファイルに書き出したけどそれなりに容量食ってそう。

import base64
import zlib

i = 1
while True:
    try: 
        with open(str(i) + '.txt', 'rb') as f:
            data = f.readline()
        with open(str(i + 1) + '.txt', 'wb') as f:
            decode = base64.b64decode(data)
            f.write(zlib.decompress(decode))
    except:
        break
    i += 1

ctf4b{very_l0ng_l0ng_BASE64_3nc0ding}

Party (Crypto)

partyvalという2値が3組と生成コードが与えられるので、いい感じにデコードする問題。

encrypt.pyを見ると、FLAGbytes_to_long()にかけてできたsecretに、2つの乱数を後ろに連結したリストcoeffがある。

これを、partyと組み合わせてvalという値が生成されているので、その生成関数fを見てみると、以下のようになっている(xpartyとなる)。

def f(x, coeff):
    y = 0
    for i in range(len(coeff)):
        y += coeff[i] * pow(x, i)
    return y

このとき、coeff[0]にほしいsecretが入っている(coeff[1],coeff[2]は乱数)ので、partyで割った値を出力してやればうまくcoeff[0]の値175721217420600153444809007773872697631803507409137493048703574941320093728が手に入る。

これをlong_to_bytes()にかければフラグ。

解法コードは以下。

from Crypto.Util.number import long_to_bytes

party = 5100090496682565208825623434336918311864447624450952089752237720911276820495717484390023008022927770468262348522176083674815520433075299744011857887705787

val = 222638290427721156440609599834544835128160823091076225790070665084076715023297095195684276322931921148857141465170916344422315100980924624012693522150607074944043048564215929798729234427365374901697953272928546220688006218875942373216634654077464666167179276898397564097622636986101121187280281132230947805911792158826522348799847505076755936308255744454313483999276893076685632006604872057110505842966189961880510223366337320981324768295629831215770023881406933

print(long_to_bytes(val % party))

Shamir(シャミア)って書いてあるけど、いまいちつながりがわかってない…

ctf4b{just_d0ing_sh4mir}

Leakage (Reversing)

バイナリだけが渡されるので、とりあえずdisassしてgdbした。

0x400643のcmpにブレークポイントを置くと、al(入力文字)と[rbp-0x5](正解文字)が比較されているので、x/b $rbp-0x5で正解文字を調べて1文字ずつ解読していった。つらい。

フラグの文章がそうなってるのでもしかしたら想定解答なのかもしれない……

ctf4b{le4k1ng_th3_f1ag_0ne_by_0ne}

見かけたWriteupメモ

SECCON Beginners CTF 2019 Write-up - Theories of Pleiades

SECCON Beginners CTF 2019 Writeup - こんとろーるしーこんとろーるぶい

SECCON Beginners CTF 2019 Writeup - yoshikingのがんばる日記

SECCON Beginners CTF 2019のWriteup - CTFするぞ

SECCON Beginners CTF 2019 writeup - アオカケスの鳥かご

beginners ctf 2019 himitsu writeup - 空地

SECCON Beginners CTF 2019 writeup - ふるつき

Beginners CTF 2019 の write-up - st98 の日記帳