Pour ce challenge, nous devions dans un premier rÊpondre à 4 "Ênigmes" donnant les diffÊrentes règles à implÊmenter dans notre script :
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.
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.