C++ 在cpp中运行外壳代码

C++ 在cpp中运行外壳代码,c++,function-pointers,shellcode,C++,Function Pointers,Shellcode,我试图在cpp中运行外壳代码(外壳代码来自用户,因此程序应该是动态的) 当我试着运行我的程序时,我得到了一个异常,我想,它告诉我不能从数据段运行代码。 之后,我尝试创建一个新的可执行部分,并将我的数据放在那里,但没有成功 #pragma section(".shell",read,execute)

我试图在cpp中运行外壳代码(外壳代码来自用户,因此程序应该是动态的) 当我试着运行我的程序时,我得到了一个异常,我想,它告诉我不能从数据段运行代码。 之后,我尝试创建一个新的可执行部分,并将我的数据放在那里,但没有成功

#pragma section(".shell",read,execute)                                                                                                                        
__declspec(allocate(".shell"))
unsigned char code[] =
"\xB8\x04\x00\x00\x00";

// Function pointer points to the address of function.
int(*shell)(); //Function pointer
// Initializing a function pointer  with the address of a shellcode
shell = ((int(*)())&code);
// Execute shellcode
int a = shell();

有人能解释一下我做错了什么吗?

你写的都是对的。引发异常的原因是您的外壳代码仅由
mov eax,4
组成。Windows分配器将您的分区与页面大小对齐并用零填充,但
0x00
添加字节ptr[rax],al
的操作码。现在您的外壳代码中不仅有
mov eax,4
,还有:

mov eax, 4
add byte ptr [rax],al
add byte ptr [rax],al
....
mov
之后,您尝试在
eax
addres
0x00000004
处获取值,该位置放置了Windows页面保护。 现在,您在写入“0x0000000000000004”时遇到了
0xc000005:访问冲突

ret
添加到外壳代码:

unsigned char code[] = ""\xB8\x04\x00\x00\x00\xC3"

而且您不会执行未使用的命令并成功退出。

您能提供确切的症状吗?用
字符数组初始化
未签名字符数组不是一个好主意。这是异常-ClientSide.exe中0x0113F005处的未处理异常:0xC0000005:访问冲突写入位置0x81D9BAC0。如果有此异常的处理程序,则程序可以安全地继续。这是因为DEP(数据执行预防)。如果你真的想执行外壳代码,那么禁用DEP应该允许你的外壳代码从数据部分执行是的,但我创建了一个新的可执行部分,并将数据存储在它们的(.shell部分)@yedidya kfir上,如果你有问题,请随时提问,如果这个答案有用,请将其标记为正确答案。