SECCON 2022 Crypto

hash_hash

Strawhat一起打的,整场比赛做的就挺麻木的,后面的时间都耗在witches_symmetric_exam上最后还没做出来):,但是u1s1确实是一道挺棒的题目

总的来说还是现学的能力弱了些,一个GCM模式看源码半天都没理解具体流程,wtcl

pqpq

给了以及

相加因为e是偶数把消掉,与n做gcd求出p,随后可求得q,r

因为,最后有限域下开根crt组一下就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import gmpy2

e = 131074
n = 587926815910957928506680558951380405698765957736660571041732511939308424899531125274073420353104933723578377320050609109973567093301465914201779673281463229043539776071848986139657349676692718889679333084650490543298408820393827884588301690661795023628407437321580294262453190086595632660415087049509707898690300735866307908684649384093580089579066927072306239235691848372795522705863097316041992762430583002647242874432616919707048872023450089003861892443175057
c1 = 92883677608593259107779614675340187389627152895287502713709168556367680044547229499881430201334665342299031232736527233576918819872441595012586353493994687554993850861284698771856524058389658082754805340430113793873484033099148690745409478343585721548477862484321261504696340989152768048722100452380071775092776100545951118812510485258151625980480449364841902275382168289834835592610827304151460005023283820809211181376463308232832041617730995269229706500778999
c2 = 46236476834113109832988500718245623668321130659753618396968458085371710919173095425312826538494027621684566936459628333712619089451210986870323342712049966508077935506288610960911880157875515961210931283604254773154117519276154872411593688579702575956948337592659599321668773003355325067112181265438366718228446448254354388848428310614023369655106639341893255469632846938342940907002778575355566044700049191772800859575284398246115317686284789740336401764665472
cm = 357982930129036534232652210898740711702843117900101310390536835935714799577440705618646343456679847613022604725158389766496649223820165598357113877892553200702943562674928769780834623569501835458020870291541041964954580145140283927441757571859062193670500697241155641475887438532923910772758985332976303801843564388289302751743334888885607686066607804176327367188812325636165858751339661015759861175537925741744142766298156196248822715533235458083173713289585866

