Linux reversing ?
|
24-08-2011, 02h22
(Modification du message : 22-10-2011, 15h34 par Di0Sasm.)
Message : #1
|
|
fr0g
NTEuNDI2MzcsLTEuNzc4NDg4 Messages : 348 Sujets : 22 Points: 56 Inscription : Aug 2011 |
Linux reversing ?
Source originale : http://repository.hwc-crew.com//Docs/Sec...y_fr0g.txt
(J'ai retiré les accents pour éviter les problèmes d'encodage sur le repo) [COLOR="Orange"]################################ # Author : fr0g (hwc-crew.com) # Mail : fr0g@hwc-crew.com OR fr0g.security@gmail.com # Website : http://hwc-crew.com # # Special Thank'x : # # - int_0x80 (big-daddy.fr) # - eko ################################[/COLOR] Introduction au réversing sous GNU/Linux x86 Avant toute chose, je tiens à préciser qu'il est préférable d'avoir quelques connaissances en langage assembleur afin de comprendre ce paper, (et de connaitre correctement le fonctionnement de Linux) [SIZE="3"]# 1/ Les outils Nécessaires[/SIZE] Pour vous expliquer le but de cet article, je le rédige dans le but de familiariser un peu les débutants en R-E sur Linux, avec les outils gratuits les plus courants sur notre cher système open source (ayant moi-même eut des difficultés quand je me suis retrouve avec les outils de Linux entre les mains, alors que j'avais l'habitude de OllyDbg sous Windows.) Les outils que nous allons utiliser ici sont : - GDB (désassembleur/débugger pour Linux) - KhexEdit (éditeur hexadécimal pour interface KDE, il en existe évidemment d'autres comme Ghexedit (sous Gnome)) [size="3"]2# / Le désassemblage[/size] Bon commençons, pour la démonstration j'ai utilise un crack-me du site root-me.org (le code obtenu ne sera pas celui qui valide la vrai épreuve, afin de ne pas spolier leur travail) Afin de désassembler notre programme (appelé ch1.bin), on lance le terminal, accédez au dossier contenant ch1.bin via la commande "cd" : Code : fr0g@XUB:~$ cd Desktop Ensuite, lancez GDB avec en paramètre le nom du fichier a désassembler: Code : fr0g@XUB:~/Desktop$ gdb ch1.bin A partir de la, ch1.bin est ouvert par GDB, il vous suffit maintenant de désassembler le programme à partir de son point d'entrée (appelé "main" par défaut): Code : (gdb) disass main A partir de la ligne 0x08048700, on voit que le code teste si EAX = 0 (test %eax,%eax), et fais un saut inconditionnel (JNE (JUMP if NOT EQUAL)) après. Code : 0x08048700 <main+99>: call 0x80484d8 <strcmp@plt> Plaçons un BreakPoint sur l'instruction call 0x80484d8, grâce à la commande : Code : (gdb) b *main+99 on lance ensuite notre programme en tapant "run" : Code : (gdb) run On entre un passe bidon (dans mon cas "AAAAAA"), le programme va évidemment nous dire que le password est invalide ^^ (sinon c'est pas drôle) mais avant cela, il va faire une pause sur le BreakPoint : Code : Veuillez entrer le mot de passe : AAAAAA Maintenant, jetons un oeil au registre $eax (qui a été manipule dans les précédentes instructions) : Code : (gdb) print Bof, un résultat qui à première vue ne nous dit pas grand chose, cependant, si on affiche le contenu de eax sous forme de chaine de caractères, on obtiens cela : Code : (gdb) x/s Le code que nous avons entré, c'est bien, mais cela ne nous avance pas beaucoup ^^. penchons nous donc sur l'instruction suivante dans le code qui était : Citation :0x08048707 <main+106>: jne 0x804871e <main+129> Plaçons un BreakPoint dessus, comme tout à l'heure : Code : (gdb) b *main+106 Puis, on va dire au programme de continuer jusqu'au prochain breakpoint : Code : (gdb) c Bon revenons à l'instruction JNE, comme je l'ai explique plus haut (et si vous connaissez un peu l'ASM, vous devez le savoir) il s'agit d'un saut "si les valeurs comparées ne sont pas égales), on voit donc que le programme va sauter à la ligne 0x804871e si les valeurs comparées sont inégales. Nous allons donc modifier cette instruction, on va demander à GDB de nous renvoyer la valeur hexadécimale de l'instruction JNE en question, puis, appuyez plusieurs fois sur Entrée pour obtenir les valeurs hexadécimales suivantes: Code : (gdb) x/b 0x08048707 le 0x75 (75 hexa) correspond a l'instruction JNE "brute", les valeurs suivantes (soit : 0x15, 0x8b, 0x45) correspondent aux valeurs suivantes du code. NOTE : Il est important de savoir que si on demande à gdb de nous renvoyer la valeur hexa de la ligne de code ou est le JNE en question, celui ci nous renverra : Code : (gdb) x/x 0x08048707 L'ordre des valeurs est inversé ? Explication de la part de teach Citation :L'ordre n'est pas inversé à cause de la pile mais plutôt à cause de l'endianness des processeur intel x86 (little endian): lorsqu'un entier sur 32 bits est enregistré en mémoire, les extra-terrestres qui nous ont fait cadeau à nous humbles terriens du processeur intel ont arbitrairement choisi cette convention d'enregistrer les octets "à l'envers" (mais on me souffle discrètement que ce n'était pas si arbitraire que ça en avait l'air car la lecture du même entier se trouve optimisée si le processeur dispose de registres de tailles différentes). Dans leur ultime sagesse, les E.T ne tolèrent cependant pas que ce choix soit remis en question Notez donc la valeur "75158b75" dans par exemple un fichier texte (ou dans votre tête :p ), nous allons maintenant modifier notre programme via KhexEdit, pour cela, lancez KhexEdit dans un second terminal avec en paramètre le nom du programme (ch1.bin) [size="3"]# 3/ L'édition en hexadécimal[/size] KhexEdit s'ouvre et nous affiche le code du programme (en hexadécimal), de tête ce n'est pas vraiment compréhensible, mais nous savons déjà ce que nous cherchons la séquence hexadécimale : 75158b45 Il suffit alors de chercher cette séquence en la tapant dans la barre de recherche de KhexEdit (ou en faisant CTRL+F) Boom, le programme la trouve (et il n'y en a qu'une, on a de la chance ) NOTE : Pourquoi n'ai je pas simplement tape 75 (pour JNE) ? Car le 75 peut apparaitre plusieurs fois dans un programme (c'est d'ailleurs souvent le cas) mais une séquence contenant 75****** apparait plus difficilement plusieurs fois dans le même fichier) On va donc remplacer le 75 par un 74 (74 = JE (Jump if Equal)), soit remplacer la chaine recherchée : 75158b45 par 74158b45 . On enregistre le code (fermez GDB sinon vous n'aurez pas la permission de modifier le programme) On relance notre programme dans la console : Code : fr0g@XUB:~/Desktop$ ./ch1.bin (en réalité une fois cracké, le programme nous donne le code qui valide l'épreuve, je ne l'ai pas affiche ici) NOTE : Étant donne que l'on a remplacé JNE par un JE via l'éditeur hexadécimal, si l'on entre le vrai password dans le programme, celui ci nous renverra le message d'erreur, pour éviter cela, on peut remplacer le 75 (JNE) par un 90 (NOP) qui n'exécute aucune instruction) Voila, j'espère que ce tuto vous aura un peu aide à comprendre les fonctionnements et commandes les plus pratiques de GDB sous Linux. Pour finir, je partage ce petit lien de l'ami Xylitol sur le même sujet > http://xylitol.free.fr/Home/craxoring/In...ylitol.rar cordialement, fr0g. |
|
24-08-2011, 19h45
Message : #2
|
|
CyberSee
Admin fondateur de N-PN Messages : 1,721 Sujets : 287 Points: 157 Inscription : Jan 2012 |
Linux reversing ?
J'ai arrangé ton BBCode ;-)
Bravo très bon tuto complet sur la question :-) +20 de REP ;-) |
|
15-10-2011, 16h57
(Modification du message : 22-10-2011, 15h43 par Di0Sasm.)
Message : #3
|
|
teach
Newbie Messages : 8 Sujets : 1 Points: 0 Inscription : Jun 2011 |
Linux reversing ?
Citation :Afin de comprendre pourquoi l'ordre des valeurs est inversé (75 apparait en dernier), documentez vous sur les fonctionnement du processeur, et de la "PILE" (la première valeur à y entrer est la dernière a en sortir) , je n'argumenterai pas sur ce sujet ici .L'ordre n'est pas inversé à cause de la pile mais plutôt à cause de l'endianness des processeur intel x86 (little endian): lorsqu'un entier sur 32 bits est enregistré en mémoire, les extra-terrestres qui nous fait cadeau à nous humbles terriens du processeur intel ont arbitrairement choisi cette convention d'enregistrer les octets "à l'envers" (mais on me souffle discretement que ce n'était pas si arbitraire que ça en avait l'air car la lecture du meme entier se trouve optimisée si le processeur dispose de registres de tailles differentes). Dans leur ultime sagesse, les E.T ne tolèrent cependant pas que ce choix soit remis en question |
|
16-10-2011, 14h02
Message : #4
|
|
fr0g
NTEuNDI2MzcsLTEuNzc4NDg4 Messages : 348 Sujets : 22 Points: 56 Inscription : Aug 2011 |
Linux reversing ?
Merci teach, j'ai édité le tuto pour ajouter ton explication
|
|
« Sujet précédent | Sujet suivant »
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
Reversing de malware android | supersnail | 4 | 400 |
22-03-2018, 03h20 Dernier message: ThomasBr |
|
Introduction au Cracking sur Linux | systemprog | 1 | 330 |
26-10-2011, 23h02 Dernier message: CyberSee |
Utilisateur(s) parcourant ce sujet : 1 visiteur(s)