[📓] Writeup - NahamCon 2023 Crypto

Terbit pada tanggal 18 Juni 2023

Ditulis oleh: AnYujin
NahamCon 2023
NahamCon 2023

NahamCon 2023 Writeup - Crypto


during the 16th - 18th june 2023 we participated in NahamCon ctf 2023 i managed to solve 5 out of 6 cryptography challenges available, this is my writeups for the challenges i managed to solve.

RSA Intro

We're given a output.txt and gen.py the gen.py file contain the encryption script, from here we know that the flag was split into 3 part and we need to solve the 3 rsa encryption scheme to get the flag. The first part of the flag was encrypted by a strong prime but the value of p and q was given to us, so we just can use it to calculate phi and the private key to get the flag.

Part 1
#PART 1
e= 65537
p= 152933908726088000025981821717328900253841375038873501148415965946834656401640031351528841350980891403699057384028031438869081577476655254545307973436745130347696405243778481262922512227444915738801835842194123487258255790292004204412236314558718035967575479232723997430178018130995420315759809636522091902529
q= 173403581892981708663967289381727914513043623656015065332774927693090954681172215632003125824638611519248812013286298011144213434368768979531792528759533473573346156338400142951284462417074992959330154930806611253683603690442142765076944118447174491399811297223146324861971722035746276165056022562961558299229
ct= 24900222896050719055946861973957246283663114493271057619080357155524140641110166671081924849912377863714741017586072836978357770860853088772671413685690588862677870057778743649753806625109141461870634890427341765490174013453580041222600439459744928592280825572907034701116518706347830413085865254963646096687533779205345001529893651672061316525244476464884343232361498032095529980932018530224029715267731845742371944443150142380656402289372470902457020777826323051802030062577945893807552316343833971210833255536637260838474638607847822451324479398241526919184038034180388382949827367896808363560947298749154349868503

n=p*q
phi=(p-1)*(q-1)
d=inverse(e,phi)
pt=pow(ct,d,n);
print(long_to_bytes(pt).decode(),end='')

For the second part we can see that the exponent used is small (e=3), and the N is really big, so we can just calculate the cubic root of the ciphertext to get the flag.

Part 2
#PART 2
e= 3
n= 17832697294201997154036617011957221780954165482288666773904510458098283881743910060438108775052144170769164876758249100567442926826366952851643073820832317493086415304740069439166953466125367940677570548218324219386987869433677168670642103353927101790341856159406926994785020050276564014860180970395749578442970075496442876475883003906961049702649859496118324912885388643549649071478725024867410660900848046927547400320456993982744075508818567475254504481562096763749301743619222457897353143558783627148704136084952125284873914605708215421331001883445600583624655438154001230490220705092656548338632165583188199066759
ct= 55717486909410107003108426413232346564412491530111436942121941739686926249314710854996834619
from gmpy2 import *
pt=gmpy2.iroot(ct,3)[0]
print(long_to_bytes(pt).decode(),end='')

For the 3rd part, the flag in this part was divided again into 4 part, after that encrypted using RSA, but the value of N or the public modulo is really small and we can just calculate the factor using factordb after that we can decrypt all of the ciphertext in this part to get the 3rd part of the flag.

Part 3
#PART 3
e= 65537
n= 107710970774233
ct= [18128889449669, 12202311999558, 10705744036504, 23864757944740]
p,q=8885719,12121807
phi=(p-1)*(q-1)
d=inverse(e,phi)
for i in ct:
	temp=pow(i,d,n)
	print(long_to_bytes(temp).decode(),end='')
and finally we get the flag

flag{361862d054e2a9abe41cc315517cfa31}

RSA OUTRO

another RSA problem, we're given a gen.py and output.txt file, the interesting part of this chall is how it generates the primes for the RSA scheme, here we know that p = 2 * q +1, we also have phi which equal to (p-1)*(q-1) now based on those 2 equation we can make this equation

p = 2*q + 1
phi = (p-1) * (q-1)
phi = (2*q+1-1) * (q-1)
phi = (2q) * (q-1)
phi = 2q^2 - 2q
phi/2 = q^2 -q
phi/2 = q * (q-1)
i tried inserting the value of phi/2 into factordb to get the value of q but it failed so i come up with an idea by using the fact that the value of a^2 - a will increase as the value of a increase so we can use binary search to find the value of q, and it actually succeed in finding the value of q after that i can use the value of p and q to calculate N and decrypt the message
solution:
from Crypto.Util.number import *
e= 65537
d= 53644719720574049009405552166157712944703190065471668628844223840961631946450717730498953967365343322420070536512779060129496885996597242719829361747640511749156693869638229201455287585480904214599266368010822834345022164868996387818675879350434513617616365498180046935518686332875915988354222223353414730233
phi= 245339427517603729932268783832064063730426585298033269150632512063161372845397117090279828761983426749577401448111514393838579024253942323526130975635388431158721719897730678798030368631518633601688214930936866440646874921076023466048329456035549666361320568433651481926942648024960844810102628182268858421164
ct= 37908069537874314556326131798861989913414869945406191262746923693553489353829208006823679167741985280446948193850665708841487091787325154392435232998215464094465135529738800788684510714606323301203342805866556727186659736657602065547151371338616322720609504154245460113520462221800784939992576122714196812534
temp=phi//2
lf=1
rg=temp
while lf<=rg:
	mid=(lf+rg)//2
	if mid*mid-mid<temp:
		lf=mid+1
	elif mid*mid-mid>temp:
		rg=mid-1
	else:
		break
q=mid
p=2*q+1
assert((p-1)*(q-1)==phi)
n=p*q
print(long_to_bytes(pow(ct,d,n)).decode())

flag{8b76b85e7f450c39502e71c215f6f1fe}

Just One More

we're give 2 files jom.py and output.txt in the jom.py file, a array with the same length as the flag will be made then filled with random number between 2^1 and 2^64 after that a process of filling the s_arr will be done in the following script

s_arr filling
s_arr = []
for i in range(len(FLAG) - 1):
    s_i = sum([arr[j]*ord(FLAG[j]) for j in range(l)])
    s_arr.append(s_i)
    arr = [arr[-1]] + arr[:-1]
and in the output file we'll be given arr and s_arr. So to summarize how the s_arr array will be filled is by doing (arr[j]*ord(FLAG[j])) but the interesting part is that arr will be rotated to the right len(FLAG)-1 times, in other words
arr[0], arr[1], arr[2] ... arr[n]
will be rotated into
arr[n], arr[0], arr[1] ... arr[n-1]
and so on for len(FLAG)-1 times

and then i noticed that it is somewhat become a simple linear equation in the form of

(arr[0]*ord(FLAG[0]))+(arr[1]*ord(FLAG[1])) + ... + (arr[n]*ord(FLAG[n])) = s_arr[0]
(arr[n]*ord(FLAG[0]))+(arr[0]*ord(FLAG[1])) + ... + (arr[n-1]*ord(FLAG[n])) = s_arr[1]
(arr[n-1]*ord(FLAG[0]))+(arr[n]*ord(FLAG[1])) + ... + (arr[n-2]*ord(FLAG[n])) = s_arr[2]
...

