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
  • Contrer le debugger
  • Trouver la fonction d'évaluation
  • Code n°1
  • Code n°2
  • Code n°3
  • Code n°4
  • Keygen

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

  1. CTF & Writeups
  2. 2023 | EFREI - CyberNight
  3. Reverse

WebChaussettes

PrécédentCryptoVirusSuivantWeb

Dernière mise à jour il y a 1 an

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

Catégorie: Reverse Difficulté: Moyen Flag: MALICE{N0s0CKsF0rY0U}

Challenge

Description


Venez essayer nos chaussettes révolutionnaires !

Connection:

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

Solution

Dans ce challenge il fallait reverse le JavaScript pour calculer le code d'accès côté client. Il est composé de 4 parties :

Contrer le debugger

Seulement si l'on ouvre les outils de développement du navigateur, l'exécution se met en pause à cause d'un Interval qui lance le mode debug.

Pour contrer cela, on va simplement rafraîchir la page et exécuter tout de suite dans la console le code :

setInterval = () => {}

Cela permet d'empêcher l'appel à setInterval et donc de placer la debugger.

Trouver la fonction d'évaluation

Il n'y a pas de boutons pour envoyer son code et certains input sont désactivés, on va donc les analyser un peu. Parmi les évènements écoutés, on y trouve keyup qui appelle une fonction dans bundle.js

On voit tout de suite que la fonction execEvalFunc est appelée, puis que celle-ci évalue une string et l'appelle. On va donc mettre un breakpoint dessus.

En entrant n'importe quoi dans l'input, on déclenche le breakpoint et l'on peut rentrer dans la fonction évaluée :

On voit que la fonction de validation est décodée de la base64 puis evaluée (et nommée handler) avant d'être appelée. Il faut alors continuer jusqu'à son appel et rentrer dedans :

Code n°1

Nous avons maintenant accès à la fonction qui vérifie le code n°1, on peut commencer à la déobfusquer.

Pour tout ce qui est des appels du type : _0x2d45('0x24'), pour connaître leur valeur il suffit de les exécuter dans la console puisque nous avons mis l'exécution en pause et que nous sommes dans le même contexte.

(1) Lorsqu'on a appelé handler, on a vu que les paramètres passés étaient : notre code, le numéro de la partie du code (ici 0), le context.

(2) Vérification que notre code :

  • ne soit pas null ou vide

  • sa longueur fasse 10

  • la fonction _0x50f289 retourne true

(3) La fonction _0x50f289 prend notre code en argument, le if à la ligne suivante est toujours vrai et le retour est un test Regex pour savoir si notre code ne contient bien que des caractères de l'hexadécimal. La fonction vérifie que notre code est sous format hexadécimal.

(4) le if est toujours faux, donc retourne toujours ![], soit false. Il ne faut donc surtout pas rentrer dans le if (2).

(5 & 6) if toujours vrai

Cela nous donne, une fois renommé et mis en forme :

window.checkFunc = function initialCheckFunc(code, partNumber, context) {
    function isHexa(code) {
        return /^[\x00-\x7F]*$/.test(code)
    }

    if (!code || code.length !== 10 || !isHexa(code)) return false

    function fromHex(code) {
        let result = ''
        for (let i = 0; i < code.length && code.substr(i, 2) !== '00'; i += 2) {
            result += String.fromCharCode(parseInt(code.substr(i, 2), 16))
        }
        return result
    }

    const decoded = fromHex(code)
    return context.users.some(user => user.id === decoded.toLowerCase())
}

Il faut donc que notre code soit simplement l'id de l'utilisateur en hexadécimal.

L'id se trouve dans le contexte transmis, on va donc créer un compte est regarder son id

Code n°2

Une fois le code 1 réussi, on a la même méthode pour récupérer les fonctions de vérification des codes suivants. On réutilise nos mêmes breakpoints.

Une fois la fonction reverse comme avant, on obtient :

window.checkFunc = function secondCheckFunc(code, partNumber, context) {
    if (!context.user || code.length !== 5) return false
	
    const toBase64 = str => Buffer.from(str).toString('base64')
    return code.toLowerCase() === toBase64(context.user.firstname.padEnd(5, 'P')).slice(0, 5).toLowerCase()
}

Il faut donc que notre code soit les 5 premiers caractères de la base64 des 5 premiers caractères de notre firstname (pad avec des "P" si trop petit).

Code n°3

Une fois la fonction reverse, on obtient :

window.checkFunc = function thirdCheckFunc(code, partNumber, context) {
    if (!context.user || code.length !== 5) return false

    function toHex(str) {
        return unescape(encodeURIComponent(str)).split('').map(function (c) {
            return c.charCodeAt(0).toString(16)
        }).join('')
    }
    
    return code.toLowerCase() === toHex(context.user.lastname.padEnd(5, 'P')).slice(0, 5).toLowerCase()
}

Il faut donc que notre code soit l'hexadécimal des 5 première lettres de notre lastname (pad avec des "P" si trop petit).

Code n°4

Une fois la fonction reverse, on obtient :

window.checkFunc = function fourthCheckFunc(code, partNumber, context) {
    if (!context.serialParts || context.serialParts.length !== 3 || code.length !== 0x5) return false
    const toBase64 = str => Buffer.from(str).toString('base64')
    return code.toLowerCase() === toBase64(context.serialParts.map(part => part.toLowerCase()).reverse().join('')).slice(0, 5).toLowerCase()
}

Il faut donc que notre code soit les 5 premiers caractères de la base64 en minuscule de nos 3 précédents codes concaténés dans l'ordre inverse (oof).

Keygen

const toHex = (s) => Buffer.from(s).toString('hex')
const toBase64 = (s) => Buffer.from(s).toString('base64')

const genPart1 = (user) => toHex(user.id)
const genPart2 = (user) => toBase64(user.firstname.padEnd(5, 'P')).slice(0, 5).toLowerCase()
const genPart3 = (user) => toHex(user.lastname.padEnd(5, 'P')).slice(0, 5).toLowerCase()
const genPart4 = (codes) => toBase64(codes.map(c=>c).reverse().join('').toLowerCase()).slice(0, 5).toLowerCase()

function keygen(user) {
	const codes = []
	codes.push(genPart1(user))
	codes.push(genPart2(user))
	codes.push(genPart3(user))
	codes.push(genPart4(codes))
	return codes.join('-')
}

const user = {
	"username": "ThaySan",
	"email": "mail@mail.com",
	"firstname": "Thay",
	"lastname": "San",
	"id": "ecfov"
}

console.log(keygen(user))
🚩
⚙️
http://webchaussettes3.chall.malicecyber.com/