[
В то время, когда я отвечаю, вопрос о том, почему компиляция не удалась для & hellip;
#include<iostream>
using namespace std;
char sc[] = ""; #i've removed the shellcode
int main() {
int (*func)();
func = (int(*)())sc;
(int)(*func)();
}
Этот код является попыткой выполнить байты данных как машинный код. Однако OP называет это «фрагментом кода для целей тестирования шелл-кода», что никак не связано. И поэтому я включаю этот оригинальный контекст.
]
Вы можете успешно использовать void*
в качестве посредника.
В формальном даже это не должно компилироваться, потому что в формальном указатель данных не может быть преобразован в указатель функции или наоборот.
Однако, как сообщается, Posix требует возможности выполнять это преобразование, и это старая существующая практика, поэтому я полагаю, что большинство, если не все компиляторы, поддерживают это.
Обратите внимание, что вы находитесь на территории UB относительно эффектов.
Также обратите внимание, что проверка разрешений на выполнение антивирусного программного обеспечения и на уровне страниц может немного не совпадать с попыткой выполнить байты в строке как машинный код, так что на этом более высоком уровне вы делаете что-то явно неправильно. ; -)
Кстати, если вы пытаетесь выполнить сценарий оболочки, посмотрите на функцию system
.
Какая команда для передачи в вызове system
будет зависеть от вашей системы, поэтому, если вы измените свой вопрос, обязательно включите информацию об этом.
Приветствия и hth.,