UIUCTF 2024 Writeup

この大会は2024/6/29 9:00(JST)~2024/7/1 9:00(JST)に開催されました。
今回もチームで参戦。結果は2341点で959チーム中161位でした。
自分で解けた問題をWriteupとして書いておきます。

Sanity Check (Miscellaneous)

Discordに入り、#announcementsチャネルのメッセージを見ると、フラグが書いてあった。

uiuctf{plz_n0_ch4tGPT}

Hip With the Youth (OSINT)

Instagramで検索すると、以下のページが見つかる。

https://www.instagram.com/longislandsubwayauthority/

@longislandsubwayauthorityのリンク先を見てみる。
スレッドの一番下に以下のように書いてある。

I've been told if I include a flag with my post I'll get more engagement, well here goes nothing!

この返信にフラグが書いてあった。

uiuctf{7W1773r_K!113r_321879}

An Unlikely Partnership (OSINT)

「Hip With the Youth」で見つけたスレッドに以下のLinkedInのURLがリンクされている。

https://www.linkedin.com/in/long-island-subway-authority/

このページにあるスキルの項目をすべて表示させると、Transportationに1件のスキル推薦があるので、詳細を見てみる。

このUIUC Chanが戦略的ビジネス提携を結んだ相手のようだ。プロフィールを見てみると、自己紹介にフラグが書いてあった。

uiuctf{0M160D_U1UCCH4N_15_MY_F4V0r173_129301}

X Marked the Spot (Cryptography)

フラグがXORで暗号化されている。鍵の長さは8。フラグの長さは48で鍵の長さで割り切れる。フラグの形式は"uiuctf{"から始まり"}"で終わる。このため、XOR鍵を算出することができ、フラグを復号できる。

#!/usr/bin/env python3
with open('ct', 'rb') as f:
    ct = f.read()

flag_head = b'uiuctf{'
flag_tail = b'}'

key = b''
for i in range(len(flag_head)):
    key += bytes([ct[i] ^ flag_head[i]])
key += bytes([ct[-1] ^ flag_tail[0]])

flag = ''
for i in range(len(ct)):
    flag += chr(ct[i] ^ key[i % len(key)])
print(flag)
uiuctf{n0t_ju5t_th3_st4rt_but_4l50_th3_3nd!!!!!}

Without a Trace (Cryptography)

サーバの処理概要は以下の通り。

・M = inputs()
 ・M: すべて0の5×5の行列配列
 ・各i行i列目のみ数値を入力し、書き換え
 ・Mを返却
・check(M) が0の場合終了
 ※Mの入力時に0を指定しなければよい。
・res = fun(M)
 ・f: flagを5バイトごとに数値化したもの5個の配列
 ・F: すべて0の5×5の行列配列
 ・以下5回繰り返し(i)
  ・F[i][i] = f[i]
 ・R = F * M
 ・Rの対角線の合計値を返却
・resを表示

1回目の5個の入力で、1, 1, 1, 1, 1を指定する。この場合funの表示では、f[0] + f[1] + f[2] + f[3] + f[4]の値が表示される。
次に2, 1, 1, 1, 1を指定する。この場合funの表示では、f[0] * 2 + f[1] + f[2] + f[3] + f[4]の値が表示される。
この結果から1回目のfunの値を引けば、f[0]の値がわかる。同様に他の位置でも実施すれば、フラグを求めることができる。

#!/usr/bin/env python3
from pwn import *
from Crypto.Util.number import *

def get_trace(p, u):
    for i in range(5):
        data = p.recvuntil(b'= ').decode()
        print(data + str(u[i]))
        p.sendline(str(u[i]).encode())
    data = p.recvline().decode().rstrip()
    print(data)
    return int(data.split(' ')[-1])

p = remote('without-a-trace.chal.uiuc.tf', 1337, ssl=True)

u_base = [1, 1, 1, 1, 1]
trace_base = get_trace(p, u_base)

p.close()

flag = ''
for i in range(5):
    p = remote('without-a-trace.chal.uiuc.tf', 1337, ssl=True)
    u = u_base.copy()
    u[i] = 2
    trace = get_trace(p, u)
    f = trace - trace_base
    flag += long_to_bytes(f).decode()
    p.close()

