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
  • Reverse du loader
  • Reverse du vrai programme

Cet article vous a-t-il Γ©tΓ© utile ?

  1. CTF & Writeups
  2. 2025 | HackDay
  3. Reverse

Rusty_rev

PrΓ©cΓ©dentJust digSuivantThe Cogs of Blackmail

Dernière mise à jour il y a 3 mois

Cet article vous a-t-il Γ©tΓ© utile ?

Flag: HACKDAY{D0N7_637_rU57Y}

Challenge

Description


Hello agent, a trusted source managed to find one of the most secured app of the black mist crew, but unfortunately, we can't find the password to access it.

We know your talents for reverse engineering, we need you to help us this password.


sha256: 71553d736b4299a40069ff3ae1fbd242b50f88b44c28a49ef559ac34248581d5

Solution

Ce challenge est un premier programme, appelΓ© loader, qui charge en mΓ©moire un second puis l'exΓ©cute.

Reverse du loader

DΓ©couvrir l'existence du loader

Si l'on regarde où est utilisée cette fonction, on découvre un appel à la fonction write est fait juste après sur le fichier créé :


Extraction du vrai programme

On va lancer le binaire avec GDB et break Γ  ce niveau-lΓ  pour voir ce qui est Γ©crit :

β”Œβ”€β”€(kaliγ‰Ώkali)-[~/HackDay 2025]
└─$ gdb rusty_rev

gef➀  r
Starting program: /home/kali/HackDay 2025/rusty_rev

gef➀  b write
Breakpoint 1 at 0x7ffff7ec24d0: file ../sysdeps/unix/sysv/linux/write.c, line 26.

gef➀  r
Starting program: /home/kali/HackDay 2025/rusty_rev

Une fois arrivé au breakpoint, on voit que ce que l'on écrit dans le fichier anonyme commence par ELF. C'est là que l'on comprend que c'est un loader qui charge notre vrai programme en mémoire. On va donc dump celui-ci, pour ça on utilise l'adresse affichée dans le paramètre buf et la taille affichée dans nbytes.

La commande dump utilise une adresse de dΓ©but et une adresse de fin, il faut donc additionner la taille Γ  l'adresse de dΓ©but pour obtenir l'adresse de fin, 0x7ffff7c71010 + 0x5f9c0 = 0x7ffff7cd09d0 :


Reverse du vrai programme

Trouver la fonction principale

Maintenant, je passe sur IDA pour le binaire qu'on vient d'extraire. La dΓ©compilation est plus explicite et visuelle pour le WriteUp.

En lanΓ§ant le programme, on nous affiche la phrase Please input your password. On commence donc par chercher la string password pour savoir oΓΉ nous sommes dans le programme.

En regardant les refs Γ  celle-ci, on arrive sur la fonction sub_8434 :

Comprendre la fonction

En regardant un peu Γ  quoi correspondent les refs utilisΓ©es dans la fonction, on peut voir qu'en fonction de v55, on place GG WP, Wrong password, Reboot computer ou l'ASCII Art AmongUs en mΓ©moire.

Il y a Γ©galement une ligne intΓ©ressante : on compare v79 Γ  23 et ensuite, on fait tout un tas de comparaisons avant d'Γ©crire GG WP.


ApartΓ© concernant v55, il s'agit du rΓ©sultat d'une fonction alΓ©atoire, on peut le voir facilement :

Pour attendre le if qui nous intΓ©resse (celui en vert dans le screen prΓ©cΓ©dent) il ne faut pas que v55 soit Γ©gal Γ  1, 2, 3, ou 4. Donc, Γ  chaque fois qu'on analysera dynamiquement le programme, on va le forcer Γ  5.


Rebase du program

Toujours concernant l'analyse dynamique, on va devoir rebase notre IDA pour avoir les mΓͺmes adresses que sur notre GDB. Pour Γ§a, on commence par utiliser vmmap dans gdb et on regarde le start du programme : 0x00555555554000.

Maintenant, on va setup Γ§a dans IDA : Edit > Segments > Rebase program...

Parfait, on a les mΓͺmes adresses dans les deux, ce sera plus simple Γ  suivre. Notre fonction sub_8434 est maintenant Γ  l'adresse sub_55555555C434.


Analyse dynamique

Comme j'ai dit tout à l'heure, on va fixe notre variable v55. Pour ça, on va break juste après l'appel à la fonction rand et changer la valeur. Le résultat est dans EAX, donc on change EAX (logique).

gef➀  break *0x55555555CCFF
Breakpoint 1 at 0x55555555ccff

gef➀  run

gef➀  set $eax=5

Taille du mot de passe

Maintenant, on va break sur la comparaison avec 23, c'est Γ  l'adresse 0x55555555CE1F

En lanΓ§ant le programme avec le mot de passe "test", on voit que c'est rsp+40 qui est comparΓ© Γ  23 (0x17). Et la valeur dans rsp+40 est 4 :

gef➀  break *0x55555555ccff
Breakpoint 1, 0x000055555555ccff

gef➀  break *0x55555555ce1f
Breakpoint 2, 0x000055555555ce1f

