ОК, теперь давайте проверим ваш код.
char code[]="\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01"\
В приведенной выше строке создается глобальный массив символов с именем code
, который был инициализирован с помощью набора шестнадцатеричных символов.Память для char[]
будет выделена в data-segment
.
int (*func)();
В приведенной выше строке объявляется pointer-to-a-function
, который не принимает аргументов и возвращает int
.Память для этого будет выделена в stack
, но ожидается, что эта переменная будет указывать на область памяти, в которой хранится code
func = (int (*)()) code;
. Вышеуказанные строки приводят code
(global-character-array
) исделать func
(pointer-to-a-function
), чтобы указать на это!Это действие является неопределенным поведением, потому что переменная stack
, которая должна указывать на code-segment
, теперь указывается на data-segment
.
Даже если назначение выполнено успешно (может быть из-за чуда) тогда отмена ссылки на них в следующей строке определенно не сработает!
Для получения дополнительной информации о том, как переменные расположены в сегментах heap
, stack
и code
, обратитесь к это