we can actually solve this by feeding it into z3, the most consuming part of this challenge is actually building the z3 script (probably cause im doing it the wrong way idk)
z3 solution:
from sage.all import *
from itertools import permutations
from z3 import *
arr=[12407953253235233563, 3098214620796127593, 18025934049184131586, 14516706192923330501, 13439587873423175563, 17668371729629097289, 4983820371965098250, 1941436363223653079, 15491407246309500298, 8746935775477023498, 911995915798699052, 16286652540519392376, 13788248038504935294, 18140313902119960073, 11357802109616441330, 2498891881524249135, 9088680937359588259, 14593377776851675952, 2870989617629497346, 18249696351449250369, 2029516247978285970, 14734352605587851872, 8485311572815839186, 8263508188473851570, 14727305307661336083, 6229129263537323513, 17136745747103828990, 8565837800438907855, 17019788193812566822, 9527005534132814755, 1469762980661997658, 16549643443520875622, 9455193414123931504, 12209676511763563786, 271051473986116907, 17058641684143308429, 13420564135579638218, 7599871345247004229]
hasil=[35605255015866358705679, 36416918378456831329741, 35315503903088182809184, 36652502430423040656502, 34898639998194794079275, 36303059177758553252637, 35047128751853183340357, 36513205019421922844286, 35188395228735536982649, 35301216188296520201752, 35877364908848326577377, 35548407875093684038138, 36846989992339836295226, 35424096673112978582599, 35435941095923989701820, 35884660233631412675912, 35250569480372437220096, 36071512852625372107309, 35636049634203159168488, 35407704890518035619865, 35691117250745693469087, 35942285968400856168658, 35659245396595333737528, 34682110547383898878610, 36251061019324605768432, 34350337346574061914637, 36706069443188806905153, 35296365364968284652906, 34767397368306249667499, 37665777691001951216694, 33927027243025444519647, 37464577169642287783563, 34818703279589326375333, 35526731706613463585509, 36698165076109278070662, 34612009622491263626134, 37224659068886403545747]
char_list=[]
ab=Int('ab')
ac=Int('ac')
ad=Int('ad')
ae=Int('ae')
af=Int('af')
ag=Int('ag')
ah=Int('ah')
ai=Int('ai')
aj=Int('aj')
ak=Int('ak')
al=Int('al')
am=Int('am')
an=Int('an')
ao=Int('ao')
ap=Int('ap')
aq=Int('aq')
ar=Int('ar')
bs=Int('bs')
at=Int('at')
au=Int('au')
av=Int('av')
aw=Int('aw')
ax=Int('ax')
ay=Int('ay')
az=Int('az')
ba=Int('ba')
bc=Int('bc')
bd=Int('bd')
be=Int('be')
bf=Int('bf')
bg=Int('bg')
bh=Int('bh')
bi=Int('bi')
bj=Int('bj')
bk=Int('bk')
bl=Int('bl')
bm=Int('bm')
bn=Int('bn')

