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
  • Découverte du challenge
  • Récupération du texte original
  • Différences entre les fichiers
  • Suite du challenge
  • Façon simple
  • Façon puriste

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

  1. CTF & Writeups
  2. 2024 | 404CTF
  3. Stéganographie

Le grand écart

404CTF{you_spot_w3ll_the_differences}

PrécédentLa Barre FixeSuivantLa chute

Dernière mise à jour il y a 11 mois

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

Catégorie: Stegano Difficulté: medium Flag: -

Challenge

Description


En sortant de votre cours de gymnastique, vous tombez sur un étrange bouquin dans les vestiaires... À vous d'en trouver tous les secrets.

Découverte du challenge

Récupération du texte original

La première chose à remarquer est qu'il s'agit d'un texte, certes, mais certains caractères semblent bizarres. Plus précisément, certains octets sont différents de ce qu'ils devraient être.

Pour avoir une base de comparaison et commencer à chercher, il faut donc trouver le fichier original.

Rien de plus simple grâce à internet, on peut simplement faire une recherche Google sur une partie intacte du texte et on découvre alors qu'il s'agit de Moby-Dick or the whale. On peut maintenant faire une recherche grâce aux Google Dork sur le type txt pour obtenir le fichier qu'il nous faut.


Différences entre les fichiers

Maintenant que l'on a les deux versions, on peut s'amuser à regarder les différences

Bon, il y en a pas mal sur les premières lignes et sachant que le texte en fait 15 000, on va automatiser tout ça grâce à Python.

Tout d'abord, on peut voir que nos deux fichiers font la même taille, ça nous indique déjà qu'on a récupéré le bon texte.

import os

challenge = 'challenge.txt'
original = 'mobydick.txt'

print(os.stat(challenge).st_size)
print(os.stat(original).st_size)

# 643210
# 643210

À présent, on va itérer simultanément sur les deux fichiers caractère par caractère et les comparer. Dès qu'ils sont différents, on va afficher la position dans le fichier ainsi que le XOR entre les deux.

Pourquoi faire un XOR ? Car c'est une opération très courante dans le chiffrement et la stéganographie puisqu'elle est réversible. C'est donc un réflexe à avoir lorsque l'on a plusieurs valeurs à comparer.

import os

challenge = 'challenge.txt'
original = 'mobydick.txt'

size = os.stat(challenge).st_size
assert size == os.stat(original).st_size

# rb pour lire en mode octet
f_challenge = open(challenge, 'rb')
f_original = open(original, 'rb')

for i in range(size):
    # Récupère le prochain octet
    c_challenge = f_challenge.read(1)
    c_original = f_original.read(1)
    
    # Si ils sont différents
    if c_challenge != c_original:
        # XOR entre les deux octets récupérés
        xored = bytes([c_challenge[0] ^ c_original[0]])
        
        # Affiche où dans le fichier, le caractère du challenge
        # celui de l'original et le résultat du xor entre les deux
        print(f"{i:0>6} {c_challenge}\t{c_original}\t{xored}")
    
f_challenge.close()
f_original.close()

# 000150 b'\xa9'  b' '    b'\x89'
# 000180 b'\x04'  b'T'    b'P'
# 000210 b'n'     b' '    b'N'
# 000240 b'\x02'  b'E'    b'G'
# 000270 b'C'     b'N'    b'\r'
# 000300 b'^'     b'T'    b'\n'
# 000330 b':'     b' '    b'\x1a'
# 000360 b'\x00'  b'\n'   b'\n'
# 000480 b'-'     b' '    b'\r'
# 000510 b'i'     b' '    b'I'
# 000540 b'\x1f'  b'W'    b'H'
# 000570 b'\x05'  b'A'    b'D'
# 000600 b'\x17'  b'E'    b'R'

Bingo, on voit dans nos print plusieurs choses intéressantes :

  • A partir de l'octet 150, on a une variation tous les 30 octets.

  • Le XOR entre cette variation et le texte original affiche PNG ... IHDR, on a donc un .png face à nous

  • On voit des "sauts" (300, 330, 360, 480), ils sont surement dus au fait que le fichier contient des octets nuls. Sauf que 0 XOR x = x, il ne faut donc pas se faire avoir et bien prendre tous les 30 octets même s'ils sont identiques.

Ce qu'on va faire, c'est tout simplement rediriger le résultat du XOR dans un fichier tierce, que l'on nommera étonnement flag.png.

import os

challenge = 'challenge.txt'
original = 'mobydick.txt'
flag = 'flag.png'

size = os.stat(challenge).st_size
assert size == os.stat(original).st_size

f_challenge = open(challenge, 'rb')
f_original = open(original, 'rb')
f_flag = open(flag, 'wb')

for i in range(150, size, 30):
    f_challenge.seek(i)                 # Se déplace dans le fichier
    c_challenge = f_challenge.read(1)   # 1 octet lu
    
    f_original.seek(i)                  # Se déplace dans le fichier
    c_original = f_original.read(1)     # 1 octet lu
    
    xored = bytes([c_challenge[0] ^ c_original[0]])
    f_flag.write(xored)                 # Ecrit le résulat du xor dans le fichier

f_challenge.close()
f_original.close()
f_flag.close()

Suite du challenge

Maintenant que nous avons récupéré l'image, il nous faut trouver le flag. En bas à gauche, on voit des pixels de couleurs différentes, ce qui fait penser tout de suite à une technique de LSB un peu foireuse.

Façon simple


Façon puriste

On commence par reverse le LSB que l'on a vu plus tôt en bas de l'image. Je dis LSB, mais il faut prendre tous les bits de l'octet de chaque canal de couleur (sauf l'alpha).

from PIL import Image

img = Image.open(flag)
data = ''
for x in range(15):
    r, g, b, a = img.getpixel((x, img.height - 1))
    data += chr(r) + chr(g) + chr(b)
print(data.strip('\x00'))

# https://www.youtube.com/watch?v=dQw4w9WgXcQ

Bien joué, vous vous êtes fait RickRoll...

En réalité, c'était un indice pour vérifier les autres pixels. Si l'on regarde les pixels au début de l'image, on peut voir que les canaux toujours varient entre deux valeurs alors que c'est un fond uni.

from PIL import Image

img = Image.open(flag)
data = b''
for x in range(15):
    r, g, b, a = img.getpixel((x, 0))
    print(r, g, b, a)

# 12 8 77 254
# 12 9 77 254
# 12 8 76 254
# 12 8 76 254
# 12 8 76 254
# 12 8 76 254
# 12 8 77 255
# 12 9 76 254

On en déduit qu'il faut regarder le dernier bit de chaque canal pour reconstruire le message

from PIL import Image

img = Image.open(flag)
data = ''
for x in range(128):
    # Ajoute 0 ou 1 en fonction du dernier bit de chaque canal
    data += ''.join([f'{n & 1}' for n in img.getpixel((x, 0))])

# Regroupe par 8 bits et interprête en caractère
print(''.join(chr(int(data[i:i+8], 2)) for i in range(0, len(data), 8)))

# &404CTF{you_spot_w3ll_the_differences}

Parmi les résultats, j'ai trouvé et utilisé

On se rend sur et l'on importe l'image. Le site lance plusieurs outils sur le fichier et parmi eux, Zsteg détecte bien un LSB avec le flag

🚩
🎭
⭐
celui-ci
AperiSolve
282KB
le_grand_ecart.zip
archive