Вы пытаетесь преобразовать указатель объекта shellcode
в указатель на функцию в следующем выражении:
((void (*)())shellcode)();
Это может привести к неопределенному поведению.
Стандарт C99 устанавливает это нараздел об указателях функций:
Даже при явном приведении недопустимо преобразовывать указатель функции на указатель объекта или указатель на void, или наоборот.
Это можно увидеть, когда вы компилируете свой код с опцией -pedantic-errors
в GCC, которая выдает следующую ошибку:
<source>: In function 'main':
<source>:11:6: error: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]
См. Демонстрационную версию здесь .