s=Solver()
s.add(ab==102)
s.add(ac==108)
s.add(ad==97)
s.add(ae==103)
s.add(af==123)
s.add(ag<176)
s.add(ag>47)
s.add(ah<176)
s.add(ah>47)
s.add(ai<176)
s.add(ai>47)
s.add(aj<176)
s.add(aj>47)
s.add(ak<176)
s.add(ak>47)
s.add(al<176)
s.add(al>47)
s.add(am<176)
s.add(am>47)
s.add(an<176)
s.add(an>47)
s.add(ao<176)
s.add(ao>47)
s.add(ap<176)
s.add(ap>47)
s.add(aq<176)
s.add(aq>47)
s.add(ar<176)
s.add(ar>47)
s.add(bs<176)
s.add(bs>47)
s.add(at<176)
s.add(at>47)
s.add(au<176)
s.add(au>47)
s.add(av<176)
s.add(av>47)
s.add(aw<176)
s.add(aw>47)
s.add(ax<176)
s.add(ax>47)
s.add(ay<176)
s.add(ay>47)
s.add(az<176)
s.add(az>47)
s.add(ba<176)
s.add(ba>47)
s.add(bc<176)
s.add(bc>47)
s.add(bd<176)
s.add(bd>47)
s.add(be<176)
s.add(be>47)
s.add(bf<176)
s.add(bf>47)
s.add(bg<176)
s.add(bg>47)
s.add(bh<176)
s.add(bh>47)
s.add(bi<176)
s.add(bi>47)
s.add(bj<176)
s.add(bj>47)
s.add(bk<176)
s.add(bk>47)
s.add(bl<176)
s.add(bl>47)
s.add(bm<176)
s.add(bm>47)
s.add(bn==125)
s.add(ab*12407953253235233563+ac*3098214620796127593+ad*18025934049184131586+ae*14516706192923330501+af*13439587873423175563+ag*17668371729629097289+ah*4983820371965098250+ai*1941436363223653079+aj*15491407246309500298+ak*8746935775477023498+al*911995915798699052+am*16286652540519392376+an*13788248038504935294+ao*18140313902119960073+ap*11357802109616441330+aq*2498891881524249135+ar*9088680937359588259+bs*14593377776851675952+at*2870989617629497346+au*18249696351449250369+av*2029516247978285970+aw*14734352605587851872+ax*8485311572815839186+ay*8263508188473851570+az*14727305307661336083+ba*6229129263537323513+bc*17136745747103828990+bd*8565837800438907855+be*17019788193812566822+bf*9527005534132814755+bg*1469762980661997658+bh*16549643443520875622+bi*9455193414123931504+bj*12209676511763563786+bk*271051473986116907+bl*17058641684143308429+bm*13420564135579638218+bn*7599871345247004229==35605255015866358705679)
s.add(ab*7599871345247004229+ac*12407953253235233563+ad*3098214620796127593+ae*18025934049184131586+af*14516706192923330501+ag*13439587873423175563+ah*17668371729629097289+ai*4983820371965098250+aj*1941436363223653079+ak*15491407246309500298+al*8746935775477023498+am*911995915798699052+an*16286652540519392376+ao*13788248038504935294+ap*18140313902119960073+aq*11357802109616441330+ar*2498891881524249135+bs*9088680937359588259+at*14593377776851675952+au*2870989617629497346+av*18249696351449250369+aw*2029516247978285970+ax*14734352605587851872+ay*8485311572815839186+az*8263508188473851570+ba*14727305307661336083+bc*6229129263537323513+bd*17136745747103828990+be*8565837800438907855+bf*17019788193812566822+bg*9527005534132814755+bh*1469762980661997658+bi*16549643443520875622+bj*9455193414123931504+bk*12209676511763563786+bl*271051473986116907+bm*17058641684143308429+bn*13420564135579638218==36416918378456831329741)
s.add(ab*13420564135579638218+ac*7599871345247004229+ad*12407953253235233563+ae*3098214620796127593+af*18025934049184131586+ag*14516706192923330501+ah*13439587873423175563+ai*17668371729629097289+aj*4983820371965098250+ak*1941436363223653079+al*15491407246309500298+am*8746935775477023498+an*911995915798699052+ao*16286652540519392376+ap*13788248038504935294+aq*18140313902119960073+ar*11357802109616441330+bs*2498891881524249135+at*9088680937359588259+au*14593377776851675952+av*2870989617629497346+aw*18249696351449250369+ax*2029516247978285970+ay*14734352605587851872+az*8485311572815839186+ba*8263508188473851570+bc*14727305307661336083+bd*6229129263537323513+be*17136745747103828990+bf*8565837800438907855+bg*17019788193812566822+bh*9527005534132814755+bi*1469762980661997658+bj*16549643443520875622+bk*9455193414123931504+bl*12209676511763563786+bm*271051473986116907+bn*17058641684143308429==35315503903088182809184)
s.add(ab*17058641684143308429+ac*13420564135579638218+ad*7599871345247004229+ae*12407953253235233563+af*3098214620796127593+ag*18025934049184131586+ah*14516706192923330501+ai*13439587873423175563+aj*17668371729629097289+ak*4983820371965098250+al*1941436363223653079+am*15491407246309500298+an*8746935775477023498+ao*911995915798699052+ap*16286652540519392376+aq*13788248038504935294+ar*18140313902119960073+bs*11357802109616441330+at*2498891881524249135+au*9088680937359588259+av*14593377776851675952+aw*2870989617629497346+ax*18249696351449250369+ay*2029516247978285970+az*14734352605587851872+ba*8485311572815839186+bc*8263508188473851570+bd*14727305307661336083+be*6229129263537323513+bf*17136745747103828990+bg*8565837800438907855+bh*17019788193812566822+bi*9527005534132814755+bj*1469762980661997658+bk*16549643443520875622+bl*9455193414123931504+bm*12209676511763563786+bn*271051473986116907==36652502430423040656502)
s.add(ab*271051473986116907+ac*17058641684143308429+ad*13420564135579638218+ae*7599871345247004229+af*12407953253235233563+ag*3098214620796127593+ah*18025934049184131586+ai*14516706192923330501+aj*13439587873423175563+ak*17668371729629097289+al*4983820371965098250+am*1941436363223653079+an*15491407246309500298+ao*8746935775477023498+ap*911995915798699052+aq*16286652540519392376+ar*13788248038504935294+bs*18140313902119960073+at*11357802109616441330+au*2498891881524249135+av*9088680937359588259+aw*14593377776851675952+ax*2870989617629497346+ay*18249696351449250369+az*2029516247978285970+ba*14734352605587851872+bc*8485311572815839186+bd*8263508188473851570+be*14727305307661336083+bf*6229129263537323513+bg*17136745747103828990+bh*8565837800438907855+bi*17019788193812566822+bj*9527005534132814755+bk*1469762980661997658+bl*16549643443520875622+bm*9455193414123931504+bn*12209676511763563786==34898639998194794079275)
s.add(ab*12209676511763563786+ac*271051473986116907+ad*17058641684143308429+ae*13420564135579638218+af*7599871345247004229+ag*12407953253235233563+ah*3098214620796127593+ai*18025934049184131586+aj*14516706192923330501+ak*13439587873423175563+al*17668371729629097289+am*4983820371965098250+an*1941436363223653079+ao*15491407246309500298+ap*8746935775477023498+aq*911995915798699052+ar*16286652540519392376+bs*13788248038504935294+at*18140313902119960073+au*11357802109616441330+av*2498891881524249135+aw*9088680937359588259+ax*14593377776851675952+ay*2870989617629497346+az*18249696351449250369+ba*2029516247978285970+bc*14734352605587851872+bd*8485311572815839186+be*8263508188473851570+bf*14727305307661336083+bg*6229129263537323513+bh*17136745747103828990+bi*8565837800438907855+bj*17019788193812566822+bk*9527005534132814755+bl*1469762980661997658+bm*16549643443520875622+bn*9455193414123931504==36303059177758553252637)
s.add(ab*9455193414123931504+ac*12209676511763563786+ad*271051473986116907+ae*17058641684143308429+af*13420564135579638218+ag*7599871345247004229+ah*12407953253235233563+ai*3098214620796127593+aj*18025934049184131586+ak*14516706192923330501+al*13439587873423175563+am*17668371729629097289+an*4983820371965098250+ao*1941436363223653079+ap*15491407246309500298+aq*8746935775477023498+ar*911995915798699052+bs*16286652540519392376+at*13788248038504935294+au*18140313902119960073+av*11357802109616441330+aw*2498891881524249135+ax*9088680937359588259+ay*14593377776851675952+az*2870989617629497346+ba*18249696351449250369+bc*2029516247978285970+bd*14734352605587851872+be*8485311572815839186+bf*8263508188473851570+bg*14727305307661336083+bh*6229129263537323513+bi*17136745747103828990+bj*8565837800438907855+bk*17019788193812566822+bl*9527005534132814755+bm*1469762980661997658+bn*16549643443520875622==35047128751853183340357)
s.add(ab*16549643443520875622+ac*9455193414123931504+ad*12209676511763563786+ae*271051473986116907+af*17058641684143308429+ag*13420564135579638218+ah*7599871345247004229+ai*12407953253235233563+aj*3098214620796127593+ak*18025934049184131586+al*14516706192923330501+am*13439587873423175563+an*17668371729629097289+ao*4983820371965098250+ap*1941436363223653079+aq*15491407246309500298+ar*8746935775477023498+bs*911995915798699052+at*16286652540519392376+au*13788248038504935294+av*18140313902119960073+aw*11357802109616441330+ax*2498891881524249135+ay*9088680937359588259+az*14593377776851675952+ba*2870989617629497346+bc*18249696351449250369+bd*2029516247978285970+be*14734352605587851872+bf*8485311572815839186+bg*8263508188473851570+bh*14727305307661336083+bi*6229129263537323513+bj*17136745747103828990+bk*8565837800438907855+bl*17019788193812566822+bm*9527005534132814755+bn*1469762980661997658==36513205019421922844286)
s.add(ab*1469762980661997658+ac*16549643443520875622+ad*9455193414123931504+ae*12209676511763563786+af*271051473986116907+ag*17058641684143308429+ah*13420564135579638218+ai*7599871345247004229+aj*12407953253235233563+ak*3098214620796127593+al*18025934049184131586+am*14516706192923330501+an*13439587873423175563+ao*17668371729629097289+ap*4983820371965098250+aq*1941436363223653079+ar*15491407246309500298+bs*8746935775477023498+at*911995915798699052+au*16286652540519392376+av*13788248038504935294+aw*18140313902119960073+ax*11357802109616441330+ay*2498891881524249135+az*9088680937359588259+ba*14593377776851675952+bc*2870989617629497346+bd*18249696351449250369+be*2029516247978285970+bf*14734352605587851872+bg*8485311572815839186+bh*8263508188473851570+bi*14727305307661336083+bj*6229129263537323513+bk*17136745747103828990+bl*8565837800438907855+bm*17019788193812566822+bn*9527005534132814755==35188395228735536982649)
s.add(ab*9527005534132814755+ac*1469762980661997658+ad*16549643443520875622+ae*9455193414123931504+af*12209676511763563786+ag*271051473986116907+ah*17058641684143308429+ai*13420564135579638218+aj*7599871345247004229+ak*12407953253235233563+al*3098214620796127593+am*18025934049184131586+an*14516706192923330501+ao*13439587873423175563+ap*17668371729629097289+aq*4983820371965098250+ar*1941436363223653079+bs*15491407246309500298+at*8746935775477023498+au*911995915798699052+av*16286652540519392376+aw*13788248038504935294+ax*18140313902119960073+ay*11357802109616441330+az*2498891881524249135+ba*9088680937359588259+bc*14593377776851675952+bd*2870989617629497346+be*18249696351449250369+bf*2029516247978285970+bg*14734352605587851872+bh*8485311572815839186+bi*8263508188473851570+bj*14727305307661336083+bk*6229129263537323513+bl*17136745747103828990+bm*8565837800438907855+bn*17019788193812566822==35301216188296520201752)
s.add(ab*17019788193812566822+ac*9527005534132814755+ad*1469762980661997658+ae*16549643443520875622+af*9455193414123931504+ag*12209676511763563786+ah*271051473986116907+ai*17058641684143308429+aj*13420564135579638218+ak*7599871345247004229+al*12407953253235233563+am*3098214620796127593+an*18025934049184131586+ao*14516706192923330501+ap*13439587873423175563+aq*17668371729629097289+ar*4983820371965098250+bs*1941436363223653079+at*15491407246309500298+au*8746935775477023498+av*911995915798699052+aw*16286652540519392376+ax*13788248038504935294+ay*18140313902119960073+az*11357802109616441330+ba*2498891881524249135+bc*9088680937359588259+bd*14593377776851675952+be*2870989617629497346+bf*18249696351449250369+bg*2029516247978285970+bh*14734352605587851872+bi*8485311572815839186+bj*8263508188473851570+bk*14727305307661336083+bl*6229129263537323513+bm*17136745747103828990+bn*8565837800438907855==35877364908848326577377)
s.add(ab*8565837800438907855+ac*17019788193812566822+ad*9527005534132814755+ae*1469762980661997658+af*16549643443520875622+ag*9455193414123931504+ah*12209676511763563786+ai*271051473986116907+aj*17058641684143308429+ak*13420564135579638218+al*7599871345247004229+am*12407953253235233563+an*3098214620796127593+ao*18025934049184131586+ap*14516706192923330501+aq*13439587873423175563+ar*17668371729629097289+bs*4983820371965098250+at*1941436363223653079+au*15491407246309500298+av*8746935775477023498+aw*911995915798699052+ax*16286652540519392376+ay*13788248038504935294+az*18140313902119960073+ba*11357802109616441330+bc*2498891881524249135+bd*9088680937359588259+be*14593377776851675952+bf*2870989617629497346+bg*18249696351449250369+bh*2029516247978285970+bi*14734352605587851872+bj*8485311572815839186+bk*8263508188473851570+bl*14727305307661336083+bm*6229129263537323513+bn*17136745747103828990==35548407875093684038138)
s.add(ab*17136745747103828990+ac*8565837800438907855+ad*17019788193812566822+ae*9527005534132814755+af*1469762980661997658+ag*16549643443520875622+ah*9455193414123931504+ai*12209676511763563786+aj*271051473986116907+ak*17058641684143308429+al*13420564135579638218+am*7599871345247004229+an*12407953253235233563+ao*3098214620796127593+ap*18025934049184131586+aq*14516706192923330501+ar*13439587873423175563+bs*17668371729629097289+at*4983820371965098250+au*1941436363223653079+av*15491407246309500298+aw*8746935775477023498+ax*911995915798699052+ay*16286652540519392376+az*13788248038504935294+ba*18140313902119960073+bc*11357802109616441330+bd*2498891881524249135+be*9088680937359588259+bf*14593377776851675952+bg*2870989617629497346+bh*18249696351449250369+bi*2029516247978285970+bj*14734352605587851872+bk*8485311572815839186+bl*8263508188473851570+bm*14727305307661336083+bn*6229129263537323513==36846989992339836295226)
s.add(ab*6229129263537323513+ac*17136745747103828990+ad*8565837800438907855+ae*17019788193812566822+af*9527005534132814755+ag*1469762980661997658+ah*16549643443520875622+ai*9455193414123931504+aj*12209676511763563786+ak*271051473986116907+al*17058641684143308429+am*13420564135579638218+an*7599871345247004229+ao*12407953253235233563+ap*3098214620796127593+aq*18025934049184131586+ar*14516706192923330501+bs*13439587873423175563+at*17668371729629097289+au*4983820371965098250+av*1941436363223653079+aw*15491407246309500298+ax*8746935775477023498+ay*911995915798699052+az*16286652540519392376+ba*13788248038504935294+bc*18140313902119960073+bd*11357802109616441330+be*2498891881524249135+bf*9088680937359588259+bg*14593377776851675952+bh*2870989617629497346+bi*18249696351449250369+bj*2029516247978285970+bk*14734352605587851872+bl*8485311572815839186+bm*8263508188473851570+bn*14727305307661336083==35424096673112978582599)
s.add(ab*14727305307661336083+ac*6229129263537323513+ad*17136745747103828990+ae*8565837800438907855+af*17019788193812566822+ag*9527005534132814755+ah*1469762980661997658+ai*16549643443520875622+aj*9455193414123931504+ak*12209676511763563786+al*271051473986116907+am*17058641684143308429+an*13420564135579638218+ao*7599871345247004229+ap*12407953253235233563+aq*3098214620796127593+ar*18025934049184131586+bs*14516706192923330501+at*13439587873423175563+au*17668371729629097289+av*4983820371965098250+aw*1941436363223653079+ax*15491407246309500298+ay*8746935775477023498+az*911995915798699052+ba*16286652540519392376+bc*13788248038504935294+bd*18140313902119960073+be*11357802109616441330+bf*2498891881524249135+bg*9088680937359588259+bh*14593377776851675952+bi*2870989617629497346+bj*18249696351449250369+bk*2029516247978285970+bl*14734352605587851872+bm*8485311572815839186+bn*8263508188473851570==35435941095923989701820)
s.add(ab*8263508188473851570+ac*14727305307661336083+ad*6229129263537323513+ae*17136745747103828990+af*8565837800438907855+ag*17019788193812566822+ah*9527005534132814755+ai*1469762980661997658+aj*16549643443520875622+ak*9455193414123931504+al*12209676511763563786+am*271051473986116907+an*17058641684143308429+ao*13420564135579638218+ap*7599871345247004229+aq*12407953253235233563+ar*3098214620796127593+bs*18025934049184131586+at*14516706192923330501+au*13439587873423175563+av*17668371729629097289+aw*4983820371965098250+ax*1941436363223653079+ay*15491407246309500298+az*8746935775477023498+ba*911995915798699052+bc*16286652540519392376+bd*13788248038504935294+be*18140313902119960073+bf*11357802109616441330+bg*2498891881524249135+bh*9088680937359588259+bi*14593377776851675952+bj*2870989617629497346+bk*18249696351449250369+bl*2029516247978285970+bm*14734352605587851872+bn*8485311572815839186==35884660233631412675912)
s.add(ab*8485311572815839186+ac*8263508188473851570+ad*14727305307661336083+ae*6229129263537323513+af*17136745747103828990+ag*8565837800438907855+ah*17019788193812566822+ai*9527005534132814755+aj*1469762980661997658+ak*16549643443520875622+al*9455193414123931504+am*12209676511763563786+an*271051473986116907+ao*17058641684143308429+ap*13420564135579638218+aq*7599871345247004229+ar*12407953253235233563+bs*3098214620796127593+at*18025934049184131586+au*14516706192923330501+av*13439587873423175563+aw*17668371729629097289+ax*4983820371965098250+ay*1941436363223653079+az*15491407246309500298+ba*8746935775477023498+bc*911995915798699052+bd*16286652540519392376+be*13788248038504935294+bf*18140313902119960073+bg*11357802109616441330+bh*2498891881524249135+bi*9088680937359588259+bj*14593377776851675952+bk*2870989617629497346+bl*18249696351449250369+bm*2029516247978285970+bn*14734352605587851872==35250569480372437220096)
s.add(ab*14734352605587851872+ac*8485311572815839186+ad*8263508188473851570+ae*14727305307661336083+af*6229129263537323513+ag*17136745747103828990+ah*8565837800438907855+ai*17019788193812566822+aj*9527005534132814755+ak*1469762980661997658+al*16549643443520875622+am*9455193414123931504+an*12209676511763563786+ao*271051473986116907+ap*17058641684143308429+aq*13420564135579638218+ar*7599871345247004229+bs*12407953253235233563+at*3098214620796127593+au*18025934049184131586+av*14516706192923330501+aw*13439587873423175563+ax*17668371729629097289+ay*4983820371965098250+az*1941436363223653079+ba*15491407246309500298+bc*8746935775477023498+bd*911995915798699052+be*16286652540519392376+bf*13788248038504935294+bg*18140313902119960073+bh*11357802109616441330+bi*2498891881524249135+bj*9088680937359588259+bk*14593377776851675952+bl*2870989617629497346+bm*18249696351449250369+bn*2029516247978285970==36071512852625372107309)
s.add(ab*2029516247978285970+ac*14734352605587851872+ad*8485311572815839186+ae*8263508188473851570+af*14727305307661336083+ag*6229129263537323513+ah*17136745747103828990+ai*8565837800438907855+aj*17019788193812566822+ak*9527005534132814755+al*1469762980661997658+am*16549643443520875622+an*9455193414123931504+ao*12209676511763563786+ap*271051473986116907+aq*17058641684143308429+ar*13420564135579638218+bs*7599871345247004229+at*12407953253235233563+au*3098214620796127593+av*18025934049184131586+aw*14516706192923330501+ax*13439587873423175563+ay*17668371729629097289+az*4983820371965098250+ba*1941436363223653079+bc*15491407246309500298+bd*8746935775477023498+be*911995915798699052+bf*16286652540519392376+bg*13788248038504935294+bh*18140313902119960073+bi*11357802109616441330+bj*2498891881524249135+bk*9088680937359588259+bl*14593377776851675952+bm*2870989617629497346+bn*18249696351449250369==35636049634203159168488)
s.add(ab*18249696351449250369+ac*2029516247978285970+ad*14734352605587851872+ae*8485311572815839186+af*8263508188473851570+ag*14727305307661336083+ah*6229129263537323513+ai*17136745747103828990+aj*8565837800438907855+ak*17019788193812566822+al*9527005534132814755+am*1469762980661997658+an*16549643443520875622+ao*9455193414123931504+ap*12209676511763563786+aq*271051473986116907+ar*17058641684143308429+bs*13420564135579638218+at*7599871345247004229+au*12407953253235233563+av*3098214620796127593+aw*18025934049184131586+ax*14516706192923330501+ay*13439587873423175563+az*17668371729629097289+ba*4983820371965098250+bc*1941436363223653079+bd*15491407246309500298+be*8746935775477023498+bf*911995915798699052+bg*16286652540519392376+bh*13788248038504935294+bi*18140313902119960073+bj*11357802109616441330+bk*2498891881524249135+bl*9088680937359588259+bm*14593377776851675952+bn*2870989617629497346==35407704890518035619865)
s.add(ab*2870989617629497346+ac*18249696351449250369+ad*2029516247978285970+ae*14734352605587851872+af*8485311572815839186+ag*8263508188473851570+ah*14727305307661336083+ai*6229129263537323513+aj*17136745747103828990+ak*8565837800438907855+al*17019788193812566822+am*9527005534132814755+an*1469762980661997658+ao*16549643443520875622+ap*9455193414123931504+aq*12209676511763563786+ar*271051473986116907+bs*17058641684143308429+at*13420564135579638218+au*7599871345247004229+av*12407953253235233563+aw*3098214620796127593+ax*18025934049184131586+ay*14516706192923330501+az*13439587873423175563+ba*17668371729629097289+bc*4983820371965098250+bd*1941436363223653079+be*15491407246309500298+bf*8746935775477023498+bg*911995915798699052+bh*16286652540519392376+bi*13788248038504935294+bj*18140313902119960073+bk*11357802109616441330+bl*2498891881524249135+bm*9088680937359588259+bn*14593377776851675952==35691117250745693469087)
s.add(ab*14593377776851675952+ac*2870989617629497346+ad*18249696351449250369+ae*2029516247978285970+af*14734352605587851872+ag*8485311572815839186+ah*8263508188473851570+ai*14727305307661336083+aj*6229129263537323513+ak*17136745747103828990+al*8565837800438907855+am*17019788193812566822+an*9527005534132814755+ao*1469762980661997658+ap*16549643443520875622+aq*9455193414123931504+ar*12209676511763563786+bs*271051473986116907+at*17058641684143308429+au*13420564135579638218+av*7599871345247004229+aw*12407953253235233563+ax*3098214620796127593+ay*18025934049184131586+az*14516706192923330501+ba*13439587873423175563+bc*17668371729629097289+bd*4983820371965098250+be*1941436363223653079+bf*15491407246309500298+bg*8746935775477023498+bh*911995915798699052+bi*16286652540519392376+bj*13788248038504935294+bk*18140313902119960073+bl*11357802109616441330+bm*2498891881524249135+bn*9088680937359588259==35942285968400856168658)
s.add(ab*9088680937359588259+ac*14593377776851675952+ad*2870989617629497346+ae*18249696351449250369+af*2029516247978285970+ag*14734352605587851872+ah*8485311572815839186+ai*8263508188473851570+aj*14727305307661336083+ak*6229129263537323513+al*17136745747103828990+am*8565837800438907855+an*17019788193812566822+ao*9527005534132814755+ap*1469762980661997658+aq*16549643443520875622+ar*9455193414123931504+bs*12209676511763563786+at*271051473986116907+au*17058641684143308429+av*13420564135579638218+aw*7599871345247004229+ax*12407953253235233563+ay*3098214620796127593+az*18025934049184131586+ba*14516706192923330501+bc*13439587873423175563+bd*17668371729629097289+be*4983820371965098250+bf*1941436363223653079+bg*15491407246309500298+bh*8746935775477023498+bi*911995915798699052+bj*16286652540519392376+bk*13788248038504935294+bl*18140313902119960073+bm*11357802109616441330+bn*2498891881524249135==35659245396595333737528)
s.add(ab*2498891881524249135+ac*9088680937359588259+ad*14593377776851675952+ae*2870989617629497346+af*18249696351449250369+ag*2029516247978285970+ah*14734352605587851872+ai*8485311572815839186+aj*8263508188473851570+ak*14727305307661336083+al*6229129263537323513+am*17136745747103828990+an*8565837800438907855+ao*17019788193812566822+ap*9527005534132814755+aq*1469762980661997658+ar*16549643443520875622+bs*9455193414123931504+at*12209676511763563786+au*271051473986116907+av*17058641684143308429+aw*13420564135579638218+ax*7599871345247004229+ay*12407953253235233563+az*3098214620796127593+ba*18025934049184131586+bc*14516706192923330501+bd*13439587873423175563+be*17668371729629097289+bf*4983820371965098250+bg*1941436363223653079+bh*15491407246309500298+bi*8746935775477023498+bj*911995915798699052+bk*16286652540519392376+bl*13788248038504935294+bm*18140313902119960073+bn*11357802109616441330==34682110547383898878610)
s.add(ab*11357802109616441330+ac*2498891881524249135+ad*9088680937359588259+ae*14593377776851675952+af*2870989617629497346+ag*18249696351449250369+ah*2029516247978285970+ai*14734352605587851872+aj*8485311572815839186+ak*8263508188473851570+al*14727305307661336083+am*6229129263537323513+an*17136745747103828990+ao*8565837800438907855+ap*17019788193812566822+aq*9527005534132814755+ar*1469762980661997658+bs*16549643443520875622+at*9455193414123931504+au*12209676511763563786+av*271051473986116907+aw*17058641684143308429+ax*13420564135579638218+ay*7599871345247004229+az*12407953253235233563+ba*3098214620796127593+bc*18025934049184131586+bd*14516706192923330501+be*13439587873423175563+bf*17668371729629097289+bg*4983820371965098250+bh*1941436363223653079+bi*15491407246309500298+bj*8746935775477023498+bk*911995915798699052+bl*16286652540519392376+bm*13788248038504935294+bn*18140313902119960073==36251061019324605768432)
s.add(ab*18140313902119960073+ac*11357802109616441330+ad*2498891881524249135+ae*9088680937359588259+af*14593377776851675952+ag*2870989617629497346+ah*18249696351449250369+ai*2029516247978285970+aj*14734352605587851872+ak*8485311572815839186+al*8263508188473851570+am*14727305307661336083+an*6229129263537323513+ao*17136745747103828990+ap*8565837800438907855+aq*17019788193812566822+ar*9527005534132814755+bs*1469762980661997658+at*16549643443520875622+au*9455193414123931504+av*12209676511763563786+aw*271051473986116907+ax*17058641684143308429+ay*13420564135579638218+az*7599871345247004229+ba*12407953253235233563+bc*3098214620796127593+bd*18025934049184131586+be*14516706192923330501+bf*13439587873423175563+bg*17668371729629097289+bh*4983820371965098250+bi*1941436363223653079+bj*15491407246309500298+bk*8746935775477023498+bl*911995915798699052+bm*16286652540519392376+bn*13788248038504935294==34350337346574061914637)
s.add(ab*13788248038504935294+ac*18140313902119960073+ad*11357802109616441330+ae*2498891881524249135+af*9088680937359588259+ag*14593377776851675952+ah*2870989617629497346+ai*18249696351449250369+aj*2029516247978285970+ak*14734352605587851872+al*8485311572815839186+am*8263508188473851570+an*14727305307661336083+ao*6229129263537323513+ap*17136745747103828990+aq*8565837800438907855+ar*17019788193812566822+bs*9527005534132814755+at*1469762980661997658+au*16549643443520875622+av*9455193414123931504+aw*12209676511763563786+ax*271051473986116907+ay*17058641684143308429+az*13420564135579638218+ba*7599871345247004229+bc*12407953253235233563+bd*3098214620796127593+be*18025934049184131586+bf*14516706192923330501+bg*13439587873423175563+bh*17668371729629097289+bi*4983820371965098250+bj*1941436363223653079+bk*15491407246309500298+bl*8746935775477023498+bm*911995915798699052+bn*16286652540519392376==36706069443188806905153)
s.add(ab*16286652540519392376+ac*13788248038504935294+ad*18140313902119960073+ae*11357802109616441330+af*2498891881524249135+ag*9088680937359588259+ah*14593377776851675952+ai*2870989617629497346+aj*18249696351449250369+ak*2029516247978285970+al*14734352605587851872+am*8485311572815839186+an*8263508188473851570+ao*14727305307661336083+ap*6229129263537323513+aq*17136745747103828990+ar*8565837800438907855+bs*17019788193812566822+at*9527005534132814755+au*1469762980661997658+av*16549643443520875622+aw*9455193414123931504+ax*12209676511763563786+ay*271051473986116907+az*17058641684143308429+ba*13420564135579638218+bc*7599871345247004229+bd*12407953253235233563+be*3098214620796127593+bf*18025934049184131586+bg*14516706192923330501+bh*13439587873423175563+bi*17668371729629097289+bj*4983820371965098250+bk*1941436363223653079+bl*15491407246309500298+bm*8746935775477023498+bn*911995915798699052==35296365364968284652906)
s.add(ab*911995915798699052+ac*16286652540519392376+ad*13788248038504935294+ae*18140313902119960073+af*11357802109616441330+ag*2498891881524249135+ah*9088680937359588259+ai*14593377776851675952+aj*2870989617629497346+ak*18249696351449250369+al*2029516247978285970+am*14734352605587851872+an*8485311572815839186+ao*8263508188473851570+ap*14727305307661336083+aq*6229129263537323513+ar*17136745747103828990+bs*8565837800438907855+at*17019788193812566822+au*9527005534132814755+av*1469762980661997658+aw*16549643443520875622+ax*9455193414123931504+ay*12209676511763563786+az*271051473986116907+ba*17058641684143308429+bc*13420564135579638218+bd*7599871345247004229+be*12407953253235233563+bf*3098214620796127593+bg*18025934049184131586+bh*14516706192923330501+bi*13439587873423175563+bj*17668371729629097289+bk*4983820371965098250+bl*1941436363223653079+bm*15491407246309500298+bn*8746935775477023498==34767397368306249667499)
s.add(ab*8746935775477023498+ac*911995915798699052+ad*16286652540519392376+ae*13788248038504935294+af*18140313902119960073+ag*11357802109616441330+ah*2498891881524249135+ai*9088680937359588259+aj*14593377776851675952+ak*2870989617629497346+al*18249696351449250369+am*2029516247978285970+an*14734352605587851872+ao*8485311572815839186+ap*8263508188473851570+aq*14727305307661336083+ar*6229129263537323513+bs*17136745747103828990+at*8565837800438907855+au*17019788193812566822+av*9527005534132814755+aw*1469762980661997658+ax*16549643443520875622+ay*9455193414123931504+az*12209676511763563786+ba*271051473986116907+bc*17058641684143308429+bd*13420564135579638218+be*7599871345247004229+bf*12407953253235233563+bg*3098214620796127593+bh*18025934049184131586+bi*14516706192923330501+bj*13439587873423175563+bk*17668371729629097289+bl*4983820371965098250+bm*1941436363223653079+bn*15491407246309500298==37665777691001951216694)
s.add(ab*15491407246309500298+ac*8746935775477023498+ad*911995915798699052+ae*16286652540519392376+af*13788248038504935294+ag*18140313902119960073+ah*11357802109616441330+ai*2498891881524249135+aj*9088680937359588259+ak*14593377776851675952+al*2870989617629497346+am*18249696351449250369+an*2029516247978285970+ao*14734352605587851872+ap*8485311572815839186+aq*8263508188473851570+ar*14727305307661336083+bs*6229129263537323513+at*17136745747103828990+au*8565837800438907855+av*17019788193812566822+aw*9527005534132814755+ax*1469762980661997658+ay*16549643443520875622+az*9455193414123931504+ba*12209676511763563786+bc*271051473986116907+bd*17058641684143308429+be*13420564135579638218+bf*7599871345247004229+bg*12407953253235233563+bh*3098214620796127593+bi*18025934049184131586+bj*14516706192923330501+bk*13439587873423175563+bl*17668371729629097289+bm*4983820371965098250+bn*1941436363223653079==33927027243025444519647)
s.add(ab*1941436363223653079+ac*15491407246309500298+ad*8746935775477023498+ae*911995915798699052+af*16286652540519392376+ag*13788248038504935294+ah*18140313902119960073+ai*11357802109616441330+aj*2498891881524249135+ak*9088680937359588259+al*14593377776851675952+am*2870989617629497346+an*18249696351449250369+ao*2029516247978285970+ap*14734352605587851872+aq*8485311572815839186+ar*8263508188473851570+bs*14727305307661336083+at*6229129263537323513+au*17136745747103828990+av*8565837800438907855+aw*17019788193812566822+ax*9527005534132814755+ay*1469762980661997658+az*16549643443520875622+ba*9455193414123931504+bc*12209676511763563786+bd*271051473986116907+be*17058641684143308429+bf*13420564135579638218+bg*7599871345247004229+bh*12407953253235233563+bi*3098214620796127593+bj*18025934049184131586+bk*14516706192923330501+bl*13439587873423175563+bm*17668371729629097289+bn*4983820371965098250==37464577169642287783563)
s.add(ab*4983820371965098250+ac*1941436363223653079+ad*15491407246309500298+ae*8746935775477023498+af*911995915798699052+ag*16286652540519392376+ah*13788248038504935294+ai*18140313902119960073+aj*11357802109616441330+ak*2498891881524249135+al*9088680937359588259+am*14593377776851675952+an*2870989617629497346+ao*18249696351449250369+ap*2029516247978285970+aq*14734352605587851872+ar*8485311572815839186+bs*8263508188473851570+at*14727305307661336083+au*6229129263537323513+av*17136745747103828990+aw*8565837800438907855+ax*17019788193812566822+ay*9527005534132814755+az*1469762980661997658+ba*16549643443520875622+bc*9455193414123931504+bd*12209676511763563786+be*271051473986116907+bf*17058641684143308429+bg*13420564135579638218+bh*7599871345247004229+bi*12407953253235233563+bj*3098214620796127593+bk*18025934049184131586+bl*14516706192923330501+bm*13439587873423175563+bn*17668371729629097289==34818703279589326375333)
s.add(ab*17668371729629097289+ac*4983820371965098250+ad*1941436363223653079+ae*15491407246309500298+af*8746935775477023498+ag*911995915798699052+ah*16286652540519392376+ai*13788248038504935294+aj*18140313902119960073+ak*11357802109616441330+al*2498891881524249135+am*9088680937359588259+an*14593377776851675952+ao*2870989617629497346+ap*18249696351449250369+aq*2029516247978285970+ar*14734352605587851872+bs*8485311572815839186+at*8263508188473851570+au*14727305307661336083+av*6229129263537323513+aw*17136745747103828990+ax*8565837800438907855+ay*17019788193812566822+az*9527005534132814755+ba*1469762980661997658+bc*16549643443520875622+bd*9455193414123931504+be*12209676511763563786+bf*271051473986116907+bg*17058641684143308429+bh*13420564135579638218+bi*7599871345247004229+bj*12407953253235233563+bk*3098214620796127593+bl*18025934049184131586+bm*14516706192923330501+bn*13439587873423175563==35526731706613463585509)
s.add(ab*13439587873423175563+ac*17668371729629097289+ad*4983820371965098250+ae*1941436363223653079+af*15491407246309500298+ag*8746935775477023498+ah*911995915798699052+ai*16286652540519392376+aj*13788248038504935294+ak*18140313902119960073+al*11357802109616441330+am*2498891881524249135+an*9088680937359588259+ao*14593377776851675952+ap*2870989617629497346+aq*18249696351449250369+ar*2029516247978285970+bs*14734352605587851872+at*8485311572815839186+au*8263508188473851570+av*14727305307661336083+aw*6229129263537323513+ax*17136745747103828990+ay*8565837800438907855+az*17019788193812566822+ba*9527005534132814755+bc*1469762980661997658+bd*16549643443520875622+be*9455193414123931504+bf*12209676511763563786+bg*271051473986116907+bh*17058641684143308429+bi*13420564135579638218+bj*7599871345247004229+bk*12407953253235233563+bl*3098214620796127593+bm*18025934049184131586+bn*14516706192923330501==36698165076109278070662)
s.add(ab*14516706192923330501+ac*13439587873423175563+ad*17668371729629097289+ae*4983820371965098250+af*1941436363223653079+ag*15491407246309500298+ah*8746935775477023498+ai*911995915798699052+aj*16286652540519392376+ak*13788248038504935294+al*18140313902119960073+am*11357802109616441330+an*2498891881524249135+ao*9088680937359588259+ap*14593377776851675952+aq*2870989617629497346+ar*18249696351449250369+bs*2029516247978285970+at*14734352605587851872+au*8485311572815839186+av*8263508188473851570+aw*14727305307661336083+ax*6229129263537323513+ay*17136745747103828990+az*8565837800438907855+ba*17019788193812566822+bc*9527005534132814755+bd*1469762980661997658+be*16549643443520875622+bf*9455193414123931504+bg*12209676511763563786+bh*271051473986116907+bi*17058641684143308429+bj*13420564135579638218+bk*7599871345247004229+bl*12407953253235233563+bm*3098214620796127593+bn*18025934049184131586==34612009622491263626134)
s.add(ab*18025934049184131586+ac*14516706192923330501+ad*13439587873423175563+ae*17668371729629097289+af*4983820371965098250+ag*1941436363223653079+ah*15491407246309500298+ai*8746935775477023498+aj*911995915798699052+ak*16286652540519392376+al*13788248038504935294+am*18140313902119960073+an*11357802109616441330+ao*2498891881524249135+ap*9088680937359588259+aq*14593377776851675952+ar*2870989617629497346+bs*18249696351449250369+at*2029516247978285970+au*14734352605587851872+av*8485311572815839186+aw*8263508188473851570+ax*14727305307661336083+ay*6229129263537323513+az*17136745747103828990+ba*8565837800438907855+bc*17019788193812566822+bd*9527005534132814755+be*1469762980661997658+bf*16549643443520875622+bg*9455193414123931504+bh*12209676511763563786+bi*271051473986116907+bj*17058641684143308429+bk*13420564135579638218+bl*7599871345247004229+bm*12407953253235233563+bn*3098214620796127593==37224659068886403545747)
print(s.check())
print(s.model())

