ThaySan
  • 👋Bienvenue
    • Avant-propos
  • 🚩CTF & Writeups
    • 2025 | EC2
      • Let's Crax
    • 2025 | HackDay
      • 🔑Cryptographie
        • Drunk Christmas
        • Find Eve 1
        • Well hidden message - Standard Code Encryption
      • 🔎Forensic
        • Copperwire Extraction
        • Distracted user
        • I believe you can't fly
      • 🧠Misc
        • Hello Steve
      • 💾Programmation
        • Lonely bot
        • Lonely bot #2
        • Lonely bot #3
        • Useless Animals Sorting
        • Who cares about SSI anyway ?
      • ⚙️Reverse
        • Just dig
        • Rusty_rev
        • The Cogs of Blackmail
      • 🎭Steganographie
        • It says a lot when there is no music
        • Mona LSB
        • Well hidden message - Insignificant blue
      • 🌐Web
        • Super Website Verificator 3000
        • The analytical engine leak
        • The Watchful Gears: Uncover the Secrets Within
        • Your region's finest
    • 2024 | Efrei - CyberNight
      • 🔑Cryptographie
        • Clavier spécial
        • Le futur
        • Securechain 30.0
        • Cascade
        • Shared Flag
        • Weird Algorithm
      • 🧊Minecraft
        • Introduction
        • Non aux Bouquins Trafiqués
        • Redstone Gold Block
      • 💾Programmation
        • Captcha 1.0
        • Intro à la prog
        • Captcha 2.0
      • ⚙️Reverse
        • Reverse the Reverse
        • Find me if you can
        • HuGO Decrypt
        • Kitten eXORcism
        • M30W Vault Tech
        • The Ugandan Labyrinth
      • 🎭Stéganographie
        • Le message
        • bon Le ordre
        • COD FORFLAG
        • Mauvaise note
        • Bruit
        • Un (un ?) drôle de QR code
        • Randonnée Guillerette à Bordeaux
      • 💻Système
        • Marche-pied
        • Escabot
        • régulation des Données et des Normes de Sécurité
      • 🌐Web
        • cybernight.zip
        • Mon champion préféré
        • Co(mpressed)okies
        • Gitty Mistake
        • JWT Kiddo
        • Parseur Farceur
      • L'enquête
        • L'enquête 2/6
        • L'Enquête 1/6
        • Bienvenue, enquêteur
    • 2024 | Star-Hack
      • 🔑Cryptographie
        • César, mais pas César
        • Double ennui
        • Langage secret
        • Quadratique Mystérieuse
        • ReSultAt
        • Sup3r S3cr3t
        • Warmup
      • 🔎Forensic
        • Cache-cache
        • Fichier ZIP protégé par mot de passe
        • HEADER
        • Investigation 1
        • Investigation 2
      • 🧠Misc
        • B4l4d3 Urb41n3
        • Bruhh, c'est quoi ça ?
        • Cut13
        • Pika Pika
      • 😈Pwn
        • Pwn0x01
        • Pwn0x02
        • Pwn0x03
      • ⚙️Reverse
        • Assembly
        • Rev0x00
        • Rev0x01
        • Rev0x02
      • 🌐Web
        • Clone Udemy
        • Flask
        • Guess_The_Passcode
        • PHP
        • Tickets
        • Usine de Cookies
    • 2024 | ECW
      • 🔑Cryptographie
        • Course hipPIN
    • 2024 | CTFREI Intro
      • 🔑Cryptographie
        • AES Intro
        • Aléatoire
        • Game of Luck
        • RSA Intro
        • RSA2
        • RSA3
      • 🔎Forensic
        • Mais qui est le photographe ?
        • Mais où est passé mon flag ?
        • Mémoire 1/4
        • Mémoire 2/4
        • Mémoire 3/4
        • Mémoire 4/4
        • My computer is talking
      • 📚OSINT
        • Avion ✈
        • Geoint
        • Google!
        • Googlint
        • Le pivot
        • Le temps commence maintenant
        • Sacré dossier
        • Socint
      • 💾Programmation
        • Try Me
        • Answer Me
        • Eval Me
        • Time Based
      • 😈Pwn
        • BOF Intro
        • Shop
        • BOF 2
        • BOF win()
      • ⚙️Reverse
        • CrackMe1
        • CrackMe2
        • CrackMe3
        • Hidden...
        • Something changed?
        • ZZZ
      • 🎭Stéganographie
        • Cybernight être comme
        • Joli paysage
        • Petit poisson
        • StegHide 'n' Seek
        • Un canard pas comme les autres
      • 💻Système
        • Bash Jail
        • Bash Jail Revenge
        • BrokenBin
        • GTFO Of Here
        • Pyjail
        • Pyjail Revenge
        • Strange input, right?
      • 🌐Web
        • SQLi
        • POST This Money
        • Give me my Flask PIN
        • Access
        • Render
        • RenderV2
        • Touchy
    • 2024 | DefCamp
      • 🔑Cryptographie
        • conv
        • oracle-srl
        • ctr
      • 🔎Forensic
        • i-got-a-virus
        • Alternating
        • call-me-pliz
      • 🧠Misc
        • pyterm
      • 📱Mobile
        • mobisec
      • 📚OSINT
      • 😈Pwn
      • ⚙️Reverse
      • 🕵️Traque
      • 🌐Web
        • noogle
        • production-bay
    • 2024 | 404CTF
      • 🔑Cryptographie
        • Bébé nageur
        • Le petit bain
        • Poor Random Number Generator [1/2]
        • Plongeon Rapide Super Artistique
        • J'éponge donc j'essuie
        • Poor Random Number Generator [2/2]
        • La Seine
        • J'ai glissé chef !
        • SEA - La face cachée de l'Iceberg
      • 🔎Forensic
        • Le tir aux logs
        • Darts Bank
        • Vaut mieux sécuriser que guérir
        • De bons croissants au beurre
        • Poids Raw vs. Cours Jette [1/3]
      • 🔌Hardware
        • Serial killer
        • Le soulevé de GND
        • Comment est votre modulation ? [1/2]
        • Sea side channel [1/4] - Introduction
        • Comment est votre modulation ? [2/2]
        • Sea side channel [2/4] - Reconnaissance
        • Sea side channel [3/4] - Mais où sont les triggers ?
      • 🤖IA
        • Du poison [1/2]
        • Du poison [2/2]
        • Des portes dérobées
      • 🧠Misc
        • Discord
        • De la friture sur la ligne
        • Bienvenue
        • Revers(ibl)e Engineering [0/2]
      • 📚OSINT
        • Légende
        • Not on my watch
        • Secret Training [1/2]
      • 😈Pwn
        • Pseudoverflow
        • Jean Pile
        • Mordu du 100m
        • Antismash
      • 🐈‍⬛Quantique
        • Des trains superposés
        • De l'écoute, pas très discrète
        • De la multiplicité des problèmes
      • ⚙️Reverse
        • ⭐Échauffement
        • ⭐Intronisation du CHAUSSURE
        • ⭐Bugdroid Fight [1/2]
        • ⭐Revers(ibl)e Engineering [1/2]
        • ⭐Bugdroid Fight [2/2]
        • ⭐Nanocombattants
        • ⭐Revers(ibl)e Engineering [2/2]
        • Le Tableau Noir
      • 🎭Stéganographie
        • ⭐L'absence
        • ⭐Regarder en stéréo
        • ⭐La Barre Fixe
        • ⭐Le grand écart
        • ⭐La chute
      • 🌐Web
        • ⭐Vous êtes en RETARD
        • ⭐Le match du siècle [1/2]
        • ⭐Exploit mag
        • ⭐Le match du siècle [2/2]
        • ⭐LE GORFOU 42
        • ⭐La boutique officielle
    • 2024 | CTFREI - Bordeaux
      • 🔑Cryptographie
        • zzz
      • 📚OSINT
        • Alexis Dumas
        • Back to the bureau
        • Dr Octopus
        • Folie et ambition
        • GeoGuessr
        • Hugo Nelots : prélude
        • La fin ?
        • La fuite Dumas
        • Un réseau suspect
      • 💾Programmation
        • Eval me 1
        • Eval me 2
        • Time Based
      • 💻Système
        • Broken Binary 1
        • Broken Binary 2
        • GTFO of here
        • Pyjail 1
        • Pyjail 2
        • Pyjail 3
        • Pyjail 4
      • 🌐Web
        • Au commencement était le verb
        • Becadmin
        • PHP Juggler
    • 2024 | HTB - Cyber Apocalypse Challenges
      • 🔗Blockchain
        • Lucky Faucet
        • Recovery
        • Russian Roulette
      • 🔑Cryptographie
        • Blunt
        • Dynastic
        • Iced TEA
        • Makeshift
        • Primary Knowledge
      • 🔎Forensic
        • An unusual sighting
        • Data Siege
        • Fake Boost
        • Game Invitation
        • It Has Begun
        • Phreaky
        • Pursue The Tracks
        • Urgent
      • 🔌Hardware
        • BunnyPass
        • Flash-ing Logs
        • Maze
        • Rids
        • The PROM
      • 🧠Misc
        • Character
        • Cubicle Riddle
        • Path of Survival
        • Stop Drop and Roll
        • Unbreakable
        • Were Pickle Phreaks
        • Were Pickle Phreaks Revenge
      • 😈Pwn
        • Delulu
        • Pet Companion
        • Tutorial
        • Writing on the Wall
      • ⚙️Reverse
        • BoxCutter
        • Crushing
        • FollowThePath
        • LootStash
        • MazeOfPower
        • Metagaming
        • PackedAway
        • QuickScan
      • 🌐Web
        • Flag Command
        • KORP Terminal
        • Labyrinth Linguist
        • LockTalk
        • Testimonial
        • TimeKORP
    • 2024 | UNbreakable
      • 🔑Cryptographie
        • start-enc
        • traffic-e
      • 🔎Forensic
        • easy-hide
        • password-manager-is-a-must
      • 🧠Misc
        • rfc-meta
      • 📱Mobile
        • flagen
        • improper-configuration
      • 📡Network
        • wifi-basic
        • wifiland
      • 📚OSINT
        • persistent-reccon
        • safe-password
      • 😈Pwn
        • intro-to-assembly
      • ⚙️Reverse
        • fake-add
      • 🎭Stéganographie
        • secrets-of-winter
      • 🌐Web
        • pygment
        • sided-curl
        • you-can-trust-me
    • 2023 | EFREI - CyberNight
      • 📚OSINT
        • Invest Now !
      • 😈Pwn
        • NSA Call Converter
      • ⚙️Reverse
        • CryptoVirus
        • WebChaussettes
      • 🌐Web
        • DoctoLeak
    • 2023 | Flag4All
      • 🔑Cryptographie
        • Aes IV
        • Crypt my loop
        • Kentucky fried chicken
        • RSA primes
        • Xor
    • 2022 | EFREI - CyberNight
      • 🔑Cryptographie
        • Coupé-décalé
        • ExFILEtration
        • Il s'est baissé ou pas
        • J'ai pas roté
        • Les allemands !
        • RSA Strong Prime generator
      • 🔎Forensic
        • Bomberman 1/2
        • Bomberman 2/2
        • Magic
        • Peu importe le chemin
        • Sniff sniff
        • Souvenir
        • Xray
      • 🔌Hardware
        • Class4
        • Find me 2/3
        • Identify 1/3
        • Yo listen 3/3
      • 🧠Misc
        • Et je tombe tombe tombe
        • Des yeux partout
        • RiGOLe
        • Roomba tricheur
        • Survey
        • Tinder
      • 💾Programmation
        • Repeat
        • Startup
        • Timing
      • ⚙️Reverse
        • Auth 1
        • Auth2
        • Auth3
        • Cryptoroomba
        • Tenet
      • 🎭Stéganographie
        • 50 shades of stephane legar
        • Chess master
        • Deviens champion sers toi de tout ce que tu as appris
        • Drifting in the bits
        • Pyramide
        • Spirale
      • 🌐Web
        • Ah bah c'est du propre
        • Cooking roomba
        • Leaderboard
        • vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Propulsé par GitBook
