この大会は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)
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}