Accueil Solution du crackme Weird de crackmes.one
Post
Annuler

Solution du crackme Weird de crackmes.one

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.

crackmes.one weird 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}
Cet article est sous licence CC BY 4.0 par l'auteur.