Sur cette page
  • Challenge
  • Solution

Cet article vous a-t-il été utile ?

  1. CTF & Writeups
  2. 2024 | DefCamp
  3. Cryptographie

ctr

Précédentoracle-srlSuivantForensic

Dernière mise à jour il y a 7 mois

Cet article vous a-t-il été utile ?

Catégorie: Crytpo Difficulté: Facile Flag: CTF{d6bd1954527310f3f831baa46582f553a9e780d8fa747637d25da1281c24edaf}

Challenge

Description


Are you feeling down? Here is a list of exciting words for you, hope you'll feel better after this. (probably not)

Ce challenge tourne sur un docker et n'est pas disponible

Solution

Dans un chiffrement par CTR, on utilise un nonce à qui l'on ajoute un compteur et l'on chiffre le tout avec une clé. Le résultat de ce chiffrement est xoré avec le plaintext que l'on souhaite chiffrer.

Ici, le nonce et la clé sont réutilisés dans l'oracle du serveur. Ce qui veut dire qu'on peut faire une attaque par clair choisi et en déduire la valeur des blocs chiffrés utilisés dans le XOR, on va les appeler les KEYSTREAM.

De là, on peut tenter de XOR chaque chiffrés que l'on a dans ctr.txt et voir s'ils donnent quelque chose de lisible. Exemple avec le premier f24e8c4bb594b2590edc658609608f16