then we'll get a aray for the solution, we just need to sort it a bit to finally make the flag

solution:
values = [
    'ak = 98',
    'at = 52',
    'ag = 97',
    'av = 99',
    'ax = 102',
    'an = 98',
    'be = 56',
    'bd = 49',
    'aw = 54',
    'ah = 97',
    'ao = 51',
    'am = 57',
    'ay = 55',
    'az = 101',
    'bf = 100',
    'bi = 99',
    'ap = 102',
    'bk = 98',
    'bj = 98',
    'ar = 102',
    'aj = 57',
    'aq = 100',
    'ai = 100',
    'au = 99',
    'bc = 101',
    'bg = 48',
    'ba = 50',
    'al = 97',
    'bs = 97',
    'bh = 100',
    'bl = 97',
    'bm = 98',
    'ad = 97',
    'ac = 108',
    'ab = 102',
    'bn = 125',
    'af = 123',
    'ae = 103'
]

temp=[]
for i in values:
	a,b=i.split(' = ')
	if a=='bs':
		a='as'
	temp.append([a,b])
temp=sorted(temp)
for i in temp:
	print(chr(int(i[1])),end='')

flag{8b76b85e7f450c39502e71c215f6f1fe}

ForgeMe 1

we're given a crypto.py and oracle.py there's also a hint about SHA1 RFC and Length Extension Attack, so because of these hints i'm assuming that this is a length extension attack chall.

