FooBar CTF 2023 Writeup

この大会は2023/3/11 15:30(JST)~2023/3/12 15:30(JST)に開催されました。
今回もチームで参戦。結果は4545点で108チーム中1位でした。
自分で解けた問題をWriteupとして書いておきます。

sanity-check (welcome)

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

GLUG{w3lc0m3_t0_f006@rCTF_2023}

Pixelite (crypto)

問題文にある数値は乱数のseedの値として使う。暗号化でXORしているので、暗号文に対して同じようにXORして復号する。

#!/usr/bin/env python3
import random
from PIL import Image

tm = 1678519928.9423187
random.seed(tm)

flag_matrix = (img := Image.open('pixelite.png')).load()
w, h = img.size

for i in range(w):
    for j in range(h):
        flag_matrix[i, j] = tuple(
            map(
                lambda x: x ^ random.randint(0, 255),
                flag_matrix[i, j]
            )
        )

img.save('flag.png')

復号した画像にフラグが書いてあった。

GLUG{Y0u_4Re_noT_5o_w34k}

funwithrandom-1 (crypto)

コードを見ると、Mersenne Twisterのような処理をしているが、パラメータや一部の処理が異なる。624個のランダム値から次の5個の数値をあてることができたらフラグが表示される。0, 1, 397番目がわかれば、624番目のステータスがわかるので、624個のランダム値の一部を使って、次の5個を算出できる。

#!/usr/bin/env python3
import socket

MATRIX_A = 0x83a2b0c3
UPPER_MASK =  0x80000000
LOWER_MASK =  0x7fffffff
TemperingMaskB = 0x3f5663d0
TemperingMaskC = 0x56e90000
mag01 = [0, MATRIX_A]

def recvuntil(s, tail):
    data = b''
    while True:
        if tail in data:
            return data.decode()
        data += s.recv(1)

def untemper(rand):
    rand ^= rand >> 69;
    rand ^= (rand << 67) & TemperingMaskC
 
    a = rand ^ ((rand << 12) & TemperingMaskB);
    b = rand ^ ((a << 12) & TemperingMaskB);
    c = rand ^ ((b << 12) & TemperingMaskB);
    d = rand ^ ((c << 12) & TemperingMaskB);
    rand = rand ^ ((d << 12) & TemperingMaskB);
 
    rand ^= ((rand ^ (rand >> 43)) >> 43);
    return rand

def temper(st):
    y = st
    y ^= y >> 43
    y ^= (y << 12) & TemperingMaskB
    y ^= (y << 67) & TemperingMaskC
    y ^= y >> 69
    return y

def get_st624(st0, st1, st397):
    y = (st0 & UPPER_MASK) | (st1 & LOWER_MASK)
    st624 = st397 ^ (y >> 1) ^ mag01[y & 0x1]
    return st624

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('chall.foobar.nitdgplug.org', 30001))

for _ in range(2):
    data = recvuntil(s, b'\n').rstrip()
    print(data)

data = recvuntil(s, b'\n').rstrip()
print(data)
output = eval(data)

for i in range(5):
    st0 = untemper(output[i])
    st1 = untemper(output[i+1])
    st397 = untemper(output[i+397])
    st624 = get_st624(st0, st1, st397)
    num = temper(st624)

    data = recvuntil(s, b': ')
    print(data + str(num))
    s.sendall(str(num).encode() + b'\n')

data = recvuntil(s, b'\n').rstrip()
print(data)

実行結果は以下の通り。

Thou shall guess the next 5 random numbers or burn in the eternal fire of RPNG Generator

