Cyber Grabs CTF 0x03 Junior Writeup

この大会は2022/2/6 13:30(JST)~2022/2/7 1:30(JST)に開催されました。
今回もチームで参戦。結果は2950点で285チーム中37位でした。
自分で解けた問題をWriteupとして書いておきます。

Welcome (Misc)

問題にフラグが書いてあった。

cybergrabs{w3lc0m3_t0_thecybergrabs_jun10r_ctf}

Discord (Misc)

Discordに入り、#miscチャネルのトピックを見ると、フラグが書いてあった。

cybergrabs{1_am_h3r3}

First Telecommunication (Misc)

Baudot code。https://www.dcode.fr/baudot-codeでデコードする。

YOUGOTTHISBAUDOT
cybergrabs{yougotthisbaudot}

Electronics (Misc)

Decabit Code。https://www.dcode.fr/decabit-codeで復号する。

decabit_was_fun
cybergrabs{decabit_was_fun}

Custom Cipher (Reverse)

pycをデコンパイルする。

$ uncompyle6 script.pyc 
# uncompyle6 version 3.7.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.6.9 (default, Dec  8 2021, 21:08:43) 
# [GCC 8.4.0]
# Embedded file name: script.py
# Compiled at: 2022-01-28 18:05:32
encoded_flag = '*@),9.9():B@tz&k6<5i&\\mX&xmn-y&*Vu/,wD'
alphabet = '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'

def encode_secret(secret):
    rotate_const = 37
    encoded = ''
    for c in secret:
        index = alphabet.find(c)
        original_index = (index + rotate_const) % len(alphabet)
        encoded = encoded + alphabet[original_index]

    return encoded


text = raw_input('Enter any text to encrypt: ')
if encoded_flag == encode_secret(text):
    print 'Congratulations!!!. You found the flag.'
else:
    print 'Sorry!!!'
# okay decompiling script.pyc

alphabetテーブルを使って、シフトすれば元に戻せる。

#!/usr/bin/env python3

def decode_secret(enc):
    rotate_const = 37
    decoded = ''
    for c in enc:
        index = alphabet.find(c)
        original_index = (index - rotate_const) % len(alphabet)
        decoded = decoded + alphabet[original_index]

    return decoded

encoded_flag = '*@),9.9():B@tz&k6<5i&\\mX&xmn-y&*Vu/,wD'
alphabet = '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'

flag = decode_secret(encoded_flag)
print(flag)
cybergrabs{yOU_FounD_7H3_SHIfT_c1PheR}

Easy Web (Web)

CookieValueパラメータに以下が設定されている。

Y3liZXJncmFic3tpdHNfZWFzeV93ZWJ9
$ echo Y3liZXJncmFic3tpdHNfZWFzeV93ZWJ9 | base64 -d
cybergrabs{its_easy_web}
cybergrabs{its_easy_web}

Deep Dive (Forensic)

docxをzip解凍し、word\media\image8.pngを見ると、フラグが書いてあった。

cybergrabs{1337_c3r531_1_w4n7_h3r_70_kn0w_17_w45_m3}

RSA (Crypto)

公約数を使えば、それぞれnを素因数分解できる。あとはそのまま復号する。

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

