gcc -S tiprog.c -o tiprog.s |
||
void ma_fonction(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } void main() { ma_fonction(1,2,3); } |
ma_fonction: pushl %ebp movl %esp,%ebp subl $40,%esp leave ret main: pushl %ebp movl %esp,%ebp subl $8,%esp addl $-4,%esp pushl $3 pushl $2 pushl $1 call ma_fonction addl $16,%esp leave ret |
Sauvegarder base pile (Base Pointer) Base pile prend valeur de Sommet pile (Stack Pointer) Réservation mémoire pour les variables locales main: Sauvegarder base pile (Base Pointer) Base pile prend valeur de Sommet pile (Stack Pointer) Empiler >>> (3) >>> les >>> (2) >>> paramètres (1) Appel de la fonction ma_fonction |
$ gcc simpleprog.c -o simpleprog
$ gdb simpleprog (gdb) disassemble bufover (gdb) disassemble main |
||
void bufover() { char buffer[5]; buffer[0] = 0; } int main() { int x; x = 0; bufover(); x = 1; printf("%d\n", x); return 0; } |
Dump of assembler code for function bufover: 0x08048400 <bufover+0>: push %ebp 0x08048401 <bufover+1>: mov %esp,%ebp 0x08048403 <bufover+3>: sub $0x18,%esp 0x08048406 <bufover+6>: movb $0x0,0xfffffff8(%ebp) 0x0804840a <bufover+10>: leave 0x0804840b <bufover+11>: ret Dump of assembler code for function main: 0x08048408 <main+0>: push %ebp 0x08048409 <main+1>: mov %esp,%ebp 0x0804840b <main+3>: sub $0x18,%esp 0x0804840e <main+6>: movl $0x0,0xfffffffc(%ebp) 0x08048415 <main+13>: call 0x8048400 <bufover> 0x0804841a <main+18>: movl $0x1,0xfffffffc(%ebp) 0x08048421 <main+25>: add $0xfffffff8,%esp 0x08048424 <main+28>: mov 0xfffffffc(%ebp),%eax 0x08048427 <main+31>: push %eax 0x08048428 <main+32>: push $0x8048560 0x0804842d <main+37>: call 0x8048310 <__deregister_frame_info+32> 0x08048432 <main+42>: add $0x10,%esp 0x08048435 <main+45>: xor %eax,%eax 0x08048437 <main+47>: jmp 0x8048440 <main+56> 0x08048439 <main+49>: lea 0x0(%esi),%esi 0x08048440 <main+56>: leave 0x08048441 <main+57>: ret 0x08048442 <main+58>: nop |
empiler ebp (de la fonction main) buffer[0] = 0; x = 0; Appel de la fonction bufover() x = 1; |
" x = 1; "
ne soit pas exécutée " x = 1; "
est à l'adresse <main+18>
et la suivante est à l'adresse <main+25> 0xFFFFfff8(%ebp)
correspond
à -8(%ebp)
main()
a été empilée
par call bufover
" buffer[0] = 0; "
,
comme ceci :
STACK ---------- ------------------------------- empilement <----------- ---------- ------------------------------- adresse - -----------> + ---------- -----+---------+----+----+----- taille | 8 | 4 | 4 | ---------- -----+---------+----+----+----- contenu ... | buffer | ebp| ret| ... ---------- --------------------+---------- contexte bufover() | main() ---------- -------------------------------
" x = 1; "
<main+18>
à <main+25>
)
buffer[taille(buffer) + taille(ebp)]
soit
buffer[12]