Writeup Zh3ro Alice Bob

Selamat malam selasa, mumpung kuliah libur karna habis UTS author iseng iseng buat writeup Zh3ro CTF, Hanya challange ini yang author berhasil selesaikan pada ctf kali ini :u

Pada kali ini author berhasil solved challange crypto dan itu pun hampir dua hari :uuu, sebenarnya males solved challange ini berberkal tanya temen, dan ngitung ngitung MTK akhirnya author berhasil dapet menyelesaikan challange ini (Author males ngitung MTK, jawaban Kuliah MTK pun sering minta :u semoga gak di baca dosen xixixixi)

Crypto

Alice_bob_dave

Deskripsi challange : Alice and Bob are sending their flags to Dave. But sadly Dave lost the modulus :( Try to retrive the flag!

Bisa di baca dari sini alice dan bob mengirim flag ke dave tapi sayang mereka kehilangan modulus, sehingga flag tidak sempurna terkirim, di challange ini kita diberi file yaitu file challange.py dan file out.txt yang mana kedua file ini ada inti dari challange ini

Berikut adalah isi file chall.py

chall.py
====================
from Crypto.Util.number import *
from secret import msg_a,msg_b

e=65537
p,q,r=[getStrongPrime(1024,e) for _ in range(3)]
pt_a=bytes_to_long(msg_a)
pt_b=bytes_to_long(msg_b)

n_a=p*q
n_b=p*r
phin_a=(p-1)*(q-1)
phin_b=(p-1)*(r-1)
d_a=inverse(e,phin_a)
d_b=inverse(e,phin_b)

ct_a=pow(pt_a,e,n_a)
ct_b=pow(pt_b,e,n_b)

print(f"{ct_a=}\n{ct_b=}\n{d_a=}\n{d_b=}\n{e=}")


Bisa kita lihat diatas, berikut adalah rumus yang di gunakan untuk flags yang dikirim bisa kita baca dari atas hingga bawa, kurang lebih seperti berikut, p,q,r mendapatkan sebuah bilangan prima yang kuat yang mana memiliki nilai size 1024, lalu digunakan rumus rumus untuk mendapatkan semua beragam nilai, untuk mendapatkan nilai n diberikan rumus masing masing, dilihat dari akhir hasil dari ct_a,ct_b,d_a,c_b dengan rumus tersebut dihasilkan nilai yang di beritahu pada file output.txt berikut adalah isi file tersebut

ct_a=1991374644522844726604723395302447678829362766488998002689642863876589167224123634868869407586265887639572846618361378190717796457675877867002990630200549839187693737176043693114429036857443618075597595356236777647214186597416429862630588853297534066191784060030827904725960955181749644590885127762513958644117342351741609981560458367036971039921421548984093411630930209440031060634872093143755813835906517674672118355461511837533783279547447855290393938723966500874359457216314821548439555245649159786182924722770460929014017979622168454175758261065999271764594369618940918533185330319317089809708951104047147411596

ct_b=11560415492145861207516424108577715664730529386805857287246533744961821151018194362544284902991666685182413092786353089517543091603274250128250910669110530206320138191614471688310529571895441809729559056935543845898702106837033971935287923495445981173899073238286288875669342754013550227359718814123485311705960547980778357375585882146296937739196745327987012437076826111202650212821723168353665944362122152786549834258495316372518691633486765982945106049194892430437710982481105051765183397588927444843790029563399175420351710322220501327577415113508236805750358567711052779340011355629159610689505604941700815518380

d_a=12007894588345817095001901772235818535532128075248502006167506715501613386280619988757005912270381074208611126718938214462213079931302423653355153363846803336576965899104058007549509604040316897464770127372797630135493394807353800174267249408200186888724103432412296802728616667116382243738519746110159825921676647202689661952040602841752466515868580858475210918168761862255041985423595605698941150797550252491451770611246462256935118062094973933183288422900540413805923476283359196218128607678993284504582128505198491110084905108072190837781925478455984417366202863689318005069821086805269764308054632708127147397685

d_b=15309121030008789112453654624398278092026139678301334759817236349957760197277968332173160272007689043235997494440248487531238644015060915059836861728115118555482791561589562225055947155368216166612774271639118879220806859714069050410034235487298164832205885978355955618431606156727831992132535894020870312453902803351757466444078059503362362343138846985263572980446344678973847354860739168547872456538618897496981232096868408852088578700314051200160980186449222946973789039336701174360592471866811887750298968395798446811465432587371913161943176018766518394820191044593922558127924048562996714970537749736086175516533
e=65537


Setelah author oprek oprek make kertas pulpen nannya nanya temen yang jago MTK, :uu sok ngitung ceritanya, nah kita cari terlebih dahulu phi, yang mana tujuan utama nanti nya untuk mencari nilai n dari rumus diatas

def findphi(e,d):
	res = e * d - 1
	return res

find_a = findphi(e,d_a)
find_b = findphi(e,d_b)
print(size(find_a),"size find_a")


dari code diatas kita akan menghasilkan nilai find_a dan find_b phi yang mana size dari kedua nilai ini ada 2063 sedangkan untuk setiap prime yang kita dapat pada rumus adalah 1024, dan dua nilai seharusnya 1024 * 2 = 2048 maka dari itu author membuat script kembali untuk menampung mendapatkan size yang diingikan

dt_a_tampung = []
dt_b_tampung = []

for x in range(2, find_a):
	if find_a % x == 0:
		if size(find_a // x) == 2048:
			dt_a_tampung.append(find_a // x)

	if size(find_a // x) < 2048:
		break

print(dt_a_tampung)


for x in range(2, find_b):
	if find_b % x == 0:
		if size(find_b // x) == 2048:
			dt_b_tampung.append(find_b // x)

	if size(find_b // x) < 2048:
		break

print(dt_b_tampung)


lalu author mendapatkan nilai dt_a dan dt_b terbaru yang sesuai author ingin kan berikut adalah isi nilai nya

dt_a = [30001196585582700429077794839961070464838133417237660629720555358691214078634935465791159180834278695452317769500936058907783104702747395790093274599002247351196851592756000520024864127177395010070094157204492329159766330505491441501313435418596913885338399857039559893272286626998831272459737280348501563471805208635685729684376691259956974497749959350458995003775157110541294140471433998348957576905914791564647733237362639507939340186631020802067522144471530521123815594723133378161240309612983984086645532226952594711663086655778550986836721820806292202391400902657421909125113970720024571821774864236686701193324, 28334463441939217071906806237741010994569348227391123928069413394319479963155216828802761448565707656816077893417550722301795154441483651579532537121279900276130359837602889380023482786778650842843977815137576088650890423255186361417907133450897085336152933198315139899201604036610007312878640764773584809945593808155925411368577986189959364803430517164322384170232092826622333354889687665107348822633363969811056192501953603979720487954040408535285993136445334381061381395016292634930060292412262651637387447103233006116570692952679742598679126164094831524480767519176454025284829861235578762276120705112426328904806, 27634982183390800117819279996032546945365350200778209642104150283169899796210028872534603240245249305067589542851390727998386719789927553428027414615529302604531538228380189262941047544333681515228031036894021079685003006478545703621201416036282461218748869847596470680212991203877035611472113235271325789634755150743500803292161568579553021668380769874702036659199569693668879678291469790030252702174353018138577613180786578534703684813551929861257617493824234192492144778775240075940144487181170168436871824835663641250189079821179449061899569831146885232325344561491970154800746727743686643377356338932911783509572, 21801296164124991410785927818018639758516471664336678282909934000438519447507354965874391125923593774009190442745354288755576879504052052496604612184016066439572391448862305721826528822893599149767256000155997403833831914438583428041691905822234968228005417808959323366496532967083312826769298517905131853379198338580011424089284012201566096851552183941100088593069400398000074427201877862722428628412861204463868872497693974483551453927903102935397212327108422226212671603323891504627738996632910848175105935558223495356446087654589776738668422585853944947251262904884251713390610426516246905378756585416863696678452]

dt_b = [31521013664583286586958063560137918671602799751707024070189827793502410620452598510387445954966004298666590254261092212608695790537701765324427533995459645767221982738670912332500521794576399086123197846070151868912787281340903027229733386463432605359983573652639467903397806242333393819302230753579823363722633616816340844434355758268044585010439541780496977141674900761103017093795421391427015934155559745059995570465990100877767175063854287574770661592187330325976161240056845267485709985194321416509310194525775771557744582327319920606166193111589736601989659456159343471317303121918728108985992224456609478002734, 30963610312121902665274053733271300537515573128933573315870203952324838133784100564319118746615063939343812850449975777777822640274513075649678375677421242624777820281205293940175033445093564883229990662605713482933494403761409232377323509895104151733119684886075803578839989281655153080529272131791679093518854057441105116141886361931668646140242897721606603784202453205749746446178078044907012226774418007136982964785126837358865820519164335817823971807527782127451816568558756438109747518092005391090063990734050637554640312794450917288345829915189992162495165894810724398729431175220600429251122812839980239015740, 27794937666390171262511432061367702338618641884279429762975932034994091754134864686418051493103801336026749253210254733837570629493172484978710929082069992652316694200955623446366501612914280491766667242164527079466271966232122984090711518717097260952663023225296126087075163384587969229254231788969880534872466632220520516340569681294064856937759110587395594714782726853364795802850881316705596508966713762508232235585574006453149269531608775618609584133842777080528055302961724931824532477179135404257731764184154993730310276629043772969894172001604047872159206041763911202926275268600524024407128916653846017254260, 27018011712499959931678340194403930289945256930034592060162709537287780531816513008903525104256575113142791646509507610807453534746601513135223600567536839229047413776003639142143304395351199216677026725202987316210960526863631166196914331254370804594271634559405258202912405350571480416544769217354134311762257385842577866658019221372609644294662464383283123264292772080945443223253218335508870800704765495765710488970848657895229007197589389349803424221874854565122423920048724514987751415880846928436551595307807804192352499137702789090999594095648345658848279533850865832557688390216052664845136192391379552573772, 26267511387152738822465052966781598893002333126422520058491523161252008850377165425322871629138336915555491878550910177173913158781418137770356278329549704806018318948892426943750434828813665905102664871725126557427322734450752522691444488719527171133319644710532889919498171868611161516085192294649852803102194680680284037028629798556703820842032951483747480951395750634252514244829517826189179945129633120883329642054991750731472645886545239645642217993489441938313467700047371056238091654328601180424425162104813142964787151939433267171805160926324780501658049546799452892764419268265606757488326853713841231668945, 23222707734091426998955540299953475403136679846700179986902652964243628600338075423239339059961297954507859637837481833333366980205884806737258781758065931968583365210903970455131275083820173662422492996954285112200120802821056924282992632421328113799839763664556852684129991961241364810396954098843759320139140543080828837106414771448751484605182173291204952838151839904312309834633558533680259170080813505352737223588845128019149365389373251863367978855645836595588862426419067328582310638569004043317547993050537978165980234595838187966259372436392494121871374421108043299047073381415450321938342109629985179261805, 22515009760416633276398616828669941908287714108362160050135591281073150443180427507419604253547145927618993038757923009006211278955501260946019667139614032690872844813336365951786086996125999347230855604335822763509133772386359305164095276045309003828559695466171048502427004458809567013787307681128445259801881154868814888881682684477174703578885386986069269386910643400787869352711015279590725667253971246471425407475707214912690839331324491124836186851562378804268686600040603762489792846567372440363792996089839836826960415948085657575832995079706954715706899611542388193798073658513377220704280160326149627144810, 21674527218485331865691837613289910376260901190253501321109142766627386693648870395023383122630544757540668995314983044444475848192159152954774862974194869837344474196843705758122523411565495418260993463823999438053446082632986462664126456926572906213183779420253062505187992497158607156370490492254175365463197840208773581299320453352168052298170028405124622648941717244024822512324654631434908558742092604995888075349588786151206074363415035072476780265269447489216271597991129506676823262664403773763044793513835446288248218956115642101842080940632994513746616126367507079110601822654420300475785968987986167311018, 21014009109722191057972042373425279114401866501138016046793218529001607080301732340258297303310669532444393502840728141739130527025134510216285022663639763844814655159113941555000347863050932724082131897380101245941858187560602018153155590975621736906655715768426311935598537494888929212868153835719882242481755744544227229622903838845363056673626361186997984761116600507402011395863614260951343956103706496706663713643993400585178116709236191716513774394791553550650774160037896844990473323462880944339540129683850514371829721551546613737444128741059824401326439637439562314211535414612485405990661482971072985335156, 19298579794642828522627385853145664492818040664310422900116221098062700379868937863502517931611839366530565461792505436291038239104715366525159714691097742306462438411431170815816645996679428011912161946573562368722114662045450832997795950895979146138765453256718041573508860964693914583246263726681524508401612418458984190470013729551864031639044617416630802331637694343532459445180870239649193429074832496975507492122034755639449290855420992392716731587053467546516017085749088939276965297057747806026108282362719860137394642241216277922142567211177389756320199667036332737541205993011466189175097280279556823266980, 18578166187273141599164432239962780322509343877360143989522122371394902880270460338591471247969038363606287710269985466666693584164707845389807025406452745574866692168723176364105020067056138929937994397563428089760096642256845539426394105937062491039871810931645482147303993568993091848317563279075007456111312434464663069685131817159001187684145738632963962270521471923449847867706846826944207336064650804282189778871076102415319492311498601490694383084516669276471089941135253862865848510855203234654038394440430382532784187676670550373007497949113995297497099536886434639237658705132360257550673687703988143409444, 18062106015404443221409864677741591980217417658544584434257618972189488911374058662519485935525453964617224162762485870370396540160132627462312385811829058197787061830703088131768769509637912848550827886519999531711205068860822052220105380772144088510986482850210885420989993747632172630308742076878479471219331533507311317749433711126806710248475023670937185540784764370020685426937212192862423798951743837496573396124657321792671728636179195893730650221057872907680226331659274588897352718887003144802537327928196205240206849130096368418201734117194162094788846771972922565925501518878683583729821640823321806092515]	



Setelah mendapatkan nilai nilai berikut dapat diperhatikan rumus ini

d_a=inverse(e,phin_a)
d_b=inverse(e,phin_b)


bisa dilihat dari rumus diatas pada kedua rumus, dari sini kita gunakan fpb untuk nilai phin_a dan phin b dengan menggunakan nilai nilain n yang sudah kita tampung sesuai ukuran, lalu kita pecah jika ada ukuran 1024, maka kemungkinan akan menjadi kandidat nilai p dan q, berikut adalah source code nya


p = []
q = []
r = []

for x in (dt_a_tampung):
	for y in (dt_b_tampung):
		g = GCD(x,y)
		for z in range(e,0,-1):
			if g % z == 0:
				if size(g // z) == 1024:
					if size(x // (g//z)) == 1024:
						p.append(g//z)
						q.append(x // (g//z))

print(p)
print(q)


Dari sini akan keluar beragam output untuk beberapa nilai p dan q, tidak author tampilkan karna terlalu banyak owkdowkdowk, dari sini kita perhatikan kembali rumus diatas

phin_a=(p-1)*(q-1)
phin_b=(p-1)*(r-1)


tapi sebelum itu mencari r terlebih dahulu karna r digunakan, dengan menggunakan nilai nilai kemungkinan p,q maka kita gunakan untuk r

for x in p:
	for y in dt_b_tampung:
		hasil = (y // x)
		r.append(hasil)


lalu kembali ingat rumus ditas phin_a=(p-1)*(q-1) pada source code diatas nilai p dan q sudah kita kurangi sehingga pada brute selanjut nya kita balik nilai mejadi +, lalu kita gunakan sebuah pernyataan ascii printable untuk mengashilkan output flag berikut adalah script nya

for x in p :
	for y in q:
		n = (x+1) * (y+1)
		hasil = pow(ct_a,d_a,n)
		compress = long_to_bytes(hasil)

		if min(compress) >= 32 and max(compress) <= 127:
			print(compress)


for x in r:
	for y in p:
		n = (x+1) * (y+1)
		hasil = pow(ct_b,d_b,n)
		compress = long_to_bytes(hasil)

		if min(compress) >= 32 and max(compress) <= 127:
			print(compress)


Dan berikut kita running semua script diatas menjadi satu dan berikut adalah output nya

b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Alice here.My flag is zh3r0{GCD_c0m3s_'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'
b'Hey Dave its Bob here.My flag is 70_R3sCue_3742986}'


zh3r0{GCD_c0m3s_ 70_R3sCue_3742986}


Dan berikut adalh full source code yang saya tulis


Mohon maaf jika ada kekurangan dan salah salah kata, Terimakasih jangan lupa dengerin lagu JKT 48 :U