n1 = 499706268957559730491164540998338258883532414170700653130911397268234113481080963918321305267341326450478879157130510930623444049434509317612514399823098367983310483386628256287980674969663110008795687957487096088330018784585057801721751558105831759247127403739925932543283623560481452245740029174409033266132724590751928928115333961483549400752585968583376703142914609145009211318538547587888076076178349252670184911275929355793636427319862994023238387094272029888330314900373570758191172890299181158346523451882056517243021463643581331552431251583066201121123152381274383947995534026143928869232865333366403440236952240679072532874612084230625868170803027944168535574260446758852425560792628447525185533021337895859897398695943729172860788315908771463910197267001439257876037872070331641023034138245558165165340116033382340111895624534754568351277303809926433971988440494613046191878443283525423239463064663606909307174125579587521398776421446056287902483577473643993963840997983832722568721239547179266103789184910982857534157455112714215809010354378842367565556626694224107993949247123284327360880494890034542924221229087277232358377244222233732778562713932838614909698965275890423110380252979732377693638893468590332006061455283
n2 = 404276687876943298310539520498168470101779644733544074098676725153486020213185803410455255634742459490860867517340586618185656295679927841150002376956262137610555378103879518970390139964197631453175127750544634745444847890376239900854108380209388259218325039650715387879011682597779547352010875572074871463692838318437929519157511807731499821505802682655838610194059002438577451781669837115256697621734397259684064516050415919835708596755405436249507124986199760290881771591256299134967251891680927050009828328520225301145099228821896556963030436999601246904672997311956999265121562227801347116727699556876725806025215349546298379541910723464502080105186101615179985168847154973832847322719139817102227440191166601723829078696215948736320597504985823726933668445084412061928895978621322715803356742464086040100427513529070828731751608487297080715722662115389797434399778247050766603193944300958363928542046682236180566893566595186448153471388931998766151307915208527821212805899228048231111034546536090305793708058481541061477302224326062254459713509087296550387208171272311673531720757769564731615957728454165423369662804629255649166163273590672696849679665544447802548287025927245109585506789927484576685860779350217055092535305267
n3 = 478570379213189450618839681119751341139563581321192904815468330974004078464604481137108848219666547848726834000116562317933959728997531439882215121020784408850430212348433467923966199043998811819496663596471514269631502578290515429911179885409725861093897286450948329033297040125147284728429417386221195424598226643618704813304311937635607834810348186022478710015647634307441795796227767415133464646146645939726874254062837509808768551906202613125923764586140377726322818851391670776597740845026674932079880440285716838228294815993982684180182814902509008435856722522228570943964716534387741205848121092423937667660147908891095841361859655813579127901178652286620426405664544935828708232116414623228871739200187923935678715915926692880382516020309362318613992193854835821834608018477072306925508292291574368809586788584557256080904959800773096705410033191201735066844172012135775670150186818828370247400179480502185758633787517857584921407133170510415272606821418392258376765354706262253743673705697445498634265991478275986376403367307286397097948271983309435929422786403958481850388994089551301813067918597686933938537406157400186759105124804105499351647280618170564948964078294231696418864922801188811314903845478667425208709634329
c1 = 336177371024257676365792824583744895492694779771102340955219143486265182787639072826791757835477302989774452483831462493384265578598914516751911908983331865875443482376917320525593651442385197583518915024864137440866614430809256713640287814038251449654076428108039314997722023014345683253324135073945522560552285302950260196872961440277881646653803999587273953471441271552231736344702849102761463569771121696159178931270605354911765857887534825514927977741203696187665502549290045082075370295080889168727866941800572795753339768213201924250835140384838368147988176204514091967047778687474271589416062110933474108020843725197501143274994357232108097414294320097372900331943284170235877569191950304721500353736069801390686270424728521132882909783254763080370627693837801261010538024270381632304578427029760711347573082920433595299453100976283220831768581992448155328859442289402232125660645068186190914288311118868179624905105880939431771508357242510066663624799088471870217696241563377546795586640260509650315581112868271627888514601487798378186159137461805477841785821483840216419778992554194009449413998902203239392873900646723867496085833291845755477139252589834484823843583761901260661577083315949662871105977673175532686498076973
c2 = 29968185866205734839105882083922211251232283594937416738382538061403894667220011647670072145148552977341038021600399346277068793498990481447136243521228423312079952613087864473549628538145556361686245906797452694932058740906541237198050962842543322882977808419138644496949209408220464028217643432523290726801275167678136670767314811669797035466218769047476214212925015264407824982707722057673638766089892188625517857044565278893835878984406628458484373035548109156428175133233887678974665353694644616305735723208457660544648205554240050660947827209177002089860436054395982571897776435379968351476255703309439752492081171285784629688560567699871461866988373465667902695453762367675744161526729109213233652350864946063330274003913500747534591799036539338449038085341227458413737547062950834065653171434631629670302096418763834630078784657572614526736582952710085296914832427024607954452060823819012195102503819200185068648395560894251307891006958622189814825638431722964629727212854300381952848759351230411953057822880431790596001477055925302736191682156962029124193186415712245268013102878129163691914004115117611555482912477750031230772888835093739213452114141863512637060397757562962517780653835326442861906149477004815138704332536
c3 = 92841993102722680218209738606801962536666178068176185852745280559035034340722456837404646324957945867454275817008668360388629393307489528214733109761082782483351017866454153459789656020701260370969340194033985149610886381160249098848369466415861542114743923215607404485451371947921220457096381829972573772851136290682393286284912730931132310743389940097417667229058201907662945616919410057297200969324293286260738322576301600619325179913026376368767373888315837628236850096514929628137229722406496816394576822855126405629571836143016891905374746568659577568343694573395603920542071155086250275106945312625104768812639686576642464489011697135137859119547596550481806287702559336151042819736180410551662037932404561908512500142430244313062462237583418031835983149558146409315578974181982357794739779223056187937510622092295625953911592837027995309795022223975774431827232910935639877083118595166897072924148906326303703474254126779759549473955814221157097904134817562244362507584823971382174564218174267002087059736979685576107697384391565877900415747514493628973889709212353490588894732769042799002325736767945174193298693846806549376792670119349787551163107926924481096517989425293870354150016067543603026413738368093379585169600854
e = 65537

