Bonjour à tous,
Je m'interesse depuis peu à l'assembleur grace à la belle commande objdump. Néanmoins je tombe sur quelques problemes de compréhension au niveau assembleur et j'aurais bien besoin de vos lumieres.
Voici l'extrait de code :
Pour commencer dans objdump, je ne vois nullpart ou la fonction <_start> est appelé, je vous juste à un moment :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 0000000000000540 <_start>: 540: 31 ed xor ebp,ebp 542: 49 89 d1 mov r9,rdx 545: 5e pop rsi 546: 48 89 e2 mov rdx,rsp 549: 48 83 e4 f0 and rsp,0xfffffffffffffff0 54d: 50 push rax 54e: 54 push rsp 54f: 4c 8d 05 ea 01 00 00 lea r8,[rip+0x1ea] # 740 <__libc_csu_fini> 556: 48 8d 0d 73 01 00 00 lea rcx,[rip+0x173] # 6d0 <__libc_csu_init> 55d: 48 8d 3d 1f 01 00 00 lea rdi,[rip+0x11f] # 683 <main> 564: ff 15 76 0a 20 00 call QWORD PTR [rip+0x200a76] # 200fe0 <__libc_start_main@GLIBC_2.2.5> 56a: f4 hlt 56b: 0f 1f 44 00 00 nop DWORD PTR [rax+rax*1+0x0]
et ca contient 0540, mais il n' y a aucune jmp ou call à l'adresse 540. une idée la dessus ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Contenu de la section .text : 0540 31ed4989 d15e4889 e24883e4 f050544c 1.I..^H..H...PTL 0550 8d05ea01 0000488d 0d730100 00488d3d ......H..s...H.=
ensuite je constate que la taille des instructions (dans la fonction start) vaut parfois 2 octets, puis 3, puis 1, puis plus loin 7... comment le processeur peut savoir que l'instruction vaut parfois des tailles différentes, sachant que la taille de mon bus est de 64 bits soit 8 octets, donc on pourrait penser que toutes les intructions vallent 8 octets ?
je constate a la seconde instruction que l'on place au registre 9 la valeur du registre rdx, et à la 3eme instruction, on recupére la derniere valeur de la pile et on l'affecte a rsi, or on a fait aucun push, et on a placé aucune valeur dans des registres encore. Tout ce qu'il y a avant les différentes fonctions du programme c'est des :
mais je n'ai aucune affectation de registre, ni d'insertion dans la pile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Contenu de la section .interp : ... Contenu de la section .init : ... Contenu de la section .plt : ... Contenu de la section .text : ...
Et derniere question, je ne vois dans mon code aucun syscall, or j'ai un printf dans mon code, j'ai juste :
qui renvoie à l'instruction 200fd0 qui a :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 0000000000000520 <printf@plt>: 520: ff 25 aa 0a 20 00 jmp QWORD PTR [rip+0x200aaa] # 200fd0 <printf@GLIBC_2.2.5> 526: 68 00 00 00 00 push 0x0 52b: e9 e0 ff ff ff jmp 510 <.plt>
et c'est tout ce que j'ai, je ne peux rien voir d'autre. Or je devrais pouvoir voir a l'exécution de mon programme via objdump le contenu de printf qui lance l'appel systeme write.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 0000000000200fb8 <_GLOBAL_OFFSET_TABLE_>: 200fb8: c8 0d 20 00 enter 0x200d,0x0 ... 200fd0: 26 05 00 00 00 00 es add eax,0x0 ...
Il y'a beaucoup de question. Donc je vous remercie d'avance pour votre temps.
Partager