-
Sujet
-
Comment cracker un ELF x86 sans protection le tout sans s’y connaitre en assembleur ?
Une solution serait la commande strings en bash (elle existe aussi sous windows sur cmd… si ca n’est pas le cas (ce qui serait étonnant), cherchez sur internet comment installer la WSL pour ne pas s’embêter avec une machine virtuelle).
la syntaxe est la suivante : strings <nomDuFichier>
La commande va afficher les strings contenus dans le fichier.
Pour chercher dans tout le fichier, il y a l’option a.
Vous verrez qu’il y en a quand même pas mal… si vous voulez faire le tri, vous pouvez déjà utiliser l’option n pour obliger strings à afficher les chaines de caractères qui font une taille minimum.
Ainsi, la commande strings -n 3 <nomDuFichier> affiche toutes les strings dans le fichier qui font au moins caractères de long.
Pour afficher l’offset de la string, utilisez l’option t suivi du caractère x : strings -t x <nomDuFichier>
le x est là pour que l’offset soit en hexadécimal mais on peut mettre aussi un d pour décimal.
Par défaut, strings n’interprète pas les sauts de ligne (et autres whitespace) comme des caractères pouvant être dans une string, pour qu’il les interprète, utilisez w.
Maintenant, on va pratiquer :
Voilà le code du programme qu’on va cracker :
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char * argv[]){ if(argc==1){ fprintf(stderr, "error : usage : %s <password>\n", argv[0]); exit(-1); } char buffer[]="password\0"; char reponse[10]; if(strcmp(buffer, argv[1])==0){ puts("good password"); }else{ fprintf(stderr, "wrong password !\n"); } return 0; }
dans un shell, on fait : strings -n 4 <nomDuFichier> | less
Même comme ca… ca fait beaucoup de chaines de caractères à tester…
Voilà une commande pour tester toutes les possibilités tour à tour :
strings -n 4 a.out | python -c ‘[(lambda x : __import__(« os »).system(« echo essai n »+str(i)+ » && echo \ »password used : « +x+ »\ » && ./a.out « +x+ »&& echo ———————————-« ))(raw_input()) for i in range(1, 10000)]’
On peut faire le même en utilisant python3 :
strings -n 4 a.out | python3 -c ‘[(lambda x : __import__(« os »).system(« echo essai n »+str(i)+ » && echo \ »password used : « +x+ »\ » && ./a.out « +x+ »&& echo ———————————-« ))(input()) for i in range(1, 10000)]’
Le seul problème de ce script… c’est que je ne sais pas comment faire pour envoyer au script python le nombre d’inputs qu’il recevra avant les inputs en question… Ici je prends les 10000 premiers, il suffit juste de modifier le 10000 avec une plus grosse valeur pour tester plus de possibilités …
En tout cas, on trouve à un moment :
essai n19
password used : password
good password
———————————-C’est bon ! C’est gagné ! On n’a même pas eu besoin d’utiliser de l’assembleur (mais bon… il n’y avait aucunes sécurité… pour des programmes plus évolués, il FAUDRA passer par l’assembleur).
Et sur windows ?
La commande strings existe aussi ! On peut conserver le même script en modifiant juste quelques passages (celui ou on exécute le script notamment) :
strings -n 4 a.out | python -c ‘[(lambda x : __import__(« os »).system(« echo essai n »+str(i)+ » && echo \ »password used : « +x+ »\ » && a.out « +x+ »&& echo ———————————-« ))(input()) for i in range(1, 10000)]’
(pensez à voir si python est bien installé sur votre ordinateur. Si jamais vous avez python3 utilisez la commande en haut et si vous avez python 2, celle ci :
strings -n 4 a.out | python -c ‘[(lambda x : __import__(« os »).system(« echo essai n »+str(i)+ » && echo \ »password used : « +x+ »\ » && a.out « +x+ »&& echo ———————————-« ))(raw_input()) for i in range(1, 10000)]’
)
Voilà !!
- Vous devez être connecté pour répondre à ce sujet.