print(flag)

実行結果は以下の通り。

[+] Opening connection to without-a-trace.chal.uiuc.tf on port 1337: Done
[WAT] Welcome
[WAT] Define diag(u1, u2, u3. u4, u5)
[WAT] u1 = 1
[WAT] u2 = 1
[WAT] u3 = 1
[WAT] u4 = 1
[WAT] u5 = 1
[WAT] Have fun: 2000128101369
[*] Closed connection to without-a-trace.chal.uiuc.tf port 1337
[+] Opening connection to without-a-trace.chal.uiuc.tf on port 1337: Done
[WAT] Welcome
[WAT] Define diag(u1, u2, u3. u4, u5)
[WAT] u1 = 2
[WAT] u2 = 1
[WAT] u3 = 1
[WAT] u4 = 1
[WAT] u5 = 1
[WAT] Have fun: 2504408575853
[*] Closed connection to without-a-trace.chal.uiuc.tf port 1337
[+] Opening connection to without-a-trace.chal.uiuc.tf on port 1337: Done
[WAT] Welcome
[WAT] Define diag(u1, u2, u3. u4, u5)
[WAT] u1 = 1
[WAT] u2 = 2
[WAT] u3 = 1
[WAT] u4 = 1
[WAT] u5 = 1
[WAT] Have fun: 2440285994541
[*] Closed connection to without-a-trace.chal.uiuc.tf port 1337
[+] Opening connection to without-a-trace.chal.uiuc.tf on port 1337: Done
[WAT] Welcome
[WAT] Define diag(u1, u2, u3. u4, u5)
[WAT] u1 = 1
[WAT] u2 = 1
[WAT] u3 = 2
[WAT] u4 = 1
[WAT] u5 = 1
[WAT] Have fun: 2426159182680
[*] Closed connection to without-a-trace.chal.uiuc.tf port 1337
[+] Opening connection to without-a-trace.chal.uiuc.tf on port 1337: Done
[WAT] Welcome
[WAT] Define diag(u1, u2, u3. u4, u5)
[WAT] u1 = 1
[WAT] u2 = 1
[WAT] u3 = 1
[WAT] u4 = 2
[WAT] u5 = 1
[WAT] Have fun: 2163980646766
[*] Closed connection to without-a-trace.chal.uiuc.tf port 1337
[+] Opening connection to without-a-trace.chal.uiuc.tf on port 1337: Done
[WAT] Welcome
[WAT] Define diag(u1, u2, u3. u4, u5)
[WAT] u1 = 1
[WAT] u2 = 1
[WAT] u3 = 1
[WAT] u4 = 1
[WAT] u5 = 2
[WAT] Have fun: 2465934208374
[*] Closed connection to without-a-trace.chal.uiuc.tf port 1337
uiuctf{tr4c1ng_&&_mult5!}
uiuctf{tr4c1ng_&&_mult5!}

Determined (Cryptography)

サーバの処理概要は以下の通り。

・M = inputs()
 ・M: すべて0の5×5の行列配列
 ・M[0][0] = p(未知)
 ・M[0][2]: 入力
 ・M[0][4]: 入力
 ・M[1][1]: 入力
 ・M[1][3]: 入力
 ・M[2][0]: 入力
 ・M[2][2]: 入力
 ・M[2][4]: 入力
 ・M[3][1] = q(未知)
 ・M[3][3] = r(未知)
 ・M[4][0]: 入力
 ・M[4][2]: 入力
・res = fun(M)
・resを表示

Mは以下のような形式の行列になる。

    [  p,   0, m02,   0, m04]
    [  0, m11,   0, m13,   0]
M = [m20,   0  m22,   0, m24]
    [  0,   q,   0,   r,   0]
    [m40,   0, m42,   0,   0]

fun関数は行列式を計算している。
例えば、以下の形式にすると、行列式はp * rになる。

    [  p,   0,   0,   0,   0]
    [  0,  -1,   0,   0,   0]
M = [  0,   0    0,   0,   1]
    [  0,   q,   0,   r,   0]
    [  0,   0,   1,   0,   0]

nとp * rから公約数を取ればpがわかり、qも算出できる。あとはこのことからRSA暗号の復号をすればフラグが得られる。