import socket
import string


class Client:
  def __init__(self, host: str, port: int) -> None:
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.settimeout(1)
    self.sock.connect((host, port))
  
  def recv_line(self) -> bytes:
    data = b''
    while True:
      b = self.sock.recv(1)
      if b in [b'\n', b'']:
        break
      data += b
    return data
  
  def encrypt(self, data: bytes) -> bytes:
    self.recv_line() # On s'en fou de cette ligne
    self.sock.send(data + b'\n') # On envoie notre clair choisi à chiffrer
    return bytes.fromhex(self.recv_line()[12:].decode()) # On retourne le résultat du chiffrement


def xor(a: bytes, b: bytes) -> bytes:
  assert len(a) == len(b)
  return bytes([a ^ b for a, b in zip(a, b)])


def get_keystreams(host, port) -> list[bytes]:
  client = Client(host, port)
  keystreams = []
  for j in range(125):
      # Attaque par clair choisi
      data = b'0' * 16
      cipher = client.encrypt(data)
      # On connait le plaintext et le résultat, on xor les deux pour en déduire le keystream
      keystream = xor(data, cipher)
      keystreams.append(keystream)
  return keystreams


host, port = '34.107.26.201', 30329
keystreams = get_keystreams(host, port)
encrypted = bytes.fromhex('f24e8c4bb594b2590edc658609608f16')
charset = string.printable.encode()
for i, keystream in enumerate(keystreams):
  decrypted = xor(encrypted, keystream)
  if all([c in charset for c in decrypted]):
    print(i, decrypted.decode())
    break