p=GCD(c1+c2,n)
q=GCD(pow(p,e,n)-c2,n)
r=n//int(p*q)
phi=(p-1)*(q-1)*(r-1)
d=inverse_mod(e//2,phi)
m=pow(cm,d,n)

PR.<x>=PolynomialRing(GF(p))
f=x^2-m
res1=f.roots()

PR.<x>=PolynomialRing(GF(q))
f=x^2-m
res2=f.roots()

PR.<x>=PolynomialRing(GF(r))
f=x^2-m
res3=f.roots()

for i in res1:
for j in res2:
for k in res3:
try:
M=crt([int(i[0]),int(j[0]),int(k[0])],[int(p),int(q),int(r)])
print(bytes.fromhex(hex(M)[2:]))
except:
continue

insufficient

根据多项式构造格子

取LLL约化基可得到前6个系数,最后利用后四列的约化结果得到后两系数,最后还原m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
c=115139400156559163067983730101733651044517302092738415230761576068368627143021367186957088381449359016008152481518188727055259259438853550911696408473202582626669824350180493062986420292176306828782792330214492239993109523633165689080824380627230327245751549253757852668981573771168683865251547238022125676591
p=8200291410122039687250292442109878676753589397818032770561720051299309477271228768886216860911120846659270343793701939593802424969673253182414886645533851
share=[((6086926015098867242735222866983726204461220951103360009696454681019399690511733951569533187634005519163004817081362909518890288475814570715924211956186561, 180544606207615749673679003486920396349643373592065733048594170223181990080540522443341611038923128944258091068067227964575144365802736335177084131200721), 358596622670209028757821020375422468786000283337112662091012759053764980353656144756495576189654506534688021724133853284750462313294554223173599545023200), ((1386358358863317578119640490115732907593775890728347365516358215967843845703994105707232051642221482563536659365469364255206757315665759154598917141827974, 4056544903690651970564657683645824587566358589111269611317182863269566520886711060942678307985575546879523617067909465838713131842847785502375410189119098), 7987498083862441578197078091675653094495875014017487290616050579537158854070043336559221536943501617079375762641137734054184462590583526782938983347248670), ((656537687734778409273502324331707970697362050871244803755641285452940994603617400730910858122669191686993796208644537023001462145198921682454359699163851, 7168506530157948082373212337047037955782714850395068869680326068416218527056283262697351993204957096383236610668826321537260018440150283660410281255549702), 1047085825033120721880384312942308021912742666478829834943737959325181775143075576517355925753610902886229818331095595005460339857743811544053574078662507), ((5258797924027715460925283932681628978641108698338452367217155856384763787158334845391544834908979711067046042420593321638221507208614929195171831766268954, 4425317882205634741873988391516678208287005927456949928854593454650522868601946818897817646576217811686765487183061848994765729348913592238613989095356071), 866086803634294445156445022661535120113351818468169243952864826652249446764789342099913962106165135623940932785868082548653702309009757035399759882130676)]

A=Matrix(ZZ,11,11)

for i in range(6):
A[i,i]=2^128

for i in range(4):
x,y=share[i][0]
w=share[i][1]
A[0,i+7]=x%p
A[1,i+7]=x^2%p
A[2,i+7]=x^3%p
A[3,i+7]=y%p
A[4,i+7]=y^2%p
A[5,i+7]=y^3%p
A[6,i+7]=-w

A[6,6]=2^256
for i in range(7,11):
A[i,i]=p


v=list(A.LLL()[0])
for i in range(6):
v[i]=v[i]//2^128
v[6]=v[6]//2^256
keys=[]
keys.extend(v[:6])
s1=GCD(GCD(v[7]-v[8],v[7]-v[9]),v[7]-v[10])
s2=abs(v[7])%s1
keys.extend([s1,s2])
key = 0
for coeff in keys:
key <<= 128
key ^^= coeff

print(bytes.fromhex(hex(key^^c)[2:]))

BBB

五次机会我们的目标就是使得每次迭代后的e都为11,也就是我们希望e在十次迭代前就已经为一固定数

构造不动点即可,根据方程构造出b,由于为二次方程我们知道大概率存在

我们继续求解,最后再求解

最后把五个解作为seed即可,最后来一次广播攻击,可能存在无解的情况多跑几次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from pwn import *
import gmpy2
from sage.all import *
from Crypto.Util.number import *

io=remote('BBB.seccon.games',8080)

io.recvuntil('a=')
a=int(io.recvline()[:-1])
io.recvuntil('p=')
p=int(io.recvline()[:-1])

b=(11-11**2-a*11)%p
io.sendlineafter('[b]ackdoor!!: ',str(b))

seed0=11
seed1=-a-seed0

R = PolynomialRing(GF(p),'x')
x=R.gen()
f1=x**2+a*x+a+b+11
res=f1.roots()
seed2=res[0][0]
seed3=res[1][0]

f2=x**2+a*x+b-seed2
res2=f2.roots()

if res2:
seed4=res2[0][0]
else:
f3=x**2+a*x+b-seed3
res3=f3.roots()
seed4=res3[0][0]

seed=[seed0,seed1,seed2,seed3,seed4]
for i in range(5):
io.sendlineafter('input seed: ',str(seed[i]))

N=[]
C=[]
for i in range(5):
io.recvuntil('n=')
N.append(int(io.recvline()[:-1]))
io.recvuntil('Cipher Text: ')
C.append(int(io.recvline()[:-1]))

c=crt(C,N)
m=gmpy2.iroot(int(c),11)[0]
print(long_to_bytes(m))
io.interactive()

this_is_not_lsb

挺有意思一题,可以选择直接打Bleichenbacher_attack,但是还有一个想法是利用LLL,类似于求解HNP时的格构造方案,解一个CVP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from pwn import *
from sage.all import *
import random
from tqdm import tqdm
#context(log_level='debug')
io=remote('this-is-not-lsb.seccon.games',8080)

io.recvuntil('n = ')
n=int(io.recvuntil('\n'))
io.recvuntil('e = ')
e=int(io.recvuntil('\n'))
io.recvuntil('flag_length = ')
Bound=int(io.recvuntil('\n'))
io.recvuntil('c = ')
c=int(io.recvuntil('\n'))
A=[]

while len(A)<50:
a=random.randint(0,n)
C=pow(a,e,n)*c%n
io.sendlineafter('c = ',str(C))
re=io.recvline()
if b'True' in re:
print("ok")
A.append(a)

print("A=",A)
print("n=",n)
print("Bound",Bound)
io.interactive()

构造格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n=144702720828868578448004877230765342650378627371660248494985831632996139471868831102906331265265081859024159566121204668861499713144388897230702620514178156981329843021809458668709098943733890704333144316343743064613158321607000835190229525102600857019287053680185347879093666693887789416666414537047235879261
A= [114070252623215002352447293755774860341432200369392103360781396435852587031904234609323047793849354928998790552000748784329406242118293341916969986091885923543388046032131622778341182132702390866370322736065320778629831522030894712496703272171724405164063764083340221378744720898980074185620387513203404052409, 90612309910318125624996525512514461810713429738923252742615289840957295743391242407938827501653121829136363271533584922197161730489673825184740524150695058290421208078845128628234859365047434945870848532824999899073619534665204287238759391780024743468174194060063621066972778791615530561122169240407855902876, 100890203765303264597045638799129278200998918033598486606682383304238372906672269069498319106743248854407751981605304626250291562548630304157096074358599829556542641575344853454905204721995666286381835375075767866180206698296051475402050877867099666588356032993826651585646064200994627134441559186201159147355, 51038188371342341151271986526179841209824775627694713428269515695794606253244946963935255596606031218683618648682751930021455186068251013921443667473495521564928783349785472523867052059121286067127160664493012120451412564552257856251968095302055173985732941147803725198649122591631577377483361463349920086630, 58791061557663142380175099260381123722563023867694603978973505828985516856881171927768829890116331843168309963939670509292559772490437294862376083778612100159801041114369100228074155810691899741777773387174254445602676796916767408006115891400645058196888993516790001066292765857513879392083071418236071532962, 79692098214623523076974648782596672407335931216622772404703620315201298131165101428212420454402216329325977909897982547914533828508593358752397505501398424654353234131634531844013135228177503246798394687367985058885999945714048883280300059035207618293069479936657631525532392582278346403735830959523368695959, 4761434775887665075852263783958482129231928317063715554640083818715284205099063102563988965408098876632663526074700413608031555451053922079251682843301332001343706593532218235586338563575369500506049327493756965035144656385305762135808143576987577213239978002418684789681744543908897886293164677889928020502, 86283869114832359985424726079983846037545876021401434236715873931228180717345265888009238639722981982621270735611108051817517390854085063873966472095962932227841285879221739337772745043155597742129312361867105038009549072838845488673835174728102661139714374638850697766574088537720151581957890680755136884022, 16014716653810972569666293825396447243360968674528415481272029788638288376068951464992176341863157283349154263239835174771997358231421208012915126152384590773043821254217747941499443035307457726924635091900947988243234419469761001865879380270197297092916811541555567836783233453554180216880298539709896539652, 64929929737269473369015355297574004167101455268974855525922423239729290199310220579559700086272996883124537496559798242336955061168947446548500155255277926317299665930348736608900402995960669566738957756317311465233910640917178368875563551308123476204420884442164267170184235354515842962341853279254440799999, 124825297511653016852850194891500449045732785302619035990530359423339216793309584123996096667060575617514310042894390701600888066102926997622217279284959751513926589860368069127364032174094575107763432511202047253143874352216140798308169748133416603250221030705375991265824128342666850931119489828423507762897, 114052502828405596893229791157439654889744986258871717587868092140286227019239638081702578225580916575389939542381564225843011760166536620831833422762844140645282219297757266250372656069687896255580530641772619754786887874917892750945610483001515126753596262588421497973892432473050293945974145067904128535556, 126401506230285619783585278656581078563285118278491448619460577852736042478127095262355933044893755315481920256627268206544431750913421064699961489878948253333293624920069508960479133593757458068758523123523092837996603228444167497990936048894854796539942602646855943671520474394690802386352418439004362688012, 58078967878957501836291824192928600364517403244615358637326002400745776885904549219408844406586885423309330950825574755124564254013243838139906125626900360852245850823083365877570089703971567386730697372725555079994557169766463511366041174905557802470575009187770157959850006522758827093218313738764286518739, 84306799380619821014784620259342784690758920194470137590308331014191838537472408772600260581897169693073196257144642987531550827679174026260328344410845162839698810599446202659478563665336935961389941738987975615995008547784996166399849501564439799501352364198544502932589068868344992239571528020768759382634, 21923691466897829644328513353407707819639561389828680425701165170380419918412715818589545723113105366358473483927417452054292773641855392233469890756669036124670573588567361688511588039265329170913816986413286779188608417125187467625940752692570606881028491080614945979546942573289205854934998798394189365299, 87338659458884215129028229521999664324713014430710597914882934278855040405168570069062539676172600004350145723301753647851063854032754216345418379752659205724937275234300589987076572154531674302354313198983529751013495970529915464495070217989762807714639666670260818881950144479884576685269513641685312386496, 84400124207799769665029841564613525635026792858032850758486772027500742044449977127307405496848512352851489264909219003798081868182145979478919840489010462065925966537610119464325274096399822137356486067585522085681402516797674876051736265220360275365369046885587393479945332946243944226832552227439811824655, 104314191934099807958615350879948362425880969279379368765666456275251867611996533679914051128743423787058185029751836764479283461544312654896134333124045510205478758980221398853650843181947425948411619268105113076069202701705326300375557754453853301215974634464559918919315512020482686492190662360475935862601, 111778498493339966893121998289731773759802459644891113157949508385329098621481009242590838699457517476962516168662999073314440755581249132225860896529569671693175285298451002036478478855518279627593259374928162705547096713035665619133642713186962794401826217771964872820015643325617670867522308779077424709985, 8175314674715503228350424499573276450918376963307722824104195804296995632071433340723243355276395371854907177745228988023081518993831608053506719264070573375702899202121497823837395589216397530079371352595653035112640394696523714435584299941889642038295090559007881239965904140279258633595291313147664981012, 52022262362576085914570849994520606694879291923753715926453953031540580091545855963865757215819844537778094146696625487285843409170734372702555274144829157511395001117150265726477712674987715859872261427245098792979285471842409776893175894320882316465245032741157800977392542081671305923358326833081180932141, 105153955810899481839240727207278209213077891032067587073996035004435740834956550765850121258007011774781706080261818650497192608757646614021897049088598708939968000327010152871459024237017807800937880226923549601903541098611619435884821980927590284495450370740285839177675540570578388337645568496718430637817, 13328643246478414818621289508219092161603405655894215617746662279009629001838728097823071515874507927395587221711233405237806272405241875195840125683206670209724083226370567878717158005248153135022009501825711910184768998415313890191733608440721974835777893305882775524878950916788993670995114404231855575204, 101594617322929286234031302209304138772358941735976716991111735333793646908101260671702309547675466146228499096556313377048641503837806202828242411978158145588953346669748698482923722183209642241623422590745997605853644909076337118664931797396818343570867472034427738625954245626444058331330380734415508189163, 31371726209222356523258979468331407484332664532508225272611789700862476766883521148385962491447074329648073404031972460411884271068082823920326041501407667291532147793350740178140240580382542285831309814497268211639500272645267773122664343908573391830360295788297191512489013004131874757364835747591648885189, 9530981766285456044988271459089804841734714385395755435872629900130658497626484199859271216561772053746977429474648215986808016462506247814588704009415175124714124368283411741786993627218328180321469361700346726606823757452407100793468491807913759285605300426369719596841154114179101348578613035770943155662, 4319089143529316856055074992267576816490006831312900529857160368053558264711716612921855669373160703772519819814372416521843676577685870421597033422607603131346802057939346047395422875607246258584418376287927423414544533814983722363936957046501071835633658185182655173469129602154447174962126784538953436752, 32476224038541559261758987264953105690737313447750639873521095670390437225418193140650284555576708918748573877649878148746811060512599139912213242993968971572293459547279196721271777940376116468973135886191748398144151242699668811678768942347902452383919083326238766985309693518439945813864465873641392093269, 107087791635167938452861190103038778452790066845368318059197108260209296622851590426579343718711172458425987377727593398465536092375134022199266034686769034717305750980823707176389886408586898649965648946774244735506932050488046602436058993126360897095105440332327584728458859838720519641809693173363884534064, 25791603357229367353055356955561097676885863500966678226443086020498909356757639527718102042353099809781434784028089950498663692641237304581648864709255598963078994807585150385351852334601907261622007571913879963788606199987563319045974970720290869958370710212407016574051923011329639801377096742310378416391, 84388251874871559262441621120775614867016511252392700591918367045408714121757639671517874472300261556360866729550993441147179498070987413435656983286642702727377568727982336892626956143798841016381912431652650597529622160160947677260147278045410031424411033425151694192545412197249034283518828458119060431612, 19861078609823883526331311885259122711861507059103969746747674054932087218880627287454477985009271277350693088064214208227904879503911006279351597192319890353366666591865405294487545956585317164602873596208591220705058086975961525235704947256457549835421707064539271447499596941291757608275892988542658178755, 73552522311209615216802878569346178965385907588719277462452274997597837626124266580813342176418218326649649505438278685979106470191598733922264870040349079862606286969103176569638143588448419904038828596426562000659598829735110293977117129262081542427840112167402706089835769719533491419162033585809621186336, 34898437634208863030963197846002558078292905909321048661042571093733693519124644845481767944893316511789408568130962676330380045318044573154593452736911137829919777243603138763645917959809138370186158655525994010780506942251533653893288559636378251658443040398057429309617175942898865085506751904536245960955, 115374496308770300868928030569370985263397211939492513567518796838172051436839909794212457385824481733258987943368004305276116886442480145748352930833073841116139962358829843519576553079297026908704001735728032740652140706333416935592615423137298171918493732740469687346662250040939016022120832195403537451848, 108448240624927694135946694186585624316099690680331815047738350043279134140313237244122622043539158186721797561823913509152511502642392198834680914355412396548216521471260712621591467444548758720792127914862890052423891052489728579424608808589386813937951412074235539248671125254273177207748099579100367887107, 102067442319642231925508992515592933655293120293795383920643224096325400537447832475517133637154171493643354298183368736852048125079975304331470120266238972976307891686173506441007503658513244829235258348003121160934342145949024265960411529275252443341524091577219928742307062277235109647715283144605627287770, 142673807848354101955104272871639165072525525608373023774785310625292978207135314193918635420276233221683257068936591900748366732579404543747202223427910934539859020595290043350240348026837931514488304122448569496043460514287749018388889284153995868922902702897880809476814979943641499888983985592126032225165, 53685929775959007490142186149865908857791425530925904196161809002811586820707994550814780655782514729407572725574918235071818580684549367324702463539651631735610589744965909561149429434724733164722898900288044769411850816944808296832934380572795675518897773540974024359858837489591240505934940692591802009786, 108694334416662753600145202026103087143616692309148396207382718508384457562229096719540789291209231544786988286488194912144885874495514259890549469271994613379131564097836866873407160679886241925381588078572033211272612819429521871532235545896109333897781329912006201433756752928000682949450215426721603448614, 15562204648515323216300594980141282269387605714128450287722093225107121868972709786530794728402557762536418303362067767499222624623409101709725363387898272237242694080845365212185707909513433697864840069662242939327591769577326136109365410076842255254759709642029121425020335093800857131536983361571668838691, 102411078663138905105786310612456838173643660458562855300384179678309464931752484000066391963920914167753493024418779248711447685450301866089010540323972032879366503511640852390296668585146008667489446713943000335695477838534427783609826753882966152373085771200584641811675937800137474692929358331201604806299, 15599844791699705561885975247549330774479065575328257435507443487843580489633737911509982526035727806613758923715372729407147199079433406078178895181532375066162281803278197616435423200935136171253117486973576583155868635043844815156049838127669817448004162670469532815911165346907802890447495269140331236297, 20233608317958710209749034677832175177853855732282971334969612127852248670984594556364297135890219819233918684420291252600293265857582033120954782500657005253358241321110459141712501078062739616968218847587121917095666165406032547325594880343462329372911821690799931404063138166671278611733437946979202668826, 32490828929850868611316852389974917045466848359815937686069159246114116341774700590427461680316173638100999140073144397915074763279985262910960453262708384940164174432590368747044872922240311619497823785060321773852152514658960992025263224032218664245192556094437432890791745912239031866197590887222646474127, 73061134034309249091875413444333521426128693223645665601720424779780210312379899219391553730291939775826402019478721487648511599689645416798774699654575053774052421933012304122820800572205887153880017519819674578636876450048014050698041974671037750466503708785473237084924584514710225287333671365131648689080, 90700588817483217988724872914397196808336475258993063090573914481940084200048104651674028084446883278948294664524693031187163596483550330931202118277704830714353438604230008507968864274235899517387253984436442859865715198199259882314804640223974126615612218989218437427074364448117838385659763167210693298694, 89399482728396409005161254437940436154757372575868389834829149515039893667797220688521847928509324797511558605416624638714640570389048622919557184275788112011652664960017172928127219291188517992008951577356479585065929484370875958959872556932166350929480773797946442620281462271895114702259886116573650865674, 122090423423272375654659903863229315025953610627784945636040064229552294317788863794234478930305830877403156294556689702409876965483974782864993072730828991415057165648182152761760500015464222680789809192890783969838121069360633535686842935620908246914152350861132939760957740224395094220563094335669428436976]
Bound=439

L=Matrix(ZZ,51,51)
for i in range(50):
L[i,i]=n
L[50,i]=A[i]

L[50,50]=1

load('cvp_solver.sage')
lower = [2**1022-2**1014]* 50 +[bytes_to_long(b"SECCON")*2^(49*8)]
upper = [2**1022-1]* 50 +[bytes_to_long(b"SECCOO")*2^(49*8)]
res = solve(L, lower, upper)
print(bytes.fromhex(hex(res[2][-1])[2:]))

witches_symmetric_exam

由于采用的PKCS#7填充,ofb_oracle利用ofb_error可以还原密文,由此我们可以通过给出的密文还原gcm加密后的nonce以及ciphertext,我们利用OFB模式去完成GCTR的过程即可解密

并且GCM模式在处理nonce和CTR不一样,后面直接读的python的源码才找到超过12字节的nonce都会进行GHASH操作

后面就是个伪造tag的问题了,由于我们可以拿到也就是0填充的加密结果所以只需要按照GCM的流程走一遍生成tag的过程就行,主要还是因为不大熟悉_mode_gcm里面_GHASH调用,导致虽然知道了大致流程但是不会用内置的函数结构就很麻

有个点就是GF mul在处理0填充的时候结果还是0所以无附加验证码的时候我们可以不用看第一个流程中由ADD带来的部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from pwn import *
from Crypto.Util.strxor import strxor
from tqdm import tqdm
from Crypto.Util.number import long_to_bytes, bytes_to_long
from Crypto.Cipher._mode_gcm import _GHASH,_ghash_clmul
from Crypto.Util.Padding import pad

context(log_level='debug')
io=remote('witches-symmetric-exam.seccon.games',8080)

io.recvuntil('ciphertext: ')
c=bytes.fromhex(io.recvuntil('\n').decode())
iv=c[:16]

def testlen(i):
tempc=c[:64+i]+strxor(bytes([c[64+i]]),b'a')+c[64+i+1:]
io.sendlineafter('ciphertext: ',tempc.hex())
re=io.recvline()
if b'ofb error' in re:
return True
else:
return False

def brute_chr(add,c,i,know):
tempknow=know
for ch in range(256):
se=bytes([c[i]^ch^(16-i)])
if i==15:
tempc=add+c[:i]+se
else:
mypad=strxor(tempknow,bytes([16-i]*len(tempknow)))
#print(len(mypad))
tempc=add+c[:i]+se+strxor(c[i+1:],mypad)
io.sendlineafter('ciphertext: ',tempc.hex())
re=io.recvline()
if b'ofb error' not in re:
return bytes([ch])
else:
continue

def getnonce(nonce,H):
ghash_c=_ghash_clmul
fill = (16 - (len(nonce) % 16)) % 16 + 8
ghash_in = (nonce +b'\x00' * fill +long_to_bytes(8 * len(nonce), 8))
j0 = _GHASH(H, ghash_c).update(ghash_in).digest()
nonce_ctr = j0[:12]
iv_ctr = (bytes_to_long(j0)) & 0xFFFFFFFF
nonce=nonce_ctr+long_to_bytes(iv_ctr)
return nonce

def get_tag(H,c,length,enc_j):
sign=_GHASH(H,_ghash_clmul)
la,lc=length
sign.update(c)
sign.update(long_to_bytes(la,8)+long_to_bytes(lc,8))
tag=strxor(sign.digest(),enc_j)
return tag


def get_enc(v,m=b'\x00'*16):
temp = b''
for j in range(15, -1, -1):
temp = brute_chr(v, m, j, temp) + temp
return temp

know=b'\x08'*8

for i in range(7,-1,-1):
know=brute_chr(c[:64],c[64:],i,know)+know

for i in range(3,0,-1):
temp=b''
for j in range(15,-1,-1):
temp=brute_chr(c[:16*i],c[16*i:16*(i+1)],j,temp)+temp
know=temp+know

gcm_tag = know[:16]
gcm_nonce = know[16:32]
gcm_ct = know[32:-8]

H0 = get_enc(b'\x00'*16)

nonce0 = getnonce(gcm_nonce,H0)

nonce1 = nonce0[:15] + bytes([nonce0[15] + 1])
ctr1 = get_enc(nonce1)
spell1 = strxor(ctr1, gcm_ct[:16])

nonce2 = nonce1[:15] + bytes([nonce1[15] + 1])
ctr2=get_enc(nonce2)

spell2 = strxor(ctr2, gcm_ct[16:] + b'a' * 8)

print(spell1 + spell2)##decrypt_all!!277260221!!

password=b"give me key"
enc_pass=strxor(password+b'\x00'*(16-len(password)),ctr1)[:11]+b'\x00'*5
enc_j=get_enc(nonce0)
fake_tag=get_tag(H0,enc_pass,[0,8*11],enc_j)

mask1=get_enc(iv)
mask2=get_enc(mask1)
mask3=get_enc(mask2)
fake_c=iv+strxor(mask1,fake_tag)+strxor(mask2,gcm_nonce)+strxor(mask3,pad(enc_pass[:11],16))
io.sendlineafter('ciphertext: ',fake_c.hex())
io.sendlineafter('ok, please say secret spell:',(spell1+spell2)[:24])

janken vs kurenaif

一开始就利用关系把每个32bits数的后两位确定,然后我寻思着随便填前30bits试试,但是我试了下这无法还原出状态,后来Hermes说要构造线性的关系,因为init部分状态之间是建立了等式的,摸了一下z3发现还是不大会,,,得花些时间学一下z3了,感觉每次遇到和random库有关的都用得上。后面大概是要读一下random的库函数里seed的实现然后逆一下,暂时还不会先搁置了

  • Post title:SECCON 2022 Crypto
  • Post author:hash_hash
  • Create time:2022-11-13 15:49:35
  • Post link:https://hash-hash.github.io/2022/11/13/SECCON2022-Crypto/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.