$ ncat --ssl determined.chal.uiuc.tf 1337
[DET] Welcome
[DET] First things first, gimme some numbers:
[DET] M[0][2] = 0
[DET] M[0][4] = 0
[DET] M[1][1] = -1
[DET] M[1][3] = 0
[DET] M[2][0] = 0
[DET] M[2][2] = 0
[DET] M[2][4] = 1
[DET] M[4][0] = 0
[DET] M[4][2] = 1
[DET] Have fun: 89650932835934569650904059412290773134844226367466628096799329748763412779644167490959554682308225788447301887591344484909099249454270292467079075688237075940004535625835151778597652605934044472146068875065970359555553547536636518184486497958414801304532202276337011187961205104209096129018950458239166991017
#!/usr/bin/env python3
from Crypto.Util.number import *

with open('gen.txt', 'r') as f:
    params = f.read().splitlines()

n = int(params[0].split(' ')[-1])
e = int(params[1].split(' ')[-1])
c = int(params[2].split(' ')[-1])

pr = 89650932835934569650904059412290773134844226367466628096799329748763412779644167490959554682308225788447301887591344484909099249454270292467079075688237075940004535625835151778597652605934044472146068875065970359555553547536636518184486497958414801304532202276337011187961205104209096129018950458239166991017

p = GCD(n, pr)
q = n // p
assert p * q == n

phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(c, d, n)
flag = long_to_bytes(m).decode()
print(flag)
uiuctf{h4rd_w0rk_&&_d3t3rm1n4t10n}

Naptime (Cryptography)

暗号化処理の概要は以下の通り。

・n = 8
・b = get_b(n=8)
 ・b = []
 ・bに128以上256以下のランダム整数を追加
 ・以下7回繰り返し(i)
  ・lb: bの合計値
  ・found = False
  ・foundがFalseの間以下繰り返し
   ・num: 2**(n + i)とlb + 1の最大値以上2**(n + i + 1)以下のランダム整数
   ・numがlbより大きい場合
    ・found = True
    ・bにnumを追加
 ※要素8個の超増加数列を生成
・M, W = get_MW(b)
 ・lb: bの合計
 ・M: lb + 1以上2*lb以下のランダム整数
 ・W: 1.5 * [bの長さ]の整数値のビット数の素数
 ・M, Wを返却
・a, pi = get_a(b, M, W)
 ・a_ = []
 ・bの各numについて以下を実行
  ・a_にnum * W % Mを追加
 ・pi: bの長さ未満の順列の一つをランダムに選択したもの
 ・a: bの長さのa_[pi[i]]の配列
  ※a_をランダムに並び替えたもの
 ・a, piを返却
・ct = enc(flag, a, n)
 ・bitstrings = []
 ・flagの各文字cについて以下を実行
  ・cのASCIIコードを2進数にしたものを8桁に0パディングし、bitstringsに追加する。
 ・ct = []
 ・bitstringsの各bitsについて以下を実行
  ・curr = 0
  ・bitsのインデックスi, 文字bについて以下を実行
   ・bが"1"の場合、currにa[i]をプラス
  ・ctにcurrを追加
 ・ctを返却
・aを出力
・ctを出力

bは超増加数列で、aは(num * W) % Mになっている。Merkle-Hellmanナップサック暗号になっており、シャミアの攻撃法でフラグを復号する。

#!/usr/bin/env sage
from Crypto.Util.number import *

with open('pub.txt', 'r') as f:
    params = f.read().splitlines()

a = eval(params[0].split(' = ')[1])
ct = eval(params[1].split(' = ')[1])

n = len(a)
MULTIPLIER = 100

flag = ''
for i in range(len(ct)):
    M = matrix(ZZ, n + 1, n + 1)
    M.set_block(0, 0, MULTIPLIER * matrix(n, 1, a))
    M.set_block(n, 0, MULTIPLIER * matrix([-ct[i]]))
    M.set_block(0, 1, 2 * identity_matrix(n))
    M.set_block(n, 1, matrix([-1] * n))

    for x in M.LLL():
        if all(x_i in [-1, +1] for x_i in x[1:]):
            bits = 0
            for x_i in x[1:]:
                bits *= 2
                bits += int(x_i == +1)
            break

    flag += chr(bits)

