Pour ce challenge, nous devions dans un premier rÊpondre à 4 "Ênigmes" donnant les diffÊrentes règles à implÊmenter dans notre script :
Après avoir rÊpondu à toutes les règles pas simples à comprendre pour un ÃĒtre humain (normalement constituÊ đ), nous pouvons les donner à un outil tel que Copilot afin qu'il nous aide à crÊer le bon code.
Pour ce faire, nous commençons par une base de pwntool pour rÊcupÊrer et renvoyer les rÊponses puis ensuite gÊnÊrer des fonctions pour chaque règle.
Voici donc le code utilisÊ pour ce challenge :
from pwn import*n =remote("challenges.404ctf.fr",30980)voyelles ="aeiouyAEIOUY"consonnes ="bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ"alphabet ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"defisvoy(letter):if(letter in voyelles):return1return0defnb_consonnes(str1): res =0for i in str1:if(i in consonnes): res +=1return resdeffind_prev_voy(letter): ind = alphabet.index(letter)for i inrange(ind -1,-1,-1):if(alphabet[i]in voyelles):return alphabet[i]defsort_word(word): char_counts ={}for char in word: char_counts[char]= char_counts.get(char, 0)+1 sorted_word =sorted(word, key=lambdachar: (-char_counts[char], ord(char)))return''.join(sorted_word)defrule1(str1): str1 ="".join([chr(i) for i inreversed(str1)])return str1defrule2(res): longueur =len(res)if longueur %2==0: moitie = longueur //2 partie1 = res[:moitie] partie2 = res[moitie:] mot_modifie = partie2 + partie1else: lettre_centrale = longueur //2 mot_modifie = res.replace(res[lettre_centrale], "")return mot_modifiedefrule3(t): gg = t.decode() gg = [ord(i)for i in gg] gg =rule1(gg) gg =rule2(gg)print(gg)if(len(gg)>=3):if(gg[2]in consonnes): voy = [] t =list(t.decode()) r =list(t)for i in r:if(i in voyelles): voy.append(i) voy.insert(len(voy),voy[0]) voy = voy[1:] ind =0for i inrange(0,len(t)):if(t[i]in voyelles): r[i]= voy[ind %len(voy)] ind +=1 r = [ord(i)for i in r] r =rule1(r) r =rule2(r)return relse: voy = [] t =list(t.decode()) r =list(t)for i in r:if(i in voyelles): voy.append(i) voy.insert(0,voy[len(voy)-1]) voy = voy[:len(voy)-1] ind =0for i inrange(0,len(t)):if(t[i]in voyelles): r[i]= voy[ind %len(voy)] ind +=1 r = [ord(i)for i in r] r =rule1(r) r =rule2(r)return relse:return ggdefrule4(t): r =list(t) i =0while(i !=len(r)):if(r[i]in consonnes): vp =ord(find_prev_voy(r[i])) s =0for j inrange(i-1,-1,-1): s +=ord(r[j])*2**(i-j) *isvoy(r[j]) a = ((vp + s) %95) +32 r.insert(i+1,chr(a)) i +=1return rfor i inrange(100): t = n.recv() tt = tprint(t.decode("utf-8"))if(i ==0): n.sendline(b"cosette")if(i ==1): n.sendline(b"ettesoc")if(i ==2): t = t[t.index(b"e : ")+5:] t = t[:t.index(b"}\n>>")] t =rule1(t) t =rule2(t) n.sendline(t.encode())if(i ==3): t = t[t.index(b"e : {")+5:] t = t[:t.index(b"}\n>>")] t =rule3(t) n.sendline(t.encode())if(i ==4): t = t[t.index(b"e : {")+5:] t = t[:t.index(b"}\n>>")] r =rule3(t) r ="".join(rule4(r)) r =sort_word(r) n.sendline(r.encode())print(r)if(i ==5):#t = t.decode("utf-8") t = t[t.index(b"Entr")+11:] t = t[:t.index(b"}")] t = t.split(b" ") res =""print(t,len(t)) c =0for i in t: r =rule3(i) r ="".join(rule4(r)) r =sort_word(r) res += r +" " c +=1print(c)print(res) res = res[:len(res)-1] n.sendline(res.encode())
Une fois lancer, le script va rÊpondre à toutes les questions du bot et nous renvoyer le flag à la fin :
Ce challenge n'Êtait pas le plus simple Êtant donnÊ la "complexitÊ" des règles à respecter.