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
  • Challenge 1
  • Challenge 2
  • Obtention du flag

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

  1. CTF & Writeups
  2. 2024 | Efrei - CyberNight
  3. Reverse

The Ugandan Labyrinth

PrécédentM30W Vault TechSuivantStéganographie

Dernière mise à jour il y a 5 mois

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

Flag: CYBN{d4_w4y_1s_n0t_th3_34s13st_but_th3_funn13st}

Challenge

Description


Je sais pas comment t'as fait ton compte mais on dirait que tu es totalement perdu... Heureusement pour toi, si tu observes de manière méthodique le labyrinthe qui se dresse devant toi, tu devrais pouvoir t'en sortir !

Solution

Décompilation avec Ghidra. Les symboles n'ont pas été retirés pour faciliter le challenge. On commence par le challenge 1.

Challenge 1

On peut voir ligne 14 une comparaison avec Knuckles > Sonic, c'est le mot de passe attendu.

uint challenge_1(int socket) {
  int iVar1;
  size_t sVar2;
  char local_318 [0x100];
  char local_218 [0x208];
  uint local_10;
  int local_c;
  
  snprintf(local_218,0x200,"Un temple sacré se dresse devant toi, seul celui qui connaît la phrase sacrée peut espérer entrer.\nMais attention, si tu te tro mpes des Ugandan Knights viendront s\'occuper de toi !\n> ");
  sVar2 = strlen(local_218);
  send(socket,local_218,sVar2,0x0);
  memset(local_218,0x0,0x200);
  local_c = read_line(socket,(long)local_318,0xff);
  iVar1 = strcmp(local_318,"Knuckles > Sonic");
  local_10 = (uint)(iVar1 == 0x0);
  if (local_10 == 0x0) {
    snprintf(local_218,0x200,"\nLes Ugandan Knights se retournent vers toi... commencent à faire des cliquetis... et attrapent leurs armes ! CAVALE KENNY, C AVALE !\n");
  }
  else {
    snprintf(local_218,0x200,"\nLa porte du temple s\'ouvre tandis les Ugandan Knights ne font même pas attention à toi. Tu décides d\'entrer à la recherche  du trésor !\n");
  }
  sVar2 = strlen(local_218);
  send(socket,local_218,sVar2,0x0);
  return local_10;
}

Challenge 2

Ligne 18, on appelle check_challenge_2 avec ce qui a été lu dans le socket et local_1c, c'est-à-dire la valeur 0x3d923435fe5b07e4.

bool challenge_2(int socket) {
  size_t sVar1;
  undefined8 uVar2;
  char *param3;
  char local_233 [0xb];
  char local_228 [0x20c];
  undefined8 local_1c;
  int local_14;
  size_t local_10;
  
  local_1c = 0x3d923435fe5b07e4;
  local_10 = 0x200;
  snprintf(local_228,0x200,"\nTu as réussis à entrer dans le temple, maintenant commence le dédale infernal. Prouves que tu connais da wae pour\narriver jus qu\'au trésor. Seul un chemin de 10 mouvements à travers le labyrinthe peux te sauver, utilise les directions :\nD (Droite) | G ( Gauche)| H (Haut) | B (Bas) (ex: BGDHDBDHGB)\n> ");
  sVar1 = strlen(local_228);
  send(socket,local_228,sVar1,0x0);
  memset(local_228,0x0,local_10);
  read_line(socket,(long)local_233,0xb);
  uVar2 = check_challenge_2(local_233,&local_1c);
  local_14 = (int)uVar2;
  if (local_14 == 0x0) {
    param3 = getenv("FLAG");
    snprintf(local_228,local_10,"\nGood job! Your flag is %s\n",param3);
  }
  else if (local_14 == 0x1) {
    snprintf(local_228,local_10,"\nTu dois faire 10 mouvements, pas plus, pas moins...\n");
  }
  else if (local_14 == 0x2) {
    snprintf(local_228,local_10,"\nDa wae est composée uniquement de D, G, H et B, tu ne la connais visiblement pas...\n");
  }
  else if (local_14 == 0x3) {
    snprintf(local_228,local_10,"\nAïe ! Tu t\'es perdu dans le labyrinthe, you don\'t know da wae...\n");
  }
  sVar1 = strlen(local_228);
  send(socket,local_228,sVar1,0x0);
  return local_14 == 0x0;
}

Maintenant, on regarde check_challenge_2 :

undefined8 check_challenge_2(char *input,char *local_1c) {
  int c;
  size_t input_size;
  undefined8 uVar1;
  uchar local_60 [0x8];
  uchar hash_result [0x27];
  byte xored_input [0xa];
  char key [0x7];
  undefined8 local_20;
  size_t key_size;
  int i;
  
  local_20 = 0xd070c0a0e040919;
  input_size = strlen(input);
  if (input_size == 10) {                       // Notre input doit faire 10 caractères.
    for (i = 0x0; i < 0xa; i = i + 0x1) {
      input[i] = toupper((uint)(byte)input[i]); // Met en majuscule tous les caractères de notre input
      
      // Ici, on vérifie que notre input ne contient que des D, G, H ou B
      if ((((input[i] != 'D') && (input[i] != 'G')) && (input[i] != 'H')) && (input[i] != 'B')) {
        return 0x2;
      }
    }
    key = "shadow";
    key_size = strlen(key);
    // XOR notre input avec la clé "shadow"
    for (i = 0x0; i < 10; i = i + 0x1) {
      xored_input[i] = input[i] ^ key[(ulong)(long)i % key_size];
    }
    
    // Fait un SHA256 du résultat de notre input XOR avec la clé
    SHA256(xored_input,10,hash_result);
    
    // Utilise local_20 comme tableau d'index pour ne garder que 8 octets du hash et les mettre dans local_60
    for (i = 0x0; i < 0x8; i = i + 0x1) {
      local_60[i] = hash_result[local_20[i]];
    }
    
    // Compare les 8 octets retenus avec local_1c que l'on a passé en paramètre à cette fonction 
    c = memcmp(local_60,local_1c,0x8);
    if (c == 0x0) {
      uVar1 = 0x0;
    }
    else {
      uVar1 = 0x3;
    }
  }
  else {
    uVar1 = 0x1;
  }
  return uVar1;
}

On comprend donc que local_1c est le résultat attendu des octets conservés du hash. Comme on connait cette valeur et qu'il n'y a que 4 caractères possibles répétés 10 fois (4 puissance 10 = 1048576 possibilités), on peut bruteforce localement.

En python ça donne :

from hashlib import sha256
from itertools import product

key = b'shadow'
key_size = len(key)
local_1c = 0x3d923435fe5b07e4.to_bytes(8, 'little')
local_20 = 0xd070c0a0e040919.to_bytes(8, 'little')
for o in product(b'DGHB', repeat=10):
  path = bytes(o)
  xor_path = bytes([path[i] ^ key[i % key_size] for i in range(10)])
  hash_ = sha256(xor_path).digest()
  bytes_retained = bytes([hash_[local_20[i]] for i in range(8)])
  if bytes_retained == local_1c:
    print(f'Good path: {path.decode()}')
    break

# Good path: HHBBGDGDHB

Obtention du flag

Il suffit de se connecter et envoyer ces infos

🚩
⚙️
21KB
the-ugandan-labyrinth.zip
archive