gef➀  run
[#0] Id 1, Name: "hidden_elf", stopped 0x55555555ccff in ?? (), reason: BREAKPOINT

gef➀  set $eax=5
gef➀  continue
[#0] Id 1, Name: "hidden_elf", stopped 0x55555555ce1f in ?? (), reason: BREAKPOINT
β†’ 0x55555555ce1f          cmp    QWORD PTR [rsp+0x40], 0x17

gef➀  x $rsp+40
0x7fffffffdb28: 0x00000004

On en déduit facilement que c'est la longueur de notre mot de passe, il faut donc qu'il fasse 23 caractères.


Comparaison du mot de passe

En continuant sur la comparaison qui nous intΓ©resse, on voit que :

  • rbx est comparΓ© avec 0x5555555A1050 (valeur : A5E7F33F8DE1F5)

  • rbx+7 est comparΓ© avec 0x5555555A1040 (valeur : 0FCA1B12650FE105220FCF1436E83C3A)

De plus, avec notre mot de passe test, RBX contient une valeur sur 4 octets. Avec d'autres mots de passe et en breakant au mΓͺme endroit, on se rend compte que RBX contient notre mot de passe "chiffrΓ©".

gef➀  x /8b $rbx
0x5555555b7d60: 0x78    0xe2    0x42    0xf9    0x00    0x00    0x00    0x00

Le chiffrement est fait caractère par caractère et la position du caractère compte également. On peut le voir assez facilement en faisant différentes tentatives :

# Avec "AAAAAAAAAAAAAAAA"
gef➀  x /16b $rbx
0x5555555b7d60: 0xe4    0xe7    0xe1    0x65    0xa0    0xe1    0x2d    0xe4
0x5555555b7d68: 0xe7    0xe1    0x65    0xa0    0xe1    0x2d    0xe4    0xe7

# Avec "BBBBBBBBBBBBBBBB"
gef➀  x /16b $rbx
0x5555555b7d60: 0xff    0xfc    0xfa    0x7e    0xbb    0xfa    0x36    0xff
0x5555555b7d68: 0xfc    0xfa    0x7e    0xbb    0xfa    0x36    0xff    0xfc

Conclusion : il faut que le rΓ©sultat de notre mot de passe chiffrΓ© donne les deux valeurs qu'on a vues juste avant, c'est-Γ -dire : A5E7F33F8DE1F50FCA1B12650FE105220FCF1436E83C3A.


Automatisation

Ce qu'on va faire, c'est tester tous les caractères à toutes les positions possibles et récupérer leur valeur chiffrée. On pourra ainsi comparer avec le résultat attendu pour voir les correspondances. En python, ça donne ce script :

run_program.py
import gdb

file_with_password = 'input.txt'
file_with_result = 'output.txt'
flag_size = 23

# Charger le programme cible
gdb.execute("file ./result.bin")

gdb.execute("break *0x000055555555ccff")  # break pour modifier v55
gdb.execute("break *0x000055555555ce1f")  # break juste avant la comparaison du mdp

gdb.execute(f"run < {file_with_password}")  # Lancer le programme

# On force v55 Γ  5
gdb.execute('set $eax = 5')
gdb.execute("continue")

# On dump le rΓ©sultat du chiffrement dans output.txt
gdb.execute(f"dump binary memory {file_with_result} $rbx $rbx+{flag_size}")

gdb.execute("quit")

On a un script Python GDB qui permet de lancer le programme et récupérer le résultat du chiffrement dans output.txt, maintenant il nous faut un script pour tester tous les caractères :

import subprocess
import string

# Les valeurs rΓ©cupΓ©rΓ©es tout Γ  l'heure
expected = bytes.fromhex('a5 e7 f3 3f 8d e1 f5 0f ca 1b 12 65 0f e1 05 22 0f cf 14 36 e8 3c 3a')
# Tous les caractères que l'on va tester
charset = string.digits + string.ascii_letters + string.punctuation
file_with_password = 'input.txt'    # Fichier dans lequel on met le mpd Γ  tester
file_with_result = 'output.txt'     # Fichier dans lequel on aura le rΓ©sultat
flag_size = 23

# La fonction met le mdp dans input.txt, lance gdb et retourne le contenu de output.txt
def run(password: str) -> bytes:
  with open(file_with_password, 'w') as f:
    f.write(password)
  out = subprocess.run('gdb -q -x test.py', capture_output=True, shell=True)
  with open(file_with_result, 'rb') as f:
    result = f.read()
  return result

# On commence avec un flag vide
flag = bytearray(b' ' * flag_size)
for c in charset:
  password = c * flag_size
  result = run(password)
  hit = False
  for i in range(len(result)):
    if result[i] == expected[i]:      # Si un des octets est le mΓͺme qu'attendu
      flag[i] = ord(c)                # On ajoute le caractère utilisé dans le flag
      hit = True
  if hit:
    print(flag.decode())  

Le rΓ©sultat :

β”Œβ”€β”€(kaliγ‰Ώkali)-[~/HackDay 2025]
└─$ python3 solve.py
         0             
         0    3        
         0    3    5   
         0   63    5   
         0 7 637   57  
         0 7 637 r 57  
 A   A   0 7 637 r 57  
 AC  A   0 7 637 r 57  
 AC DA  D0 7 637 r 57  
HAC DA  D0 7 637 r 57  
HACKDA  D0 7 637 r 57  
HACKDA  D0N7 637 r 57  
HACKDA  D0N7 637 rU57  
HACKDAY D0N7 637 rU57Y 
HACKDAY D0N7_637_rU57Y 
HACKDAY{D0N7_637_rU57Y 
HACKDAY{D0N7_637_rU57Y}

Ici, j'utilise Ghidra pour dΓ©compiler le binaire. Dans la partie SymbolTree, on voit que la fonction memfd_create est utilisΓ©e. Un petit tour sur pour voir qu'elle permet de crΓ©er un fichier anonyme en mΓ©moire et retourne son file descriptor.

🚩
βš™οΈ
la doc
527KB
rusty-rev.zip
archive