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 :
et mon buffer :
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
Seulement voilà, l'instruction xor ci-dessus provoque un SIGSEGV et je n'arrive pas à comprendre pourquoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 0x0804a014 <+0>: xor ebx,ebx 0x0804a016 <+2>: add BYTE PTR [eax],al
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
Partager