Looking into the oracle.py file i understood that our goal is to predict the signature value of any message containing the string "I guess you are just gonna have to include this!". We don't know the secret key used in the signing, but we do know that the length of the secret key is 64 , and it is using SHA1 hashing scheme based on the crypto.py file, so it is indeed vulnerable to length extension attack.

To summarize what i do is first i asked the service to sign a string, in this case i just use the string "I guess you are just gonna have to include this!" so i don't need to add it later, after the server signed the string and getting the hash value i feed it into hashpump by adding the string "a" then i got a new string as forged message and the signature value of the string and finally i just need to give it to the service to get the flag

Solution
from pwn import *
import subprocess
from Crypto.Util.number import *
f=remote('challenge.nahamcon.com','31836')
#f=remote('0.0.0.0','1234')
f.sendline(b'1')
payload=b"I guess you are just gonna have to include this!"
tambah=b'a'
payload_hex=bytes_to_long(payload)
payload_hex=hex(payload_hex)[2:]
f.sendlineafter(b'(hex): ',payload_hex.encode())
signed=f.readline().decode().strip('H(key || msg): ').rstrip()

print('[*] running hashpump')
args=f'hashpump --data "{payload.decode()}" -k 64 -a "{tambah.decode()}" -s {signed} '
print(args)
temp=subprocess.check_output(["hashpump","--data",f"{payload.decode()}","-k","64","-a",f"{tambah.decode()}","-s",f"{signed}"])
forged=temp.split(b'\n')[0]
print('[+] finished running hashpump')