print(flag)
uiuctf{i_g0t_sleepy_s0_I_13f7_th3_fl4g}

Snore Signatures (Cryptography)

サーバの処理概要は以下の通り。

・LOOP_LIMIT = 2000
・p, q, g = gen_snore_group()
 ・q: 512ビット素数
 ・LOOP_LIMITだけ以下繰り返し
  ・X: 1024ビットランダム整数
  ・p = X - X % (2 * q) + 1
  ・pが素数の場合、繰り返し終了
 ・r = (p - 1) // q
 ・LOOP_LIMITだけ以下繰り返し
  ・h: 2以上p-1以下のランダム整数
  ・pow(h, r, p) が1以外の場合、繰り返し終了
 ・g = pow(h, r, p)
 ・(p, q, g)を返却
・p, q, gを表示
・queries = []
・10回以下繰り返し
 ・x, y = snore_gen(p, q, g)
  ・x: 1以上q-1以下ランダム整数
  ・y = pow(g, -x, p)
  ・(x, y)を返却
 ・yを表示
 ・m: 数値入力
 ・queriesにmを追加
 ・s, e = snore_sign(p, q, g, x, m)
  ・k: 1以上q-1以下ランダム整数
  ・r = pow(g, k, p)
  ・e = hash((r + m) % p) % q
   ・output = 0
   ・3回以下繰り返し
    ・output: ([(r + m) % pのバイト文字列] + [iのバイト文字列])のsha512のダイジェストを
         16進数表記したものを数値にして、(512 * i)ビット左シフトしたものとoutputをXOR
   ・outputを返却
  ・s = (k + x * e) % q
  ・(s, e)を返却
 ・s、eを表示
 ・m: 数値入力
 ・s: 数値入力
 ・mがqueriesにある場合、終了
 ・snore_verify(p, q, g, y, m, s, e)がFalseの場合、終了
 ・queriesにmを追加
・フラグを表示

よく見ると、入力チェックが甘い。1回目のmに対して、2回目にm+pを指定すれば必ず成り立つ。

#!/usr/bin/env python3
from pwn import *

r = remote('snore-signatures.chal.uiuc.tf', 1337, ssl=True)

data = r.recvline().decode().rstrip()
print(data)
p = int(data.split(' ')[-1])
data = r.recvline().decode().rstrip()
print(data)
data = r.recvline().decode().rstrip()
print(data)

for i in range(10):
    data = r.recvline().decode().rstrip()
    print(data)
    data = r.recvline().decode().rstrip()
    print(data)

    data = r.recvuntil(b'= ').decode()
    print(data + str(i))
    r.sendline(str(i).encode())
    data = r.recvline().decode().rstrip()
    print(data)
    s = int(data.split(' ')[-1])
    data = r.recvline().decode().rstrip()
    print(data)
    data = r.recvline().decode().rstrip()
    print(data)

    data = r.recvuntil(b'= ').decode()
    print(data + str(p + i))
    r.sendline(str(p + i).encode())
    data = r.recvuntil(b'= ').decode()
    print(data + str(s))
    r.sendline(str(s).encode())
    data = r.recvline().decode().rstrip()
    print(data)

data = r.recvline().decode().rstrip()
print(data)
data = r.recvline().decode().rstrip()
print(data)

実行結果は以下の通り。

