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:
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