payload_forged=b'I guess you are just gonna have to include this!\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80a'
payload_forged=bytes_to_long(payload_forged)
payload_forged=hex(payload_forged)[2:]

f.sendlineafter(b'Choice: ',b'3')
f.sendlineafter(b'msg (hex): ',payload_forged.encode())
f.sendlineafter(b'tag (hex): ',forged)
flag=f.readline().decode()
print(flag)

notice how i print the args as i want to see what argument used in the hashpump :D

flag{4179e0a0f6ddc273a8a18440c979bbb7}

ForgeMe 2

this chall look like somewhat related to the previous chall ForgeMe1, in this one we're also given 2 file crypto.py and oracle.py and after looking at the oracle.py file it is indeed almost the same as previous chall but with a few modification.

The first modification i noticed is the string i need to include in the message needeed to be signed to get the flag is randomized based on some dictionary, so it won't be static as before ( before it was "I guess you are just gonna have to include this!"), the second modification is the fact that i have to also include the string "https://www.youtube.com/@_JohnHammond" into the message too, and the final modification is the fact that the key length will be randomized with length between 10 and 120.

so based on these 3 modifications, i only need to change the hashpump arguments, and try every possible key length by verifying whether my message and signature is right in the menu number 2 to verify signature, the main problem while working in this challenge is how hashpumpy return bytes for the forged message, for example instead of giving me \x80 it gives me \x80 after searching for a while i found that the solution is to first decode it using the 'unicode_escape' decoding and then encode it again using the 'raw_unicode_escape' encoding, after that i obtain the perfect bytes to be fed into the service and to be checked whether it is a valid signature or not, after getting the verdict "True" we just need to send the message and signature to the service to get the flag.