[+] Opening connection to snore-signatures.chal.uiuc.tf on port 1337: Done
p = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306333
q = 7876721542069803440502484358868287319474506698532914772431945140789658028031057012671834645200928549155586041542723205652322347374566510092259630239463827
g = 2069024689829247413403764678005999787780137685279750223691342633019952210703135616792534854616926098191303819017866236807970363629898827404770609739024644275600724539946585765650843655444242311287120177638697216561519919229771120879411058942157528837378416095176564280273043921370532040472575658887621761307
y = 8645622220949685041240355138378532133901307759300049121470867585666550655036197683949747988521367780518976819359067976500644393514138262831691874792873198781152063809826958106510008441356555368675777569352992836323312826547453159984410786547699784937669296255120940431242787262605695157528066392260702195007
you get one query to the oracle
m = 0
s = 5048110493181362691297796168264774731665565496567375727890348067936780809862752604586487821783331328338127312802563033450049142450039217368303993940577295
e = 6078051394323606604024115640588697702090803454854752615753098979464945946121464935074478776079523730827786628012481161218537871294278840115360836522218688
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306333
s = 5048110493181362691297796168264774731665565496567375727890348067936780809862752604586487821783331328338127312802563033450049142450039217368303993940577295
correct signature!
y = 11334839683849688524046158364674951838089661997798231924953430573921195626315510917744826006380828369253425898753717408126558307759743821089823606278157665551387443793874218844201003107348633361933915494922121533504343654538031338749829492028729471657678836819641654905790485518375110992544399796131874071394
you get one query to the oracle
m = 1
s = 725132466970494466998159126753376935415686199636897237561113981412161806372476596628294981579180425552344754465363483019252587334114383167598903155774863
e = 1467206386223620211942248870799567349867475076316775144544989853439138494484683779474457485681324268647399968588589226810772279051412424692252292790385713
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306334
s = 725132466970494466998159126753376935415686199636897237561113981412161806372476596628294981579180425552344754465363483019252587334114383167598903155774863
correct signature!
y = 4007459262867683634645251868771882139527169123234061240266599554256237854137689046578162021800042235636132696901886969358154967411767464892755474687897791358015464810699595938274787182049966413434241093657627522575269167310759560845708599423530117596389429394663397373941846750698600120876990710286790968996
you get one query to the oracle
m = 2
s = 5626271030442963119756755719651482376791196468437352844824280401321884530822802470072268390421230494953828275754509566036981457938967872595498539969769061
e = 2314349706567110133519609601452528222805877677504465624899520542877232641392306611715058822789273325630141668652760290208572894792014960939885936831339698
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306335
s = 5626271030442963119756755719651482376791196468437352844824280401321884530822802470072268390421230494953828275754509566036981457938967872595498539969769061
correct signature!
y = 810857574689382065384514119364094661964022146168646793976444108968327211048899679254761384088346425709983691336914888829034697959243709447113904223152598089294085946956993131497630137505727691419187377926804059939874185455119820339143956189402813171839416445459291447535100994856343918596418063629845472765
you get one query to the oracle
m = 3
s = 5642243486827005896954569791919643152365371285201092642261957514748659423073959296680637135691032184255295907590896431396629942000908734993912795464591121
e = 870188239953989037210685314977049304481103455839427692054816181870688381877864514643525620514960080280421543390111037988243008834471665125902727594510205
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306336
s = 5642243486827005896954569791919643152365371285201092642261957514748659423073959296680637135691032184255295907590896431396629942000908734993912795464591121
correct signature!
y = 11218875214007376830619422719774677682708252795252329823647039225424586845462787980832376093099561045856461637522860438069119566943996191913546888781319986240909489232882873877260201536138420708420086912572795262534597414877958504084181964862021569817338095808572088197115838493923007294192803544133822385242
you get one query to the oracle
m = 4
s = 6629187246596354716620652915287551531492876083339957018673049684617884282030113157824104022203525505424518711363453792389170229364585232820963919170441379
e = 2019273670674861266558426725442584591161238007873354305916975235825647227914527441843797014627436583042578677252354300421262959190112665011179216804313559
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306337
s = 6629187246596354716620652915287551531492876083339957018673049684617884282030113157824104022203525505424518711363453792389170229364585232820963919170441379
correct signature!
y = 3190282629176451798082417838762712058486651286121450758316674464713339166835995863391385646691495305245660511535135648458614945436798665185949231408217335128692039137867816904294707819392005213431713487340660011368411870362506511176477819722892076969438091680734641317687867451354911772245040306572058943800
you get one query to the oracle
m = 5
s = 2006822978292529675854242650127135513540600681864320996714745045076803264487932488416570964171870990321451188543603628182906373570278295902342719272161502
e = 7030993066640724490869268250750395581449620103442101422390038261597697866347661182883778811031916160826413668484224476982574958566509100537761701513444263
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306338
s = 2006822978292529675854242650127135513540600681864320996714745045076803264487932488416570964171870990321451188543603628182906373570278295902342719272161502
correct signature!
y = 3468493208766693943699355242209015202411666408117171870426575827292025043186922975076131931793604768978538093898568816591298000791828719761690718847360012522747457253756083191509292545957399409615760012771083205413596433475566516572328738100830274748054759218779111554119749566687851926123002030193147135574
you get one query to the oracle
m = 6
s = 1582387921911076985485232587709076847733307117522888497423691941325210258492162789245899440993528277055302503971387010648636928076538915395967167177129307
e = 5524623040910127193132319659942283287944962879975984952291583818331402639900707431898434059452150708694670148766204261503222902226508479026182884378844201
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306339
s = 1582387921911076985485232587709076847733307117522888497423691941325210258492162789245899440993528277055302503971387010648636928076538915395967167177129307
correct signature!
y = 6754374684004140134214874253192597821290708600520486613999294770475072570731818496205923777289180660196411298835101696492091528002645513904247425885018224056673786723665933028543081625471449748632054469310115117462533917758255403049922691853004079258624188441477492018319086829128066105866633843745745523261
you get one query to the oracle
m = 7
s = 113263329347205788113528985304711810767710180416973137119448320661573179360373402841653963295433092919983273560061589216135530781417862421993684101533143
e = 1178081196185899696013280233727534155093136592790970158640520863659791036642026456206511813435565829847444523810772409056565027391975500266969955172491236
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306340
s = 113263329347205788113528985304711810767710180416973137119448320661573179360373402841653963295433092919983273560061589216135530781417862421993684101533143
correct signature!
y = 2590843797238960102193459772923962295285477798404645184105208304815615986837940340147937283451796581433005566009695700553125796303046335205829292406525520806873206048480465257344341247421603820113847950494805536407507629462093160630843885751994446861597251925590320218138290556766976039628288977050114483958
you get one query to the oracle
m = 8
s = 2838390437252972423716832657124924123521908291784494872848947638660775161173161953030946586925255355172225907674543759427230035864581003437954331354786157
e = 4373804456692683332349698709145737187690093775030634867362503004892232909448376708501132396903627945789308273365182755692915469906143677349788416496396886
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306341
s = 2838390437252972423716832657124924123521908291784494872848947638660775161173161953030946586925255355172225907674543759427230035864581003437954331354786157
correct signature!
y = 928165700275168392271243787969488767164377566409975286730023079403057191669249152959043298509984587287491974379560202138531581924358938224558502413406657518935171547003874036456171945791786339538954114111376329266928604206570183850537638965162477135983349572638555649786808376801378779132907259921237681214
you get one query to the oracle
m = 9
s = 6682927399268660448114151561076690780393657581559150499998777924729591403123326711098685349792037579656963321067358079195287319520547653981983842206723505
e = 1766129393286536057999519622882191599238733184288233377820287271626491644628771927242731982549664403509911036665436853531510672061776547217747216973755684
can you forge a signature?
m = 14362122615459539031559535714440495954555152066167121756929433345078337204241894590439294649822745793288353795636740040194262551787694788067402619665121688452424225749779232205796547599005889808831706118503395937342405094300033489431187877889562956452944966154706073907939942021228718131823307839600961306342
s = 6682927399268660448114151561076690780393657581559150499998777924729591403123326711098685349792037579656963321067358079195287319520547653981983842206723505
correct signature!
you win!
uiuctf{add1ti0n_i5_n0t_c0nc4t3n4ti0n}
[*] Closed connection to snore-signatures.chal.uiuc.tf port 1337
uiuctf{add1ti0n_i5_n0t_c0nc4t3n4ti0n}

Feedback Survey (Miscellaneous)

アンケートに答えたら、以下のメッセージが表示された。

hank you for giving us your feedback!

THIS IS THE FLAG: f33d_u5_f33db4ck (wrap it in the flag format)

DO NOT SUBMIT THIS FLAG (if you submit it, we will not give you points for the feedback survey challenge): uiuctf{i_submitted_this_flag_with_a_script_because_i_am_lame_or_i_just_cant_follow_directions}

"f33d_u5_f33db4ck"にフラグの形式になるようラッピングする。

uiuctf{f33d_u5_f33db4ck}