p = GCD(n1, n3)
q = GCD(n1, n2)
r = GCD(n2, n3)
phi1 = (p - 1) * (q - 1)
phi2 = (q - 1) * (r - 1)
phi3 = (r - 1) * (p - 1)
d1 = inverse(e, phi1)
d2 = inverse(e, phi2)
d3 = inverse(e, phi3)
m1 = pow(c1, d1, n1)
m2 = pow(c2, d2, n2)
m3 = pow(c3, d3, n3)

flag1 = long_to_bytes(m1)
flag2 = long_to_bytes(m2)
flag3 = long_to_bytes(m3)
flag = (flag1 + flag2 + flag3).decode()
print(flag)
Flag{Bas!c_R5A_but_wi7H_extra_SpIc3}

#031337 (Crypto)

hexahue。https://www.dcode.fr/hexahue-cipherで復号する。

CYBERGRABSIT5H3X4HU3ENCODIN9
cybergrabs{it5_h3x4hu3_encodin9}

asrysae (Crypto)

RSA暗号だが、p, qがわかっているので、通常通り復号する。

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

p = 7259338393478653631005030263664259036262266626709629329898426708457744746347488478314774973968803750474166097031011799725207964904816063804411050960276529
q = 12008458020261780468526599511312354565378724821399253276037099334562178151230805730927487170563877824427070528233270926340870052142075185372531152465638137
ct = '12e86f5934e95c2d649d1e685197a6df3b4f7c45531254b91e4086fb4b19507d7958e62a0d2ae060502eff8aeff33fa8897f09404b903ac00b215dde13271e529bcc3912350ba8f3d57274d5349d49680ace28c5d038b130387e6be73e861cf9a17208e73f13e48d0f09d4a9ba22629e599d2619990fd1b0ae96b591dfd7a4ca'

e = 65537
c = int(ct, 16)

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

t0t13nt (Crypto)

functorの計算の特徴を分析する。nが0~31の場合を見てみる。

00 0
01 1
02 4
03 10
04 20
05 35
06 56
07 84
08 120
09 165
10 220
11 286
12 364
13 455
14 560
15 680
16 816
17 969
18 1140
19 1330
20 1540
21 1771
22 2024
23 2300
24 2600
25 2925
26 3276
27 3654
28 4060
29 4495
30 4960
31 5456

この値は三角錐数で、以下の式で表すことができる。

functor(n) = n * (n + 1) * (n + 2) // 6

このことから一致するものを探し、フラグを復号する。

#!/usr/bin/env python3

def functor(n):
    return n * (n + 1) * (n + 2) // 6

with open('output_1.txt', 'r') as f:
    lest = eval(f.read())

flag = ''
for v in lest:
    for code in range(32, 127):
        if functor(code * 6969696969) == v:
            flag += chr(code)
            break
print(flag)
cybergrabs{50m3_func710nS_n3v3r_c3A5e_t0_4m4z3_m3}