Bonjour à tous

tout d'abord, je précise que je ne m'y connais pas du tout en ASM, et je suppose que le problème que j'expose ici est trivial pour vous.

J'ai souhaité faire une petite expérience avec un code C basique que voici :

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
 
unsigned char buf[] = "\x31\xdb";
 
 
int main(void){
        ((void (*)(void)) buf)();
        return 0;
 
}

Il s'agit simplement d'un programme qui réalise un appel vers buf, contenant un simple xor ebx, ebx
A l'exécution, si je débug le tout avec gdb et que j'affiche les instructions ASM, j'arrive à quelque chose comme ça :

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
0x080483db <+0>:	lea    ecx,[esp+0x4]
0x080483df <+4>:	and    esp,0xfffffff0
0x080483e2 <+7>:	push   DWORD PTR [ecx-0x4]
0x080483e5 <+10>:	push   ebp
0x080483e6 <+11>:	mov    ebp,esp
0x080483e8 <+13>:	push   ecx
0x080483e9 <+14>:	sub    esp,0x4
0x080483ec <+17>:	mov    eax,0x804a014
0x080483f1 <+22>:	call   eax
0x080483f3 <+24>:	mov    eax,0x0
0x080483f8 <+29>:	add    esp,0x4
0x080483fb <+32>:	pop    ecx
0x080483fc <+33>:	pop    ebp
0x080483fd <+34>:	lea    esp,[ecx-0x4]
0x08048400 <+37>:	ret
et mon buffer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
0x0804a014 <+0>:	xor    ebx,ebx
0x0804a016 <+2>:	add    BYTE PTR [eax],al
Seulement voilà, l'instruction xor ci-dessus provoque un SIGSEGV et je n'arrive pas à comprendre pourquoi.
A noter que ce comportement n'intervient que si j'ai une instruction call vers le buffer
(ne serait-ce pas d'ailleurs plus logique que ce soit elle qui lève le sigsegv ? Mais si oui, pourquoi ? Et pourquoi l'exception n'est levée qu'après l'exécution du xor ?)

Merci d'avance pour vos lumières