Я напишу свое предложение в качестве ответа и шлюху для некоторой репутации: -)
Вам необходимо явно привести указатель данных в указатель на функцию.Используя typedef для соответствующего указателя на функцию, вы можете сделать это, не делая код слишком трудным для чтения:
char shellcode[] =
"\x31\xc0"
"\xb0\x01"
"\x31\xdb"
"\xcd\x80";
typedef void (*SHELLCODE)(void);
int main() {
SHELLCODE func = (SHELLCODE) shellcode;
func();
/* ...and this will work as well, which some might find more readable: */
((SHELLCODE) shellcode)();
return 0;
}
Это скомпилируется чисто с помощью clang 1.1, но GCC 4.4.3 все равно выдаст вам предупреждение опреобразование указателя - хотя теперь это более точное предупреждение:
$ gcc -Wall -Wextra -ansi -pedantic shellcode.c
shellcode.c: In function ‘main’:
shellcode.c:10: warning: ISO C forbids conversion of object pointer to function pointer type
shellcode.c:14: warning: ISO C forbids conversion of object pointer to function pointer type
Если пропустить флаг "-pedantic", он будет скомпилирован аккуратно и с GCC, но кто когда-нибудь серьезно относится к этому?