Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : août 2018
    Messages : 2
    Points : 4
    Points
    4

    Par défaut Aide à la compréhension de quelques lignes d'ASM

    Bonjour tout le monde,

    Dans le cadre d'un petit challenge interne en entreprise cet été, nous avons un petit code assembleur à lire afin de retrouver un texte caché.
    C'était l'occasion pour moi de me plonger pour une première fois dans cet art obscure, étant plutôt habitué à la magie du C++ :-)

    Voici le code en question ainsi que ce que j'en ai compris (désolé, ce sont mes notes un peu en vrac ^^') il y a donc peut être des énormités...
    Accepteriez vous de m'aider à saisir ce que font les trois instructions en rouge?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Disassembly of section .text:
    000000000040056d <print_flag>:
      40056d:       55                      push   %rbp                     //ODEF
      40056e:       48 89 e5                mov    %rsp,%rbp                //After this, %rbp points to the base of main‘s stack frame.
      400571:       48 83 ec 10             sub    $0x10,%rsp               //Enlève 10 à la stack?
      400575:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)          //this instruction stores 0 at %rbp - 4 
      40057c:       eb 1f                   jmp    40059d <print_flag+0x30> //unconditionnal jump : go to 40059d
      40057e:       8b 45 fc                mov    -0x4(%rbp),%eax          //Copie %rbp - 4 dans EAX
      400581:       48 98                   cltq                            //Je pige pas... Semble permettre d'étendre la taille du registre :s
      400583:       0f b6 80 70 06 40 00    movzbl 0x400670(%rax),%eax      //Load le byte %eax + %ecx + 1  (la ligne 400670, en gros)
      40058a:       d0 e8                   shr    %al                      //Que ce passe t'il ici? Dixit google c'est un equivalent de SHR AL,1 : Shift droit de AL et de 1 AL étant l'octet de poids faible de AX
      40058c:       0f b6 c0                movzbl %al,%eax                 //Et là?                                                                                           
      40058f:       83 c0 30                add    $0x30,%eax               //On ajoute 0x30 à la valeur                                                                                           
      400592:       89 c7                   mov    %eax,%edi                                                                                                           
      400594:       e8 a7 fe ff ff          callq  400440 <putchar@plt>
      400599:       83 45 fc 01             addl   $0x1,-0x4(%rbp)
      40059d:       8b 45 fc                mov    -0x4(%rbp),%eax          //Copie %rbp - 4 dans EAX
      4005a0:       83 f8 0f                cmp    $0xf,%eax                //compare EAX avec 0xF
      4005a3:       76 d9                   jbe    40057e <print_flag+0x11> //Saute si EAX est plus petit ou égal à 0xF
      4005a5:       bf 0a 00 00 00          mov    $0xa,%edi
      4005aa:       e8 91 fe ff ff          callq  400440 <putchar@plt>
      4005af:       c9                      leaveq
      4005b0:       c3                      retq
    
    00000000004005b1 <main>:
      4005b1:       55                      push   %rbp
      4005b2:       48 89 e5                mov    %rsp,%rbp
      4005b5:       48 83 ec 10             sub    $0x10,%rsp
      4005b9:       89 7d fc                mov    %edi,-0x4(%rbp)
      4005bc:       48 89 75 f0             mov    %rsi,-0x10(%rbp)
      4005c0:       bf 80 06 40 00          mov    $0x400680,%edi
      4005c5:       b8 00 00 00 00          mov    $0x0,%eax
      4005ca:       e8 81 fe ff ff          callq  400450 <printf@plt>
      4005cf:       b8 00 00 00 00          mov    $0x0,%eax
      4005d4:       e8 94 ff ff ff          callq  40056d <print_flag>
      4005d9:       b8 00 00 00 00          mov    $0x0,%eax
      4005de:       c9                      leaveq
      4005df:       c3                      retq
    
    
    Contents of section .rodata:
     400660 01000200 00000000 00000000 00000000  ................
     400670 3c3e3626 482c9608 0a7a5e2c 78086e9a  <>6&H,...z^,x.n.
     400680 48657265 20697320 796f7572 20666c61  Here is your fla
     400690 673a00                               g:.
    Merci d'avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ceo
    Inscrit en
    décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Ceo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 17
    Points : 16
    Points
    16

    Par défaut explications...

    cltq
    Cette instruction utilise implicitement le registre RAX et étend le contenu des parties basses (AX,EAX) vers les parties hautes (RAX) par extension de signe (si le nombre est négatif il rajoute des 1 à gauche et s'il est positif, c'est plutôt des 0). D'ailleurs l'instruction qui vient avant dans ton listing, met un nombre dans EAX. C'est ce nombre qui est étendu à 64 bits.

    shr %al
    cette instruction est un alias pour shr al,1. Le but est de décaler les bits du contenu du registre d'une seule position chacun. Le résulat est une division par 2.


    40058c: 0f b6 c0 movzbl %al,%eax //Et là?
    ici cette instruction étend le nombre d'AL (16 bits) à EAX (32 bits) par des ajouts de 0 à gauche. Elle assume que le nombre est positif.

    C'est bon de vouloir comprendre des instructions isolées mais je ne pense pas que cela soit d'une grande aide. Pour te lancer dans une vrai aventure avec l'ASM. Voici un livre qui n'assume aucun prérequis :https://x86asmdemystified.landen.co

    J'espère avoir aidé

    NB: change le titre de compression à compréhension.

  3. #3
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 367
    Points : 7 098
    Points
    7 098

    Par défaut

    Citation Envoyé par cotoporto Voir le message
    cette instruction est un alias pour shr al,1. Le but est de décaler les bits du contenu du registre d'une seule position chacun. Le résultat est une multiplication par 2.
    shr n'est pas un décalage vers la droite ? Donc une division par 2.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ceo
    Inscrit en
    décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Ceo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 17
    Points : 16
    Points
    16

    Par défaut

    Citation Envoyé par Kannagi Voir le message
    shr n'est pas un décalage vers la droite ? Donc une division par 2.
    Tout à fait, une erreur (de taille). shift Right (shr) est bien un décalage vers la droite. C'est ce qui arrive quand on joue au multi-tâche...

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : août 2018
    Messages : 2
    Points : 4
    Points
    4

    Par défaut

    Alors un grand grand merci à tous les deux.

    Vous avez fait de ce premier contact avec l'ASM un succès : j'ai fini par comprendre les 2 trois bétises que j'avais fais et les instructions qui me manquaient.
    Du coup j'ai récupéré le flag pour mon concours.

    J'ai encore un peu du mal à me forcer à attaquer l'ASM par la littérature mais je sais que c'est nécessaire...

    Je marque le sujet comme résolu et je vous remercie du fond du coeur à nouveau.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur quelques lignes en LADDER
    Par gosselien dans le forum Automation
    Réponses: 2
    Dernier message: 21/06/2017, 07h29
  2. Besoin d'aide pour traduire ces quelques lignes
    Par sircus dans le forum Syntaxe
    Réponses: 3
    Dernier message: 09/08/2006, 15h11
  3. Aide sur visual basic?? Quelqu'un peut-il m'aider?
    Par lilipika dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/03/2006, 15h03
  4. GEstion des types! Besoin d'aide il me manque quelques trucs
    Par popogendarme dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 03/02/2005, 18h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo