Writeups
  • ℹ️Infos
  • 🗓️2021
    • DvCTF (to join DaVinciCode)
      • Crypto
        • Baby RSA
        • Ressaye
        • Unbreakable encryption
      • Forensics
        • Broken Portrait
        • Russian Dolls
        • Sus USB
      • Misc
        • Jus de Flag
        • Welcome
      • OSINT
        • Absolutely Nuts
      • Progra
        • Snoop's Mission
      • Reverse
        • Baby Reverse
        • Basic Cracking
        • Code Pyn
      • Steganography
        • Colorful Code
        • Hurt Your Eyes
        • Orchestra of Flags
        • Tyger
      • Web
        • Have I Been Pwned
        • What's Up ?
  • 🗓️2022
    • DvCTF 2022
      • Crypto
        • Cwryptographic Owacle
        • Secure Or Not Secure
        • small weiner
      • Forensics
        • Very Bad Script
      • Misc
        • Data Leak
        • Going postal
        • The Hacker Man
      • OSINT
        • Elon Musk
        • Monkeey
        • Painting Spot
        • Welcome to the DaVinciCTF!
      • Pentest
        • DaVinci's Playlist : Part 1
        • DaVinci's Playlist : Part 2.5
        • DaVinci's Playlist : Part 2
      • Programming
        • Heaven's Gate
        • Sudoku
        • TicTacToe
      • Reverse
        • CryptoVault
        • Mine Game
        • Obfuscated
        • Peripheral Interface Controller XVI
      • Steganography
        • ICMP
        • The Arts of Details
        • Treasure
      • Warmup
        • EBG13
        • FrenchFlag
        • MP3
        • QmFzZTY0
        • RSA
        • Welcome
      • Web
        • CyberStreak v1.0
        • 🎵
    • picoCTF 2022
      • Challs WU
    • @HackDay - Qualifications
      • Crypto
        • Francis Bacon
        • Francs Maçons
        • Rotate-me!
        • Un message codé ?
      • Forensics
        • bad_timing_for_reversing
      • Hardware
        • Cubik'cipher
        • WebSDR
      • Reverse
        • Calling Conventions
        • Memory Investigation
      • Steganography
        • I can make pictures
        • J'ai perdu le flag :(
        • Pokémons
        • Un coup de maître
        • Un logo cachotier
      • Web
        • GIT!
        • Part. 1 - Uploads
        • Part. 2 - Old md5
        • Part. 3 - sudo python
    • 404CTF
      • Crypto
        • Un simple oracle [1/2]
        • Un simple oracle [2/2]
      • Misc
        • Je suis une théière
        • Pierre-papier-Hallebarde
        • GoGOLFplex
      • OSINT
        • À l'aube d'un échange
        • Collaborateur suspect
        • Equipement désuet
      • Reverse
        • Mot de passe ?
      • Steganography
        • La plume à la main
        • PNG : Un logo obèse [1/4]
        • PNG : Drôles de chimères [2/4]
        • Toujours obèse [3/4]
      • Web
        • Fiché JS
        • Le braquage
        • Du gâteau
        • En construction !
    • Operation Kernel
      • Crypto
        • Scytale
      • Forensics
        • Research Paper
        • Excel Confidential
      • Reverse
        • CryptoLocker
        • What_If_CryptoLocker
      • Social Engineering
        • Pour vivre secure vivons caché
        • Pour vivre secure vivons caché Part 2
      • Stegano
        • AudioSpectre
        • Datacenter
        • Takazume
      • WEB
        • Research paper blog
        • SQL Project 1
        • SQL Project 2
        • SQL Project 3
        • Tenue de soirée requise
  • 🗓️2023
    • 404CTF 2023
      • Résultats
      • Analyse forensique
        • Pêche au livre
        • Le Mystère du roman d'amour
        • Les Mystères du cluster de la Comtesse de Ségur [1/2]
        • Lettres volatiles
        • Note de bas de page
      • Cloud
        • Le Sot
        • Le Cluster de Madame Bovary
        • Harpagon et le magot
        • Les nuages menaçants 1/3
        • Les nuages menaçants 2/3
      • Cryptanalyse
        • Recette
        • ASCON Marchombre
      • Divers
        • Bienvenue
        • Exemple de connexion à distance
        • Discord
        • À vos plumes !
      • Exploitation de binaires
        • Je veux la lune !
      • Programmation
        • L'Inondation
        • Des mots, des mots, des mots
      • Radio-Fréquence
        • Navi
        • Avez-vous vu les cascades du hérisson ?
        • Le Plombier du câble
        • Ballistic Missile Submarine
      • Renseignement en sources ouvertes
        • Le Tour de France
        • Les OSINTables [1/3]
        • Un vol ?
        • L'âme d'un poète et le coeur d'une femme [1/4]
        • L'âme d'un poète et le coeur d'une femme [2/4]
        • L'âme d'un poète et le coeur d'une femme [3/4]
        • L'âme d'un poète et le coeur d'une femme [4/4]
      • Rétro Ingénierie
        • Le Divin Crackme
        • L'Inspiration en images
      • Sécurité Matérielle
        • Un courrier suspect
        • Un réveil difficile
      • Stéganographie
        • Odobenus Rosmarus
        • L'Œuvre
        • Les Félicitations
        • En Profondeur
        • Le Rouge et le vert, avec un soupçon de bleu
      • Web
        • Le Loup et le renard
        • L'Académie du détail
        • La Vie Française
        • Fuite en 1791
        • L'Épistolaire moderne
        • Chanson d'Inde
      • Web3
        • Art
        • L'Antiquaire, tête en l'air