66 ThrillingThrilli

C'est le keystream n°66 qui a pu déchiffrer la première ligne de ctr.txt.

On sait que le flag est sous la forme CTF{sha256}, soit 69 caratères, c'est à dire le même nombre de ligne que contient ctr.txt.

On s'apperçoit aussi que l'ascii de C est 67 c'est à dire le numéro de notre bloc si l'on commence à compter à partir de 1 et non 0.

Il suffit donc de faire la même opération pour toutes les lignes de ctr.txt et regarder le numéro du keystream qui les déchiffre.

import socket
import string


class Client:
  def __init__(self, host: str, port: int) -> None:
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.settimeout(1)
    self.sock.connect((host, port))
  
  def recv_line(self) -> bytes:
    data = b''
    while True:
      b = self.sock.recv(1)
      if b in [b'\n', b'']:
        break
      data += b
    return data
  
  def encrypt(self, data: bytes) -> bytes:
    self.recv_line() # On s'en fou de cette ligne
    self.sock.send(data + b'\n') # On envoie notre clair choisi à chiffrer
    return bytes.fromhex(self.recv_line()[12:].decode()) # On retourne le résultat du chiffrement


def xor(a: bytes, b: bytes) -> bytes:
  assert len(a) == len(b)
  return bytes([a ^ b for a, b in zip(a, b)])


