crackmes.one est le site qui succès à crackmes.de et met à disposition des crackmes pour toutes plateformes et architectures avec des binaires créés à partir de nombreux langages.
Ici, il s’agit du dernier crackme posté, voici les métadonnées.
Author: exzettabyte
Language: C/C++
Platform: Unix/linux etc.
Difficulty: 2.0
Quality: 4.0
Arch: x86-64
Description: Find The Flag
L’utilisation de la commande file sur le binaire indique qu’il s’agit d’un exécutable statique :
weird: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, no section header
En regardant les chaines de caractères dans ce fichier, je remarque des références à un packer bien connu :
1
2
3
$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.95 Copyright (C) 1996-2018 the UPX Team. All Rights Reserved. $
UPX!
On unpacke le binaire avec upx :
1
2
3
4
5
6
7
8
9
10
$ upx -d weird
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2023
UPX 4.2.1 Markus Oberhumer, Laszlo Molnar & John Reiser Nov 1st 2023
File size Ratio Format Name
-------------------- ------ ----------- -----------
878719 <- 335696 38.20% linux/amd64 weird
Unpacked 1 file
On a toujours un binaire statique :
1
2
$ file weird
weird: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=01505e0b7627458ae8c25f85686edc38358fba68, for GNU/Linux 3.2.0, not stripped
J’ouvre le fichier dans Cutter et là, je remarque que la fonction main() ne fait pas grand-chose :
1
2
3
4
5
6
7
8
9
int main(int argc, char **argv, char **envp);
0x00401ddb endbr64
0x00401ddf push rbp
0x00401de0 mov rbp, rsp
0x00401de3 lea rdi, str.Something_weird ; 0x49500f ; const char *s
0x00401dea call sym.puts ; sym.puts ; int puts(const char *s)
0x00401def mov eax, 0
0x00401df4 pop rbp
0x00401df5 ret
Vous avez dit weird ?
Comme le binaire n’est pas strippé, j’ai les noms des fonctions présentes et j’en remarque une nommée secret.
Cette fonction ne semble pas accepter d’argument. Elle fait son taff dans son coin puis semble afficher le flag.
J’édite l’instruction call dans le main() afin qu’il appelle cette fonction :
1
2
3
4
5
6
7
8
9
int main(int argc, char **argv, char **envp);
0x00401ddb endbr64
0x00401ddf push rbp
0x00401de0 mov rbp, rsp
0x00401de3 lea rdi, str.Something_weird ; 0x49500f ; const char *s
0x00401dea call secret ; sym.secret
0x00401def mov eax, 0
0x00401df4 pop rbp
0x00401df5 ret
Et désormais, on peut obtenir le flag :
1
2
$ ./weird
Flag : flag{9aec9b0277379453e49889427efe7e7b}