Powered by GitBook
On this page

Was this helpful?

  1. 2023
  2. 404CTF 2023
  3. Programmation

Des mots, des mots, des mots

PreviousL'InondationNextRadio-Fréquence

Last updated 1 year ago

Was this helpful?

Catégorie: Programmation - Difficulté: Difficile

Description:

Netcat : nc challenges.404ctf.fr 30980

Solution:

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"

def isvoy(letter):
		if(letter in voyelles):
			return 1
		return 0

def nb_consonnes(str1):
	res = 0
	for i in str1:
		if(i in consonnes):
			res += 1
	return res

def find_prev_voy(letter):
	ind = alphabet.index(letter)
	for i in range(ind - 1,-1,-1):
		if(alphabet[i] in voyelles):
			return alphabet[i]

def sort_word(word):
    char_counts = {}
    for char in word:
        char_counts[char] = char_counts.get(char, 0) + 1    
    sorted_word = sorted(word, key=lambda char: (-char_counts[char], ord(char)))
    return ''.join(sorted_word)


def rule1(str1):
	str1 = "".join([chr(i) for i in reversed(str1)])
	return str1

def rule2(res):
    longueur = len(res)
    if longueur % 2 == 0:
        moitie = longueur // 2
        partie1 = res[:moitie]
        partie2 = res[moitie:]
        mot_modifie = partie2 + partie1
    else: 
        lettre_centrale = longueur // 2
        mot_modifie = res.replace(res[lettre_centrale], "") 
    return mot_modifie

def rule3(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 = 0
			for i in range(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 r
		else:
			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 = 0
			for i in range(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 r
	else:
		return gg
def rule4(t):
	r = list(t)
	i = 0
	while(i != len(r)):
		if(r[i] in consonnes):
			vp = ord(find_prev_voy(r[i]))
			s = 0
			for j in range(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 += 1
	return r

for i in range(100):
	t = n.recv()
	tt = t
	print(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 = 0
		for i in t:
			r = rule3(i)
			r = "".join(rule4(r))
			r = sort_word(r)
			res += r + " "
			c += 1
		print(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.

🚩 FLAG
404CTF{:T]cdeikm_)W_doprsu_nt_;adei}

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.

🗓️
😂