Правильный отладчик скажет вам, что происходит не так. Я могу только догадываться, что ваш код вызывает нарушение прав доступа, поскольку буфер, к которому вы хотите перейти, не является исполняемым.
Вероятно, вы работаете в системе, включенной по умолчанию - DEP , например, Vista или 7, поэтому вы должны убедиться, что ваш шелл-код является исполняемым. Для этого сначала используйте VirtualAlloc
, чтобы выделить новый исполняемый буфер и скопировать в него свой шелл-код, а затем выполнить его:
void *exec = VirtualAlloc(0, sizeof b, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, b, sizeof b);
((void(*)())exec)();
Кстати, вам не нужно завершать шеллкод нулем (C ++ автоматически завершит строковый литерал, но это не обязательно). Вам также не нужно указывать размер:
unsigned char b[] = "\xcc";