def get_keystreams(host, port) -> list[bytes]:
  client = Client(host, port)
  keystreams = []
  for j in range(125):
      # Attaque par clair choisi
      data = b'0' * 16
      cipher = client.encrypt(data)
      # On connait le plaintext et le résultat, on xor les deux pour en déduire le keystream
      keystream = xor(data, cipher)
      keystreams.append(keystream)
  return keystreams


def main() -> None:
  host, port = '34.107.26.201', 30329
  keystreams = get_keystreams(host, port)
  with open('ctr.txt', 'r') as f:
    encrypted_words = [bytes.fromhex(line) for line in f.read().splitlines()]

  flag = ''
  charset = string.printable.encode()
  for encrypted in encrypted_words:
    for i, key in enumerate(keystreams):
      decrypted = xor(key, encrypted)
      if all([c in charset for c in decrypted]):
        keystream_n = i+1
        flag += chr(keystream_n)
        print(keystream_n, decrypted.decode())
  print(flag)

if __name__ == '__main__':
  main()
67 ThrillingThrilli
84 ExhilaratingExhi
70 ElectrifyingElec
123 EuphoricEuphoric
100 JubilantJubilant
54 EcstaticEcstatic
98 EnthusiasticEnth
100 InvigoratingInvi
49 ExuberantExubera
57 RadiantRadiantRa
53 DynamicDynamicDy
52 VibrantVibrantVi
53 ZestyZestyZestyZ
50 ZealousZealousZe
55 SpiritedSpirited
51 LivelyLivelyLive
49 AnimatedAnimated
48 RapturousRapturo
102 RousingRousingRo
51 UpliftingUplifti
102 GloriousGlorious
56 SparklingSparkli
51 BlissfulBlissful
49 BurstingBursting
98 CheeringCheering
97 DelightfulDeligh
97 EnrapturedEnrapt
52 ExultantExultant
54 FerventFerventFe
53 FizzyFizzyFizzyF
56 GiddyGiddyGiddyG
50 HyperHyperHyperH
102 IntenseIntenseIn
53 JauntyJauntyJaun
53 JoyfulJoyfulJoyf
51 LuminousLuminous
97 MerrymakingMerry
57 OverjoyedOverjoy
101 PeppyPeppyPeppyP
55 PlayfulPlayfulPl
56 QuiveringQuiveri
48 ResplendentRespl
100 Spine-tinglingSp
56 TantalizingTanta
102 TitillatingTitil
97 UpbeatUpbeatUpbe
55 VitalVitalVitalV
52 VivaciousVivacio
55 WhimsicalWhimsic
54 YippeeYippeeYipp
51 ZingyZingyZingyZ
55 ZippyZippyZippyZ
100 BouncyBouncyBoun
50 ChipperChipperCh
53 DeliriousDelirio
100 EcstaticEcstatic
97 EffervescentEffe
49 ElatedElatedElat
50 ExcitedExcitedEx
56 ExultingExulting
49 FrenziedFrenzied
99 FriskyFriskyFris
50 GiddyGiddyGiddyG
52 GleefulGleefulGl
101 HappyHappyHappyH
100 High-spiritedHig
97 HypedHypedHypedH
102 JoyousJoyousJoyo
125 JubilantJubilant
CTF{d6bd1954527310f3f831baa46582f553a9e780d8fa747637d25da1281c24edaf}
🚩
🔑
2KB
ctr.txt