Flagvent 2025: Day 2
FV25.02 - Lowkey Sleigh
Difficulty
easy
Categories
rev
Description
Santa wanted to modernize the sleigh's startup system and impress the younger elves in the workshop. After scrolling through too many TikToks, he decided to rewrite the entire ignition script using all the latest slang - you know, to seem "skibidi" and "rizz up" his tech cred.
The good news? He finished the script.
The bad news? In his excitement to use words like "bussin" and "no cap," Santa completely forgot the password he set. And now, with Christmas Eve approaching, none of the elves can figure out how to decode his brainrot creation.
The sleigh won't start, the reindeer are getting restless, and Rudolph's nose is stress-flickering.
Can you decode Santa's script and recover the password before Christmas is ruined? The fate of the holiday rests in your hands! Sometimes the most "fr fr" solutions are hiding in plain sight, no cap.
Author
0xdfFlagvent 2025 - Day 2 - Lowkey SleighSolution
Santa's lowkey_sleigh.gyat script is interesting:
glaze sys
vibe_check = [b",OU\x08\x1dL\n\x0cGHO\x02\t\x11D\x1cO\x19\x1d\x16\x0e\x1cyHR\x03\x0b\t\x04AO\x0b\x06\x15N\x18IB\x10\x1a^G\x00\nV\x02\x15\x15ZdUTRO\x00*EA*PnTONEOOEE\x00NATRnNRVATETNSn\x00N*y\x00OU\x00wDU\x00\x00DEEU\x00EALRnNYY\x0bbNEE\x00OSHNI\x00LK\x00*UO\x00\x00D\x00_O\x1aEAL\x1a\x1aH\x00\x00SEA\x00\x00\x00dY\x00AGTLN\x00MUT\x00\x00D\x00yOGEUTPYV\x00IAEN\x00V\x00NR\x00\x00GVLN\x00MUTORE\x00TNROG\x00\x00U*!YJDE\x0b]REY\x0b\x0bGVEUUGE\x00N\x0c[[\x1a_XT\x1a[\rX_0\x1a[EN\x00VYT\x0c*EUE\x00\x07AKEMGG\x00AAULN\x00ANUE*\x00AE\x00\x00T\x00AHDN*i\x00VTN\x00nGGVAGUNN\x00AN\x00UC\x0bNN\x0b\x0bRFGD_D\\HB]!NAnBGV[]OT\\\x16T0OT]X[[\x1aSIHT\x00LOoCYV*NAnBNIyG\x00FEiOEDOHE\x00OMINRD\x00OOECYE*MNYU*UROYHSnDRN\x00\x0bN!DNBEYO\x0bDN ^\nL!_IDR*@A@KAHt\x1aHt\x1a\x1a_0U___\x1aL[KAOE~NLR\x00\x00E*OTNAOYn\x00Rn\x00\x00OAFAE\x07nHRTNOHDG\x00\x07\x00OE\x00ORNAOY*oNnOOUJNYVCKY]K[UXOO\nO\x0bDN\x0bDHMKFK]G\x0eI\x1aVHUNO\x1d\x1aCMO_\\OEDD*EHOO\x00FONEMNTD\x00NGSWOVUT\x00TWUERSHSVJwRU\x00\x00V\x07N\x00ENLHBNRSNAX[Z\x0eZJ\\\x0e\\Z\x0e\x0eEW$KH\x0b^\\!C\x0eK@\x0eFO@\\]@U\x1aNON\x1a_C\x1a[_iRY\x00\x00*EEU\x00*D\x00EN\x00HA\x00EAE\x00E\x00\x00NNHG\x00EAALYL\x00\x00EUU\x00*DKG*\x00W\x00V*GR@WMX@I\x0eI@K\x0eOIWB\x0e\x0e\\[Z@O\x1d!XO\x0eL\x0e\x0e$GKAK_LT]L]T_\x1a[]B\t\x07\x0cNmE\x00YA*AYUwO\x00*UE*EAVNGVGVTIW\x00NTD\x00OEUAHKTY\x00UNOA*UE*KOJ@\x0e@EZ$YK]YI]@\x0e\\@OIEOW[[@AOK\x06G$W\x0e\x0eItT\x1a\x1dXU\x1dtU]LNNRnkGKAYU\x00VTVRHA\x00YLEYIOEL\x00OOnCGVNNRnTYWA\x00SOD\x00NRN\x0cO@\x0eAWGA\\B\x0eAA`M\x0eA\tG\x0e$KAJKKgA\\Y@J\x1a\x0eAK\x1aACSU_G\x0bENN_NHO\x1aR*VnoOOEIRnNR\x00\x00OE\x00OTU\x00O\x00NVHTGT*A\x00WUDnEONEORnNR\x00\x00aV\x0eX[K\\]@@Y\x1aAI\x1aT_\x1a\x1aO_`AA@KA\x0e\x0eH\\AYO_\x0b\rK\x0bJNN\nA\x0bDXYT\x1a\x1a\x1aOE\x07OIeGUD\x00\x00GDURPSVGIREW\x00E\x00OSDN\x00UPNEINLE\x00LUT\x00R*GMPOX[G\x0eKM\x1a_@G[}\x1a_T\x1a\x1aM]_UTNOG\x0eJ\\@I]JULOS\x1a\x1dEXS[HT\x1aLOU\x1a\x1a[__UN\x00kN\x00HRNGSV*K\t\x00HU\x00*AAA\x00DT*Y\x00EAUE*N\x00AN\x00HLEOIEC@@OKF\x0e\x1aCMV_YT'\x1d\r_[O_0\x1a\x1a\x1a@C\x1a]GOA[[]]S[R\x1aZRNQ[^C0\x1aUuN]s0LCNwD\x00LE\x00O\x00DOGVAG\x00GYELAAVEVOUOHCT\x07*RRNYLE*OEDEIXOI\x0eAWC[MSIH\x1a\x1a]_YBBC0^_XDB_0UKJK$SWSUXH\x1aDJ\\LNHHTNN[BF0CHUYeU\x0cOEHEnIRE\x00E\x00nERSAGENNRTAOKEYMG\x00ON\x0cNNOOOU@K\x0eB\t`A\\`OIK@@\\HXI[AU\rM_JUIN\x1aT\x1a\t[WKUVVtUOeJZR\x12NLU_^U\x1a\\cNOM\x00~N\x00O\x00\x00UYEOLLOOIOMAWWEJNRO\x00HUgMQNMW\x03\x00O\x00\x00O\tN^BMAA[\x0e\x0eZ]\x0eOW\x0e\\t\rB[HC_C@Z\x0eBT\x1a}^[@K]ZN_C\x1a\x1dNF\x1d\x1aCOHt\x1aUL_M_UN\x07R*SNGH\x00N\x00ON\x00E\x00\x00SEN\x00\x00YUN\x08N\x00*\tF\x03V))T\x03K\x02IONO\x00EN\x0eK\x0e\x0e]K@\x0eKIKiAWZ\x0eSH0\x1dOELKX^IXTS\x0eK@\x0e]W\x1d\x1aTRL\x0bXXKMCNED{0\x1a[RBGVzGVNIiGOGY\x00VTGWEN\x00DMO\x00ENYA*\nBQADLR\x0eX\x1dB \nEWKE@$LKO@\x0eJOAKK@W[m\x1aW\x1a\\WOI[GAWH\x0eg`K\x0e[$^_0S\x1aJORF\x03\x03OJFA[\x1aQ\x00YRUkOYi\x00\x00nY\x00L*DE*R\x00W*S\x07GRNNR\x00*OB\x00ZQSO]RK\n\ndS\x0bB]IFI\x0eKAA`\x0eEKAJZK$AK\x0eA\\JOIWOB^G[BOWZDNF^\r_E\\HN)GQFZEO\nEQGV\x03s\x08N\x00OE\x00\x00OVATDT\x00UTROE*DREYOVOOiOR@@\x1d\n_CXMDHXOZKZ@[Z\\A\x0e$KO$^`ZA@KAAKK\x0e@OZ\\`@\\X[^O^DYd\nD0w\x1aEV\x03tGV\x03\x03GFFV\x03oALRnNRR\x00iENN\x00OSHNI\x00LK\x00*UO\x00\x00D\x00EU\x00EAL\n\nX\n\n^KO\x0e\x0e\x0e@W\x0eOIZB@\x0eC[Z\x0e\x0eJ\x0ewAIK[Z^WX\x0eGOKC\n\\\nDX\n\nM]VS\x0bF^_DYN\x0b_EYDG*\x00U**RAON\x00VYNR\x00\x00GVEUUGE\x00N\x0cAA\x00EBN\x00A\x00UE*\nKOD\x1aXWZ\x02\x0eK[K\x0e\tOEKCII\x0eOO[B@\x0eO@[K$\x0eOK\x0e\x0eY\nKBND b\x0b]_E\x0beLL]JL^EE\x0bJN*UH\x00EE\x00\x00YMLOTOWCIV*NAnBGVAGUNF\x0cN*UNGBAA\x00IYO@\x0eBAKMWX$@O`L@GwI\x0eHKgAKJAFK\x0eACG@\\O\nEENHRN!FER^!^YDRCXeOYE\x00*E*OEINRD\x00OE*T\x00G*TBOY*NONEOFn\x00Rn\x00\x00E*OEEE\x00VAAKR_N@V\\\x0e\x0eK$AZ@OAW`\x0e\\`\x0e\x0eAOHOK\t`FO_EDCOL\x0b\x0c\x0bDN\x0bDYEJDR!dEeDDUkEDLMEWSEUOEDD\x00E\x00OE\x00ORCEHESI\x00G\x00LROTU\x07\x00YWUEREONN\nOBRA\x0eHA@KC@ZJ\x0e@INJUX[Z\x0eZZ^OXXCX]A|Y^\x0b\x0b]\x0cE\x0bNEGCIEYXEDV\x7fT\x00TDR\x00RT\x00\x00KY*EE\x00UT)M\x03FM\x03KBMQPML\x03WVW\x03FZ\x03AEgXS\n\n\nOO_\r$J\x0eK@\x0eFO\x0eKOX\nO\n\nDDBM\x03FBKGRG\x0b\x0bN^^\x0b!O@L!\x0b\\\x0b]!LYERHVdG\x00GNE\x00AGYL\x00\x00RUTNU\x03)AB\x03A\x03\x03)JFLFFUMDUDMF\x03BDL\x03\x04\x06DMO\nSK![W[yA\x0e$[H OK\\DM\\M\\^JT\x03D_O\x0bDN^JC@_R\x0b^EDJ!^N!NJOE\x00dKT*WESWGSN\x00RNAGKAYUUEEJN\x03B!R\x0b\x0bXdE\x0b\x0bID\rmLDUNMQmKMAJS_\n\\^]OCK\nSFOSCEOF\nEEm@D\\EEYe_R\\J\x0bXDO\x0bEYE\x07DE\x0bDRBDRf\x00OOnC\x00O\x07I\x00*EODEEiORWE[\x0b\x0bDN\x0bDRBDYG\x0bEN_N^QV\x03X \\mFRDNTOeDX\n\nEO\nE^_\nE\nD\\B^MW)B\n\\^OeNDENDYeEY\x0b\x0bj]\x0b]^NYXENi\x00OS\x00NE\x00\x00UEnOONEO\x00\x00FRDYN_\x0b\x0cJ\x0bJNN\x0b@\x0bDXOE\n\x03\x03VO\rECDZ_G\x03\nZN_XZY\\MCXO]\nO\nEYND\x03VSDNBEGN\x0bG^_\x0bY!LF[D]^B\x0bN\\\x0bNNcAg\x00EN\x00\x00WGEONTAI\x00DRNGX[D]^B\x0b\x0bEXEJYE\x0b]^D\x0b\nBFFLD\nKD\nCOSMPU)H\n\x03KV\x03)BBB\x03GW)Z\x03FK^N!E\x0bJE\x0bCGNDBNHEEJNC\x0b\x0bR\\GEnY*\x00\x00EAUE*\x00\x00\x00NM\x00GIAOU^LLBJC\x0bLRNGJOR!\x0bDd_Lc)UZMtm\x03OF\x03L\x03GLDUBD\x03DZFOBBUFULVEBH_\x0c!YYERGN!DNONL]JL\x0bDFRJ\\BSx\x00\x00GETOOD)PQVZOE*OEDE!BFBDIN\x0cDJJJ_NNE__JD@!RX_SE_\x06EOBOdCXO\nO\ndOXYKMODDX_JD@NRFL\x0bDE\x07EEDDD^EN\x0bG\x0ceDYeJLEdNRRUGUOL\x03TFSLPW\x03N\x00\x07URNDGGeDYeJLC\x03_]DNOD\x0bMrEDF\x0b_E\x0bD\x0b\x0b^RNDGGDDBDFJ\\\\NAEYD\x0bC]oEYFE_\x0b\x0bD\x0b\x0bD\x02E[GHDD^\x0b\x0b_X\x00As\x00Qm\x03LUFMQNMW\x03OM\x03dGANEX__NR\x0b\x0bNF\x0b\x0bR^Ye\x0bD]N\\N^E\x0cY\x0bXELC\x0bE\x0bDE\x0bN\x0b\x0bXNE\x0b\x0bR^E\x03E\x0b!\x02N\x0b^!!\\\x0b]\x07LJED\x0bNE\x0bN\x0b\x0bXNE\x0bEGEMLZW\x03JE*\x04BHAFUZDUMJ\nEN\x00XR\x0c\x0bEDL\x0bNNJECNERj!\x0bJYIL][L]EBbLDLR\x0b]_L\\NE\x0bOFD\x0bNERJ!\x0bJYILDC\x0b]\x0bC!\x0bN\\N@E!INJE\x00DAOoFMZBw\x00N\x03QZBDVIOZE\x03jnE\x00U*ON!E\x0bOJDN\x0b\x0bGBNGJ\x0b@\x0bRY^JDRb\x0b\x0beR\x0bG!ON!Y\x0b\\!X\x0cLYEEY\x0b!DI\x0bRYBJLRJ\x0b\x0beR\x0bGXLCL\x0bEOOn\x00KoLGWF*LF\x03LQDAGYBOSJVLAYTOELT\x07^CYMN!OYNSEO\nDYO_\nS\x02E\x0bDN\x0b\x0bD]J_O_\x0b^_YDN!OYNRD]DDbEXDD\x0b\x0b^CXMEN]JTETNUTRO\x00*oB)SmTOMFLLFF\x03MBWQmNRVATETNSn\x00N*y\x00OU\x00tGV\x03\x00DEFV\x03FBLRnNRR\x00iENN\x00OSHNI\x00LK\x00*UO\x00\x00D\x00FV\x03FKL\x00\nQ\x03\x03PEA\x00\x00\x00NY\x00AGTLd\x00NVW\x03\x03D\x03zLDFVWSZV\x00IAEN\x00V\x00NR\x00\x00GVLN\x00MUWLQF\x00TNQLD\x03\x00U**RAON\x00VYNR\x00\x00GVEUUGE\x00N\x0cAA\x00EBM\x03B\x03UE*\x03BFM\x00VYT\x0c\x00EUE\x00\x07AaEMDD\x03BBVOM\x03BMVF)\x03BF\x03\x03W\x03BKGM)j\x03UWM\x03mDDUBDVMM\x03BM\x03VK\x03FF\x03\x03ZNOLWLT@JU)MBmADUBDVME\x0fM)VMDABB\x03JPQM\x03OLF@ZU)MBDBNIyD\x03EFjLFGLKF\x03LNJMQG\x03LLF@ZF)NMZV)VQLZKPmGQM\x03\x03F)LFJMQG\x03LF)W\x03D)WALZ)MLMFLEm\x03Qm\x03\x03F)LFFF\x03UBHBLFWMOQ\x03\x03F\x00e0\x0b\x05\x06\x1a/T\x17*\x00T\x00A*A\x04I*H?Zd,\x00\x01\x04K\x07O\x1a\x11\x00?\x0b)\x18\x0e\r*.\x1an\x07\x1b\x01\x11\x16^CB\x12\x00\x04K\x05\x16\x02\x1d\x05TKO\x1d\x02\x0fe", b'\x19\x06\x16\x1fTJ\x10H\x05\x0f\x11bD\x06\r\x18\x1b', b'\x02zLGJn\x10LLY]9\x05PN\x1d;\x1dL\rZh6FA\x12\x05XR0\x0c\x11\x1e\x1c\x0f', b'\x01U\x0c\x17\x17']
skibidi TruthWell:
bop __init__(unc):
unc.flow = unc.stream()
bop stream(unc):
sauce = fetch()
cap = len(sauce)
pulse = 223
let him cook Aura:
pulse = 0x1337 + pulse - 223
let him cook pulse >= cap:
pulse = pulse - cap
pause ord(sauce[pulse])
bop clap(unc, ohio, frfr=Cooked):
drip = ''.join(chr(w ^ y) mewing w, y diddy zip(ohio, unc.flow))
chat is this real frfr:
its giving drip.encode()
its giving drip
bop snap(unc, ohio, toilet):
its giving bytes(x ^ y mewing x, y diddy zip(ohio, toilet))
bop fetch():
GOAT mmwt
GOAT d2s
hawk:
pookie mog(sys.argv[1]) ahh scroll:
its giving scroll.read()
tuah:
mmwt = f"nah bruh, usage: lowkey_sleigh.gyat <truth scroll> <password>"
d2s = "ight imma head out"
bop strat():
GOAT mmwt
GOAT d2s
GOAT sync_off
vibe = TruthWell()
mmwt = vibe.clap(vibe_check[1])
d2s = vibe.clap(vibe_check[3])
sync_off = vibe.clap(vibe_check[0])
its giving vibe
bop reveal_the_drip(clap):
opener = clap.clap(b'Yooo Merry Skibidimas bestie, may your vibe be immaculate and your presents be absolutely goated pookie the sauce', frfr=Aura)
lock = clap.clap(sys.argv[2].encode(), frfr=Aura)
chat is this real clap.snap(opener, lock) != vibe_check[2]:
crashout
yap(sync_off)
chat is this real __name__ == "__main__":
hawk:
reveal_the_drip(strat())
tuah:
yap(mmwt)
spit on that thang:
yap(d2s)
I'm not too familiar with what this programming language is, but __init__ and __main__ quickly tell me it's based on Python. My first instinct is to replace every keyword with the Python equivalent. Clearly skibidi is class, bop is def, and let him cook is while. I use my Python knowledge to convert the script until it’s runnable:
import sys
vibe_check = [b",OU\x08\x1dL\n\x0cGHO\x02\t\x11D\x1cO\x19\x1d\x16\x0e\x1cyHR\x03\x0b\t\x04AO\x0b\x06\x15N\x18IB\x10\x1a^G\x00\nV\x02\x15\x15ZdUTRO\x00*EA*PnTONEOOEE\x00NATRnNRVATETNSn\x00N*y\x00OU\x00wDU\x00\x00DEEU\x00EALRnNYY\x0bbNEE\x00OSHNI\x00LK\x00*UO\x00\x00D\x00_O\x1aEAL\x1a\x1aH\x00\x00SEA\x00\x00\x00dY\x00AGTLN\x00MUT\x00\x00D\x00yOGEUTPYV\x00IAEN\x00V\x00NR\x00\x00GVLN\x00MUTORE\x00TNROG\x00\x00U*!YJDE\x0b]REY\x0b\x0bGVEUUGE\x00N\x0c[[\x1a_XT\x1a[\rX_0\x1a[EN\x00VYT\x0c*EUE\x00\x07AKEMGG\x00AAULN\x00ANUE*\x00AE\x00\x00T\x00AHDN*i\x00VTN\x00nGGVAGUNN\x00AN\x00UC\x0bNN\x0b\x0bRFGD_D\\HB]!NAnBGV[]OT\\\x16T0OT]X[[\x1aSIHT\x00LOoCYV*NAnBNIyG\x00FEiOEDOHE\x00OMINRD\x00OOECYE*MNYU*UROYHSnDRN\x00\x0bN!DNBEYO\x0bDN ^\nL!_IDR*@A@KAHt\x1aHt\x1a\x1a_0U___\x1aL[KAOE~NLR\x00\x00E*OTNAOYn\x00Rn\x00\x00OAFAE\x07nHRTNOHDG\x00\x07\x00OE\x00ORNAOY*oNnOOUJNYVCKY]K[UXOO\nO\x0bDN\x0bDHMKFK]G\x0eI\x1aVHUNO\x1d\x1aCMO_\\OEDD*EHOO\x00FONEMNTD\x00NGSWOVUT\x00TWUERSHSVJwRU\x00\x00V\x07N\x00ENLHBNRSNAX[Z\x0eZJ\\\x0e\\Z\x0e\x0eEW$KH\x0b^\\!C\x0eK@\x0eFO@\\]@U\x1aNON\x1a_C\x1a[_iRY\x00\x00*EEU\x00*D\x00EN\x00HA\x00EAE\x00E\x00\x00NNHG\x00EAALYL\x00\x00EUU\x00*DKG*\x00W\x00V*GR@WMX@I\x0eI@K\x0eOIWB\x0e\x0e\\[Z@O\x1d!XO\x0eL\x0e\x0e$GKAK_LT]L]T_\x1a[]B\t\x07\x0cNmE\x00YA*AYUwO\x00*UE*EAVNGVGVTIW\x00NTD\x00OEUAHKTY\x00UNOA*UE*KOJ@\x0e@EZ$YK]YI]@\x0e\\@OIEOW[[@AOK\x06G$W\x0e\x0eItT\x1a\x1dXU\x1dtU]LNNRnkGKAYU\x00VTVRHA\x00YLEYIOEL\x00OOnCGVNNRnTYWA\x00SOD\x00NRN\x0cO@\x0eAWGA\\B\x0eAA`M\x0eA\tG\x0e$KAJKKgA\\Y@J\x1a\x0eAK\x1aACSU_G\x0bENN_NHO\x1aR*VnoOOEIRnNR\x00\x00OE\x00OTU\x00O\x00NVHTGT*A\x00WUDnEONEORnNR\x00\x00aV\x0eX[K\\]@@Y\x1aAI\x1aT_\x1a\x1aO_`AA@KA\x0e\x0eH\\AYO_\x0b\rK\x0bJNN\nA\x0bDXYT\x1a\x1a\x1aOE\x07OIeGUD\x00\x00GDURPSVGIREW\x00E\x00OSDN\x00UPNEINLE\x00LUT\x00R*GMPOX[G\x0eKM\x1a_@G[}\x1a_T\x1a\x1aM]_UTNOG\x0eJ\\@I]JULOS\x1a\x1dEXS[HT\x1aLOU\x1a\x1a[__UN\x00kN\x00HRNGSV*K\t\x00HU\x00*AAA\x00DT*Y\x00EAUE*N\x00AN\x00HLEOIEC@@OKF\x0e\x1aCMV_YT'\x1d\r_[O_0\x1a\x1a\x1a@C\x1a]GOA[[]]S[R\x1aZRNQ[^C0\x1aUuN]s0LCNwD\x00LE\x00O\x00DOGVAG\x00GYELAAVEVOUOHCT\x07*RRNYLE*OEDEIXOI\x0eAWC[MSIH\x1a\x1a]_YBBC0^_XDB_0UKJK$SWSUXH\x1aDJ\\LNHHTNN[BF0CHUYeU\x0cOEHEnIRE\x00E\x00nERSAGENNRTAOKEYMG\x00ON\x0cNNOOOU@K\x0eB\t`A\\`OIK@@\\HXI[AU\rM_JUIN\x1aT\x1a\t[WKUVVtUOeJZR\x12NLU_^U\x1a\\cNOM\x00~N\x00O\x00\x00UYEOLLOOIOMAWWEJNRO\x00HUgMQNMW\x03\x00O\x00\x00O\tN^BMAA[\x0e\x0eZ]\x0eOW\x0e\\t\rB[HC_C@Z\x0eBT\x1a}^[@K]ZN_C\x1a\x1dNF\x1d\x1aCOHt\x1aUL_M_UN\x07R*SNGH\x00N\x00ON\x00E\x00\x00SEN\x00\x00YUN\x08N\x00*\tF\x03V))T\x03K\x02IONO\x00EN\x0eK\x0e\x0e]K@\x0eKIKiAWZ\x0eSH0\x1dOELKX^IXTS\x0eK@\x0e]W\x1d\x1aTRL\x0bXXKMCNED{0\x1a[RBGVzGVNIiGOGY\x00VTGWEN\x00DMO\x00ENYA*\nBQADLR\x0eX\x1dB \nEWKE@$LKO@\x0eJOAKK@W[m\x1aW\x1a\\WOI[GAWH\x0eg`K\x0e[$^_0S\x1aJORF\x03\x03OJFA[\x1aQ\x00YRUkOYi\x00\x00nY\x00L*DE*R\x00W*S\x07GRNNR\x00*OB\x00ZQSO]RK\n\ndS\x0bB]IFI\x0eKAA`\x0eEKAJZK$AK\x0eA\\JOIWOB^G[BOWZDNF^\r_E\\HN)GQFZEO\nEQGV\x03s\x08N\x00OE\x00\x00OVATDT\x00UTROE*DREYOVOOiOR@@\x1d\n_CXMDHXOZKZ@[Z\\A\x0e$KO$^`ZA@KAAKK\x0e@OZ\\`@\\X[^O^DYd\nD0w\x1aEV\x03tGV\x03\x03GFFV\x03oALRnNRR\x00iENN\x00OSHNI\x00LK\x00*UO\x00\x00D\x00EU\x00EAL\n\nX\n\n^KO\x0e\x0e\x0e@W\x0eOIZB@\x0eC[Z\x0e\x0eJ\x0ewAIK[Z^WX\x0eGOKC\n\\\nDX\n\nM]VS\x0bF^_DYN\x0b_EYDG*\x00U**RAON\x00VYNR\x00\x00GVEUUGE\x00N\x0cAA\x00EBN\x00A\x00UE*\nKOD\x1aXWZ\x02\x0eK[K\x0e\tOEKCII\x0eOO[B@\x0eO@[K$\x0eOK\x0e\x0eY\nKBND b\x0b]_E\x0beLL]JL^EE\x0bJN*UH\x00EE\x00\x00YMLOTOWCIV*NAnBGVAGUNF\x0cN*UNGBAA\x00IYO@\x0eBAKMWX$@O`L@GwI\x0eHKgAKJAFK\x0eACG@\\O\nEENHRN!FER^!^YDRCXeOYE\x00*E*OEINRD\x00OE*T\x00G*TBOY*NONEOFn\x00Rn\x00\x00E*OEEE\x00VAAKR_N@V\\\x0e\x0eK$AZ@OAW`\x0e\\`\x0e\x0eAOHOK\t`FO_EDCOL\x0b\x0c\x0bDN\x0bDYEJDR!dEeDDUkEDLMEWSEUOEDD\x00E\x00OE\x00ORCEHESI\x00G\x00LROTU\x07\x00YWUEREONN\nOBRA\x0eHA@KC@ZJ\x0e@INJUX[Z\x0eZZ^OXXCX]A|Y^\x0b\x0b]\x0cE\x0bNEGCIEYXEDV\x7fT\x00TDR\x00RT\x00\x00KY*EE\x00UT)M\x03FM\x03KBMQPML\x03WVW\x03FZ\x03AEgXS\n\n\nOO_\r$J\x0eK@\x0eFO\x0eKOX\nO\n\nDDBM\x03FBKGRG\x0b\x0bN^^\x0b!O@L!\x0b\\\x0b]!LYERHVdG\x00GNE\x00AGYL\x00\x00RUTNU\x03)AB\x03A\x03\x03)JFLFFUMDUDMF\x03BDL\x03\x04\x06DMO\nSK![W[yA\x0e$[H OK\\DM\\M\\^JT\x03D_O\x0bDN^JC@_R\x0b^EDJ!^N!NJOE\x00dKT*WESWGSN\x00RNAGKAYUUEEJN\x03B!R\x0b\x0bXdE\x0b\x0bID\rmLDUNMQmKMAJS_\n\\^]OCK\nSFOSCEOF\nEEm@D\\EEYe_R\\J\x0bXDO\x0bEYE\x07DE\x0bDRBDRf\x00OOnC\x00O\x07I\x00*EODEEiORWE[\x0b\x0bDN\x0bDRBDYG\x0bEN_N^QV\x03X \\mFRDNTOeDX\n\nEO\nE^_\nE\nD\\B^MW)B\n\\^OeNDENDYeEY\x0b\x0bj]\x0b]^NYXENi\x00OS\x00NE\x00\x00UEnOONEO\x00\x00FRDYN_\x0b\x0cJ\x0bJNN\x0b@\x0bDXOE\n\x03\x03VO\rECDZ_G\x03\nZN_XZY\\MCXO]\nO\nEYND\x03VSDNBEGN\x0bG^_\x0bY!LF[D]^B\x0bN\\\x0bNNcAg\x00EN\x00\x00WGEONTAI\x00DRNGX[D]^B\x0b\x0bEXEJYE\x0b]^D\x0b\nBFFLD\nKD\nCOSMPU)H\n\x03KV\x03)BBB\x03GW)Z\x03FK^N!E\x0bJE\x0bCGNDBNHEEJNC\x0b\x0bR\\GEnY*\x00\x00EAUE*\x00\x00\x00NM\x00GIAOU^LLBJC\x0bLRNGJOR!\x0bDd_Lc)UZMtm\x03OF\x03L\x03GLDUBD\x03DZFOBBUFULVEBH_\x0c!YYERGN!DNONL]JL\x0bDFRJ\\BSx\x00\x00GETOOD)PQVZOE*OEDE!BFBDIN\x0cDJJJ_NNE__JD@!RX_SE_\x06EOBOdCXO\nO\ndOXYKMODDX_JD@NRFL\x0bDE\x07EEDDD^EN\x0bG\x0ceDYeJLEdNRRUGUOL\x03TFSLPW\x03N\x00\x07URNDGGeDYeJLC\x03_]DNOD\x0bMrEDF\x0b_E\x0bD\x0b\x0b^RNDGGDDBDFJ\\\\NAEYD\x0bC]oEYFE_\x0b\x0bD\x0b\x0bD\x02E[GHDD^\x0b\x0b_X\x00As\x00Qm\x03LUFMQNMW\x03OM\x03dGANEX__NR\x0b\x0bNF\x0b\x0bR^Ye\x0bD]N\\N^E\x0cY\x0bXELC\x0bE\x0bDE\x0bN\x0b\x0bXNE\x0b\x0bR^E\x03E\x0b!\x02N\x0b^!!\\\x0b]\x07LJED\x0bNE\x0bN\x0b\x0bXNE\x0bEGEMLZW\x03JE*\x04BHAFUZDUMJ\nEN\x00XR\x0c\x0bEDL\x0bNNJECNERj!\x0bJYIL][L]EBbLDLR\x0b]_L\\NE\x0bOFD\x0bNERJ!\x0bJYILDC\x0b]\x0bC!\x0bN\\N@E!INJE\x00DAOoFMZBw\x00N\x03QZBDVIOZE\x03jnE\x00U*ON!E\x0bOJDN\x0b\x0bGBNGJ\x0b@\x0bRY^JDRb\x0b\x0beR\x0bG!ON!Y\x0b\\!X\x0cLYEEY\x0b!DI\x0bRYBJLRJ\x0b\x0beR\x0bGXLCL\x0bEOOn\x00KoLGWF*LF\x03LQDAGYBOSJVLAYTOELT\x07^CYMN!OYNSEO\nDYO_\nS\x02E\x0bDN\x0b\x0bD]J_O_\x0b^_YDN!OYNRD]DDbEXDD\x0b\x0b^CXMEN]JTETNUTRO\x00*oB)SmTOMFLLFF\x03MBWQmNRVATETNSn\x00N*y\x00OU\x00tGV\x03\x00DEFV\x03FBLRnNRR\x00iENN\x00OSHNI\x00LK\x00*UO\x00\x00D\x00FV\x03FKL\x00\nQ\x03\x03PEA\x00\x00\x00NY\x00AGTLd\x00NVW\x03\x03D\x03zLDFVWSZV\x00IAEN\x00V\x00NR\x00\x00GVLN\x00MUWLQF\x00TNQLD\x03\x00U**RAON\x00VYNR\x00\x00GVEUUGE\x00N\x0cAA\x00EBM\x03B\x03UE*\x03BFM\x00VYT\x0c\x00EUE\x00\x07AaEMDD\x03BBVOM\x03BMVF)\x03BF\x03\x03W\x03BKGM)j\x03UWM\x03mDDUBDVMM\x03BM\x03VK\x03FF\x03\x03ZNOLWLT@JU)MBmADUBDVME\x0fM)VMDABB\x03JPQM\x03OLF@ZU)MBDBNIyD\x03EFjLFGLKF\x03LNJMQG\x03LLF@ZF)NMZV)VQLZKPmGQM\x03\x03F)LFJMQG\x03LF)W\x03D)WALZ)MLMFLEm\x03Qm\x03\x03F)LFFF\x03UBHBLFWMOQ\x03\x03F\x00e0\x0b\x05\x06\x1a/T\x17*\x00T\x00A*A\x04I*H?Zd,\x00\x01\x04K\x07O\x1a\x11\x00?\x0b)\x18\x0e\r*.\x1an\x07\x1b\x01\x11\x16^CB\x12\x00\x04K\x05\x16\x02\x1d\x05TKO\x1d\x02\x0fe",
b'\x19\x06\x16\x1fTJ\x10H\x05\x0f\x11bD\x06\r\x18\x1b',
b'\x02zLGJn\x10LLY]9\x05PN\x1d;\x1dL\rZh6FA\x12\x05XR0\x0c\x11\x1e\x1c\x0f',
b'\x01U\x0c\x17\x17'
]
class TruthWell:
def __init__(self):
self.flow = self.stream()
def stream(self):
sauce = fetch()
sauce_len = len(sauce)
pulse = 223
while True:
pulse = 0x1337 + pulse - 223
while pulse >= sauce_len:
pulse = pulse - sauce_len
yield ord(sauce[pulse])
def clap(self, ohio, return_as_bytes=False):
drip = ''.join(chr(w ^ y) for w, y in zip(ohio, self.flow))
if return_as_bytes:
return drip.encode()
return drip
def snap(self, ohio, toilet):
return bytes(x ^ y for x, y in zip(ohio, toilet))
def fetch():
global error_message
global d2s
try:
with open(sys.argv[1]) as scroll:
return scroll.read()
except:
error_message = f"nah bruh, usage: lowkey_sleigh.gyat <truth scroll> <password>"
d2s = "ight imma head out"
def strat():
global error_message
global d2s
global sync_off
vibe = TruthWell()
error_message = vibe.clap(vibe_check[1])
d2s = vibe.clap(vibe_check[3])
sync_off = vibe.clap(vibe_check[0])
return vibe
def reveal_the_drip(truthwell):
opener = truthwell.clap(b'Yooo Merry Skibidimas bestie, may your vibe be immaculate and your presents be absolutely goated with pookie sauce', return_as_bytes=True)
lock = truthwell.clap(sys.argv[2].encode(), return_as_bytes=True)
if truthwell.snap(opener, lock) != vibe_check[2]:
raise
print(sync_off)
if __name__ == "__main__":
try:
reveal_the_drip(strat())
except:
print(error_message)
finally:
print(d2s)At this stage, we spend some time understanding the code. We’re interested in the reveal_the_drip function, particularly the if truthwell.snap(opener, lock) != vibe_check[2] check. We know that opener and vibe_check[2] are statically defined in the file, but lock is unknown since it’s derived from the input password, which we don’t have. snap is simply a function that XORs two byte arrays. Therefore, we can work out what lock should be by XORing the opener and vibe_check[2] byte arrays. This gives us the original value of lock.
However, we want to know what the original sys.argv[2] (the password) was. Luckily, the clap function simply XORs our input against a truth scroll file which, in this case, is the oracle file containing the lyrics to Rick Astley’s Never Gonna Give You Up. So, if we XOR our clapped_lock against the same bytes from the stream that were used to create the lock in the first place, we get the original plaintext_password. This can be done by commenting out the lock = truthwell.clap() call and making our own clap() call that takes clapped_lock as input.
Now, at this stage I ran into an annoying issue where the string used in my opener was incorrect. This happened because I’d replaced the words Skibidi, goat, and pookie with their Python equivalents. It turns out I should only replace pookie, since it’s the only one completely surrounded by whitespace. I later discovered that the pygyat tool behaves this way as well when converting gyat files into Python files.
After fixing my opener string, I’m left with my modified reveal_the_drip function:
def reveal_the_drip(truthwell):
opener = truthwell.clap(b'Yooo Merry Skibidimas bestie, may your vibe be immaculate and your presents be absolutely goated with the sauce', return_as_bytes=True)
#lock = truthwell.clap(sys.argv[2].encode(), return_as_bytes=True)
# Calculate lock
clapped_lock = bytes(x ^ y for x, y in zip(opener, vibe_check[2]))
lock = clapped_lock
# Compute plaintext password by xoring clapped_lock with the
# same chars in stream that made the lock originally
# This works because we commented out the original clap() call above
plaintext_password = truthwell.clap(clapped_lock, return_as_bytes=True)
print(plaintext_password)
if truthwell.snap(opener, lock) != vibe_check[2]:
raise
print(sync_off)Running my script with the above modifications displays some beautiful ASCII art alongside the daily flag:

Flag:
FV25{pygyat_s4ys_h3ll0_f3ll0w_k1ds}