[1320628351, 3301589036, 2072802137, 2389782933, 327207309, 4151521776, 4112190827, 3386645684, 2993632920, 1922589911, 2217432433, 4057472927, 1901459443, 3108688499, 1454227399, 3777577169, 1362785214, 1954855087, 2003058223, 4278735374, 2638245064, 577199033, 3952660819, 1968184298, 4011235045, 101140004, 697326636, 3231500334, 3187698947, 828722696, 3624571913, 1918488562, 2911272223, 2107709862, 3975805094, 2813919509, 2502836662, 3925461784, 2601070262, 3062824329, 693555449, 303410023, 280207393, 41600167, 865581844, 2132385100, 2992232886, 3913361749, 3275668929, 2663798518, 1303265051, 1999047111, 1019035417, 3897152464, 1706377392, 262761188, 3929671116, 377439593, 2766982325, 1191471084, 3371656994, 734753654, 933434058, 1427360972, 2367511820, 4025089426, 1562660708, 4203832589, 452955339, 1723067117, 1438361576, 3306411845, 1210534415, 3069478768, 2610285132, 2298905714, 2365447259, 1666924773, 480978863, 187816672, 907959585, 1414121795, 560203220, 2872737145, 1606475168, 2564462313, 1194758006, 2084206446, 819439493, 386148263, 3681746586, 575730043, 3350853410, 3446986682, 970638702, 2132749799, 4132751299, 890994629, 105970803, 3547111015, 3106718218, 1935637417, 3068793013, 1591669799, 3541206049, 1370609568, 2068959104, 1745573854, 1413535641, 1869336159, 130863676, 1313353762, 2697529315, 84621553, 2011192821, 270448452, 894690231, 3774392294, 1637563121, 690908714, 1136114329, 1172535639, 830320263, 2529358145, 528005559, 1704128366, 2046759490, 1891420685, 3178127927, 3643993810, 1554625376, 3877234538, 2793977784, 3709656860, 4118901764, 431828176, 3929368359, 274875292, 3209033287, 1945602429, 2302853988, 1526118767, 1777335048, 2032266601, 27268941, 4268318798, 436587152, 2553088586, 4203178360, 2631408875, 1922954811, 3663946375, 2320813698, 2330997592, 398574157, 3654825376, 1778473974, 256473363, 4153966571, 1835617296, 241165371, 3907075307, 3289763181, 425930966, 2089850171, 3908501374, 1312476614, 2252439835, 3772898371, 3000802805, 925325187, 379268068, 2768080901, 2447934104, 1389186478, 911087019, 2750287676, 1974268040, 2679934496, 1663906235, 468728835, 1601735634, 3712472869, 3216996284, 3375664138, 3427193576, 2002640862, 2055781629, 4115975752, 1755995981, 1455062420, 2097560640, 238525681, 2782643362, 1332493271, 1489610641, 4067298083, 3921046085, 2271754693, 4279448178, 2064292125, 2796318296, 3499919494, 3942913929, 1791883529, 486590951, 1361748397, 2650208600, 3009762331, 2618551685, 2674094731, 627380018, 3689345807, 2924963314, 3898277237, 22864778, 329316783, 3346873063, 2961031201, 381307278, 1002057060, 541990135, 702433348, 3781506999, 886252268, 3998856016, 3410484597, 2263381501, 3721966772, 4075573138, 879618391, 302736313, 3601046005, 1973418735, 4088882020, 1596973756, 3393439293, 2628611269, 2581730835, 1807202918, 306874011, 1848873823, 2415510757, 4066497018, 2650024940, 870801908, 2352312646, 3958734969, 1717043781, 1276801488, 653612616, 621506292, 1137634468, 232949457, 2678741563, 1541860039, 3096473718, 2128609130, 3668285392, 1979866606, 3444224875, 1077557504, 1318204829, 1346705840, 1827213579, 2985290240, 1544259962, 1907561792, 408305497, 4216586436, 535991889, 1670470673, 97782236, 3833257153, 3810693916, 2479994624, 2295076101, 3437727474, 1330968944, 2885628870, 2422822513, 1986307285, 2696794654, 3939963627, 1136383982, 2552171681, 2108724250, 3945275666, 3575593898, 985219790, 3717479440, 1609215488, 326484574, 1983826679, 2219473075, 367474499, 1803622009, 4162851035, 568832285, 3204505208, 663390372, 2168911486, 2291454943, 2890933660, 792239992, 3056795530, 2324095776, 303606485, 161331313, 2674864504, 3981946240, 621128764, 1791886682, 2070604796, 751602884, 1601735396, 3214993832, 498780198, 4025769571, 4253929721, 2423298331, 296012159, 3971691167, 3944018511, 4289289139, 3787171438, 567086395, 3748265200, 3699619568, 309663043, 3693418052, 4030853382, 1499578263, 2233225448, 2638933626, 1556115100, 1736737328, 3500880668, 4146638789, 3079795631, 581890178, 2089227891, 251132444, 2002921109, 2940895036, 345729383, 573539246, 2370406026, 3485578623, 3354511400, 3538490131, 1264834619, 3304648237, 3448294143, 3720589714, 1114395982, 974530022, 1674132139, 4029577595, 302577450, 3174081014, 1215513662, 893686208, 1725313158, 4038252882, 703214180, 3705475835, 2537418270, 969836815, 3838932822, 3775275168, 1014821067, 206923666, 2492195034, 655231726, 1171216499, 2978788404, 3728355166, 1013454426, 1571852252, 35287340, 4120805461, 2463503648, 2633805586, 2017639040, 4291820711, 2984007136, 50709190, 1672440152, 3755354589, 1822980931, 2801263699, 1622969033, 1011994532, 1262208604, 2756961152, 2433081607, 2738866145, 814897250, 2286319598, 2082950876, 860464106, 1978005849, 3153631465, 3558150787, 2902908260, 2871254089, 488376438, 3204832611, 3362850805, 3332404310, 1898691849, 2752913921, 24745671, 350990999, 932138237, 2665837748, 2042501205, 3293753637, 322903029, 340499799, 3976131775, 2573371464, 857154894, 3408019668, 2144658549, 1372901844, 1420711808, 3783483446, 3050589347, 1838523572, 1383172376, 2941994513, 1548594523, 2754862346, 4033294997, 691149655, 4057149529, 11129426, 36614139, 2083811055, 3723018637, 961416451, 1126858787, 1586349569, 90595025, 4186577016, 140500031, 1385381671, 2004758456, 2360156908, 1702704159, 1798770200, 3129069832, 2285203059, 1961986419, 3597598191, 2442163415, 2056606654, 931953271, 2979533457, 2751846464, 1706957415, 265612064, 3950515445, 3818403604, 2213311199, 4271032237, 1353886289, 3194538453, 515007590, 788868006, 2849131009, 1603850430, 3316330016, 2007424404, 215993951, 268258041, 1784971694, 1740849119, 1860697381, 733395785, 786808320, 676923830, 529005907, 1042663409, 138797400, 2567805208, 1567906119, 2722403809, 1646709048, 1913164148, 3879481277, 178417731, 1995293827, 730593141, 2335238305, 1414637740, 4077601796, 2778135677, 2958801187, 1363191845, 2456380686, 4022742275, 1054959887, 88403391, 3191790913, 2944156574, 1730957170, 2096954313, 3721407658, 1499544117, 4072246022, 4182507738, 1238920127, 3528337664, 487714129, 3589790936, 87409386, 2823098837, 2404620044, 3843987120, 2233174751, 1315421734, 4107617873, 2448093207, 298910836, 45232841, 586275090, 1177701918, 631735219, 1246816788, 3223349606, 2307301554, 1039409635, 3810133576, 2502007673, 2706372285, 3178474340, 4244720601, 3963286829, 3325072564, 977780692, 3455354407, 500959532, 1418444101, 1966063615, 1311595764, 2279115013, 1092715203, 3270771887, 447023407, 637412508, 2850194367, 2706685430, 671973604, 2760342901, 3105171056, 363926148, 4216225920, 3755458150, 1067680869, 1410481113, 2146860573, 2815241410, 1340676439, 966837257, 3436909959, 20704971, 3113506871, 2705559617, 3333808902, 3554589753, 2225874832, 1213397637, 2518029640, 1692181860, 3347912160, 492168648, 3567726530, 4252968871, 2345178069, 1297377307, 4119653789, 1323230213, 3477211073, 3959171878, 1400491873, 2993979279, 464885868, 2203466663, 892692113, 506986477, 1961977322, 1931787563, 2102610013, 3679873102, 2989494844, 1015995684, 597350387, 2030210720, 1825767759, 3849791479, 1307099465, 2937049479, 2766844772, 65620591, 2423307324, 2845580582, 3800830884, 1230356477, 912849676, 1902922736, 29196256, 2377876334, 112568289, 129167782, 3803471010, 4004499962, 2616646628, 1807863283, 2611115322, 3812060641, 511293947]


Number 1: 2170267639
Number 2: 3848974605
Number 3: 659849191
Number 4: 2634939097
Number 5: 679295762
GLUG{R4nd0m_Numb3r_G3n3r470r_15_tru3ly_r4nd0m_0r_15_17}
GLUG{R4nd0m_Numb3r_G3n3r470r_15_tru3ly_r4nd0m_0r_15_17}