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
  • Check1
  • Checksum
  • Check3
  • Résolution avec z3
  • Unintended way

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

  1. CTF & Writeups
  2. 2024 | Star-Hack
  3. Reverse

Rev0x02

PrécédentRev0x01SuivantWeb

Dernière mise à jour il y a 6 mois

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

Flag: StarHack{G00d_J0B_78e8ezrzr9}

Challenge

Description


Il faut un clé de licence pour activer le programme!

nc 35.180.44.229 1234

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

Solution

Commençons par la décompilation de la fonction main, voici le pseudo code sortie par Ghidra avec quelques modifications :

int main() {
  char *licence;
  bool check1_success;
  unsigned int n1;
  unsigned int n2;
  unsigned int n3;
  unsigned int n4;
  unsigned int sum;
  unsigned int licence_part;
  bool check2_success;
  bool check3_success;
  
  licence = (char *)malloc(0x18);
  printf("Bonjour Bonjour reverseur.\n Bienvenue dans m...");
  scanf("%s",licence);
  
  check1_success = check1(licence);
  if (check1_success == 0) {
    puts("Vous essayez d\'utiliser mon programme gratuitement. Allez acheter une licence.");
  } else {
    licence_part = cut(licence,0x4);
    n1 = licence_part;
    licence_part = cut(licence + 0x5,0x4);
    n2 = licence_part;
    licence_part = cut(licence + 0xa,0x4);
    n3 = licence_part;
    licence_part = cut(licence + 0xf,0x4);
    n4 = licence_part;
    licence_part = cut(licence + 0x14,0x4);
    sum = checksum(n1,n2,n3,n4);
    if (licence_part == sum) {
      check2_success = check2(n1,n2,n3,n4);
      if (check2_success == 0) {
        puts("Vous essayez d\'utiliser mon programme gratuitement. Allez acheter une licence.");
      } else {
        check3_success = check3(n1 << 0x10 | n2, licence_part * 0xc0de, n3 << 0x10 | n4);
        if (check3_success == 0) {
          puts("Vous essayez d\'utiliser mon programme gratuitement. Allez acheter une licence.");
        } else {
          puts("Bon travail, mais je pense qu'il n'y a rien...");
          win();
        }
      }
    } else {
      puts("Vous essayez d\'utiliser mon programme gratuitement. Allez acheter une licence.");
    }
  }
  return 0x0;
}

L'objectif est de passer les 3 fonctions check. Commençons par la première :

Check1

Elle vérifie que notre licence à le format XXXX-XXXX-XXXX-XXXX-XXXX où les X sont un caractère dans [0-9A-F] (hexa en majuscule).

bool check1(char *licence) {
  size_t size;
  bool success;
  int i;
  
  size = strlen(licence);
  if ((((size == 24) && (licence[0x4] == '-')) && (licence[0x9] == '-')) && ((licence[0xe] == '-' && (licence[0x13] == '-')))) {
    for (i = 0x0; i < size; i = i + 0x1) {
      if ((licence[i] < '0') || ('F' < licence[i])) {
        if (licence[i] != '-') {
          return 0x0;
        }
      }
      else if ((licence[i] < 'A') && ('9' < licence[i])) {
        return 0x0;
      }
    }
    success= 0x1;
  }
  else {
    success= 0x0;
  }
  return success;
}

Checksum

Ensuite, notre licence est découpée en fonction des blocs qu'elle forme, puis l'hexa décimal est interprété en tant que nombre, on a donc 5 entiers. Par exemple si notre licence est DEAD-BEAF-C0FE-BABE-1337, cela correspond à [57005, 48815, 49406, 47806, 4919].

Les 4 premiers nombres servent à calculer le 5ᵉ. C'est la fonction checksum qui permet cela.

unsigned int checksum(unsigned int n1, unsigned int n2, unsigned int n3, unsigned int n4) {
  return n2 * 0x2 & n1 >> 0x1 ^ n3 ^ n4;
}

Check3

On passe directement au 3ᵉ check pour s'éviter des problèmes. Elle prend trois paramètres notés p1, p2 et p3 et qui sont calculés comme suit :

p1 = n1 << 0x10 | n2
p2 = checksum * 0xc0de
p3 = n3 << 0x10 | n4
bool check3(unsigned int p1, unsigned int p2, unsigned int p3) {
  return p3 == (~p2 | p1) + (~p1 | p2) + ~(p1 | p2) * -0x2 + (p1 & p2) * -0x2;
}

Résolution avec z3

Maintenant que l'on connaît les conditions, on va créer des contraintes pour réduire le nombre de licences possibles, puis les tester une à une. Pour ça, on utilise z3.

  • n1 jusqu'à n5 représente nos blocs

  • p1, p2 et p3 sont les paramètres passés à check3

from z3 import *
import subprocess

s = Solver()
n1 = BitVec('n1', 32)
n2 = BitVec('n2', 32)
n3 = BitVec('n3', 32)
n4 = BitVec('n4', 32)
n5 = BitVec('n5', 32)
p1 = BitVec('p1', 32)
p2 = BitVec('p2', 32)
p3 = BitVec('p3', 32)

# Les blocs font 2 octets, donc n1-5 peuvent aller jusque 2**16, soit 65536
s.add(n1 >= 0, n1 < 65536)
s.add(n2 >= 0, n2 < 65536)
s.add(n3 >= 0, n3 < 65536)
s.add(n4 >= 0, n4 < 65536)
s.add(n5 >= 0, n5 < 65536)

# Ici on ajoute la formule du checksum, pour forcer n5 à être bon
s.add(n5 == n2 * 0x2 & n1 >> 0x1 ^ n3 ^ n4)

# On définit les paramètres de check3
s.add(p1 == n2 | (n1 << 16))
s.add(p2 == 0xC0DE * n5)
s.add(p3 == n4 | (n3 << 16))

# On applique check3
s.add(p3 == (p2 | ~p1) + (p1 | ~p2) - 2 * ~(p2 | p1) - 2 * (p2 & p1))

# Tant qu'une solution existe, on affiche
while s.check() == sat:
  model = s.model()
  licence = '-'.join([f'{model[n].as_long():0>4X}' for n in [n1, n2, n3, n4, n5]])

  # Test en direct la licence
  out = subprocess.run(f'echo {licence} | ./task', shell=True, capture_output=True).stdout.decode()
  if 'Allez acheter une licence' not in out:
    print(licence)
  
  # Sert à trouver une nouvelle solution
  s.add(Or(n1 != model[n1], n2 != model[n2], n3 != model[n3], n4 != model[n4]))

Unintended way

La clé 0000-0000-0000-0000-0000 fonctionnait.

🚩
⚙️
4KB
rev0x02.zip
archive