Bonjour,
Je débute avec l'assembleur. Mon objectif est de pouvoir lire aisément l'assembleur mais d'un point de vue ingénierie inverse. J'ai compilé en C, avec GCC sous Fedora Core, un programme très simple que voici:
Désassemblé avec GDB, j'obtiens:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 void main () { }
Et déjà je me questionne sur ce qui se passe. J'ai exécuté ce programme en obtenant les informations sur l'état des registres ainsi que de la pile d'exécution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 (gdb) disas main Dump of assembler code for function main: 0x0804833c <main+0>: push %ebp 0x0804833d <main+1>: mov %esp,%ebp 0x0804833f <main+3>: sub $0x8,%esp 0x08048342 <main+6>: and $0xfffffff0,%esp 0x08048345 <main+9>: mov $0x0,%eax 0x0804834a <main+14>: sub %eax,%esp 0x0804834c <main+16>: leave 0x0804834d <main+17>: ret End of assembler dump. (gdb)
J'ai compilé ce programme sur une plateforme Intel P4.
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
47
48
49
50
51
52 Breakpoint 1, 0x08048342 in main () at example.c:3 3 { (gdb) info registers eax 0x0 0 ecx 0xfeedae1c -17977828 edx 0xfeedae14 -17977836 ebx 0x650ffc 6623228 esp 0xfeedad80 0xfeedad80 ebp 0xfeedad88 0xfeedad88 esi 0x1 1 edi 0x6530fc 6631676 eip 0x8048342 0x8048342 eflags 0x200282 2097794 cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) info frame Stack level 0, frame at 0xfeedad90: eip = 0x8048342 in main (example.c:3); saved eip 0x54ead4 source language c. Arglist at 0xfeedad88, args: Locals at 0xfeedad88, Previous frame's sp is 0xfeedad90 Saved registers: ebp at 0xfeedad88, eip at 0xfeedad8c (gdb) n 0x0054ead4 in __libc_start_main () from /lib/tls/libc.so.6 (gdb) info registers eax 0x0 0 ecx 0xfeedae1c -17977828 edx 0xfeedae14 -17977836 ebx 0x650ffc 6623228 esp 0xfeedad90 0xfeedad90 ebp 0xfeedade8 0xfeedade8 esi 0x1 1 edi 0x6530fc 6631676 eip 0x54ead4 0x54ead4 eflags 0x200382 2098050 cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) info frame Stack level 0, frame at 0xfeedadf0: eip = 0x54ead4 in __libc_start_main; saved eip 0x80482ad called by frame at 0x0 Arglist at 0xfeedade8, args: Locals at 0xfeedade8, Previous frame's sp is 0xfeedadf0 Saved registers: ebx at 0xfeedaddc, ebp at 0xfeedade8, esi at 0xfeedade0, edi at 0xfeedade4, eip at 0xfeedadec
Est-ce que quelqu'un pourrait me dire ce qui se passe sur la pile? J'essaie de suivre le cheminement du ESP et du EBP mais je ne crois pas y arriver.
En fait j'essaie de reconstituer chronologiquement l'étas de tous les registres et de la pile mais l'info que j'ai obtenue avec gdb me cause des maux de tête!!!
Merci.
N.B. J'aurai bien d'autres questions dans un futur rapproché
Merci.
Balises [code] ajoutées par Hdd34. Merci d'y penser à l'avenir
Partager