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
  • Version simple
  • Version puriste
  • Script complet

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

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

Regarder en stéréo

404CTF{END_IS_NEAR}

PrécédentL'absenceSuivantLa Barre Fixe

Dernière mise à jour il y a 11 mois

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

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

Challenge

Description


Ça y est, c'est le grand jour!

Vous avez enfin atteint le niveau professionnel et, il faut faire vos preuves lors de cette première compétition. Le début de votre enchaînement gymnastique se déroule bien jusqu'à ce que votre plus grande peur se réalise. Une mauvaise réception en amenant une autre, vous ne contrôlez plus votre élan et tentez de vous rattraper tant bien que mal. Malheureusement, vous finissez par atterrir un peu trop loin en dehors des tapis.

Voici la dernière vision que vous avez avant de heurter le sol, est-ce que quelque chose peut encore vous aider?

Version simple

On pouvait utiliser l'outil

Version puriste

Pour ceux comme moi qui n'ont pas trouvé l'outil au-dessus...

On peut remarquer des choses assez atypiques sur l'image :

  • L'image semble se répéter et des lignes verticales régulières se voient sur toute la largeur

  • Des "artéfacts" de plus en plus présents vers la droite de l'image

On peut confirmer l'hypothèse des blocs qui se répètent avec un script Python pour regarder les valeurs des pixels. Ici, je regarde la ligne de pixels tout en haut de l'image puisqu'il ne semble par y avoir d'"artéfacts" dessus.

from PIL import Image

img = Image.open('chall_stega.png')

previous_x = 0
# pixel de référence
pixel = img.getpixel((previous_x, 0))

for x in range(previous_x+1, img.width):
    # Affiche la position des pixels identique et l'offset à partir du précédent
    if pixel == img.getpixel((x, 0)):
        print(f'{x:>4} {x-previous_x}')
        previous_x = x

#  172 172
#  343 171
#  514 171
#  685 171
#  856 171
# 1027 171

On voit clairement que notre pixel 0, 0 se répète plusieurs fois de manière régulière sur la ligne. On a un premier bloc de 172 pixels de large puis des blocs de 171.

Comme les blocs paraissent tous plus ou moins les mêmes, mais avec quelques différences, on peut s'amuser à les comparer. Pour ça, on va calculer la distance entre deux pixels situés au même endroit dans chacun.

Commençons par comparer le premier et le second bloc

from math import sqrt
from PIL import Image

img = Image.open('chall_stega.png')

def distance(p1: list[int], p2: list[int]) -> int:
    # Les deux points sont bien de même dimension
    assert len(p1) == len(p2)
    # Calcul de distance classique
    return round(sqrt(sum([(p1[i]-p2[i])**2 for i in range(len(p1))])))


def compare_blocs(bloc1: Image.Image, bloc2: Image.Image) -> Image.Image:
    width = min(bloc1.width, bloc2.width)
    height = min(bloc1.height, bloc2.height)
    # 'L' créé une image en nuance de gris (grayscale)
    # Donc 1 seul canal de couleur dans lequel on mettra la distance
    diff = Image.new('L', (width, height), 'black')
    
    # Pour tous les pixels
    for y in range(height):
        for x in range(width):
            p1 = bloc1.getpixel((x, y))
            p2 = bloc2.getpixel((x, y))
            diff.putpixel((x, y), distance(p1, p2))
    return diff

# Le premier bloc fait 172 de large
premier_bloc = img.copy().crop((0, 0, 172, img.height))

# Le second commence à 172 et fait 171
second_bloc = img.copy().crop((172, 0, 172 + 171, img.height))

diff = compare_blocs(premier_bloc, second_bloc)
diff.show()

On obtient l'image :

Tiens, tiens, tiens. Il semblerait qu'on a trouvé un début de flag. On peut en déduire que le premier bloc est était copié puis utilisé pour cacher le flag dedans.

Mais alors, est-ce que les blocs suivants utilisent tous le premier bloc ? Non, ils utilisent le bloc précédent.

On peut le voir en testant... ou en réfléchissant avec les premiers détails observés : les blocs vers la droite paraissent avoir de plus en plus d'"artéfacts" à l'intérieur, autrement dit ces répétitions apparaissent surement quand on manipule le bloc précédent et donc, les artéfacts se cumulent au fil des prochains blocs.

premier_bloc = img.copy().crop((0, 0, 172, img.height))
second_bloc = img.copy().crop((172, 0, 172 + 171, img.height))
troisieme_bloc = img.copy().crop((172 + 171, 0, 172 + 171 + 171, img.height))
compare_blocs(premier_bloc, troisieme_bloc).show()
compare_blocs(second_bloc, troisieme_bloc).show()

Bon, il ne reste plus qu'à comparer chaque bloc avec son précédent puis concaténer tout ça

Script complet

from math import sqrt
from PIL import Image

img = Image.open('chall_stega.png')

def distance(p1: list[int], p2: list[int]) -> int:
    assert len(p1) == len(p2)
    return round(sqrt(sum([(p1[i]-p2[i])**2 for i in range(len(p1))])))

def compare_blocs(bloc1: Image.Image, bloc2: Image.Image) -> Image.Image:
    width = min(bloc1.width, bloc2.width)
    height = min(bloc1.height, bloc2.height)
    diff = Image.new('L', (width, height), 'black')
    for y in range(height):
        for x in range(width):
            p1 = bloc1.getpixel((x, y))
            p2 = bloc2.getpixel((x, y))
            diff.putpixel((x, y), distance(p1, p2))
    return diff


blocs = [   
    img.copy().crop((0, 0, 172, img.height)),
    img.copy().crop((172, 0, 172 + 171, img.height)),
    img.copy().crop((172 + 171, 0, 172 + 171*2, img.height)),
    img.copy().crop((172 + 171*2, 0, 172 + 171*3, img.height)),
    img.copy().crop((172 + 171*3, 0, 172 + 171*4, img.height)),
    img.copy().crop((172 + 171*4, 0, 172 + 171*5, img.height)),
    img.copy().crop((172 + 171*5, 0, 172 + 171*6, img.height)),
]

flag = Image.new('L', (977, img.height), 'white')
for i in range(1, len(blocs)):
    flag.paste(compare_blocs(blocs[i-1], blocs[i]), (171 * (i-1), 0))

flag.show()
🚩
🎭
⭐
Stereogram Solver
166KB
regarder_en_stereo.zip
archive
1ᵉʳ bloc et 3ᵉ bloc comparés
2ᵉ bloc et 3ᵉ bloc comparés