Solution
from pwn import *
import subprocess
from Crypto.Util.number import *
import codecs
f=remote('challenge.nahamcon.com','32543')
#f=remote('0.0.0.0','1234')
f.sendline(b'1')
f.readline()
payload=f.readline().strip(b'first_part: ').rstrip(b'\n')

tambah=b'https://www.youtube.com/@_JohnHammond'
payload_hex=bytes_to_long(payload)
payload_hex=hex(payload_hex)[2:]
f.sendlineafter(b'(hex): ',payload_hex.encode())
signed=f.readline().decode().strip('H(key || msg): ').rstrip()

for i in range(10,120):
	print(f'[*] running hashpump for key len {i}')
	args=f'hashpump --data "{payload.decode()}" -k {i} -a "{tambah.decode()}" -s {signed} '
	print(args)

	temp=subprocess.check_output(["hashpump","--data",f"{payload.decode()}","-k",f"{i}","-a",f"{tambah.decode()}","-s",f"{signed}"])

	forged,payload_forged=temp.split(b'\n')[:2]
	print('[+] finished running hashpump')
	print(payload_forged)
	payload_forged=payload_forged.decode('unicode_escape').encode('raw_unicode_escape')
	payload_forged=bytes_to_long(payload_forged)
	payload_forged=hex(payload_forged)[2:]
	f.sendlineafter(b'Choice: ',b'2')
	f.sendlineafter(b'msg (hex): ',payload_forged.encode())
	f.sendlineafter(b'tag (hex): ',forged)
	verdict=f.readline().decode()
	print(verdict)
	if verdict=="True\n":
		break
f.sendlineafter(b'Choice: ',b'3')
f.sendlineafter(b'msg (hex): ',payload_forged.encode())
f.sendlineafter(b'tag (hex): ',forged)
flag=f.readline().decode()
print(flag)

flag{257843b6ca2a7678857f9caf21dd92f0}

Made with♥️by CCUG Core Team.