Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在函数指针内强制转换外壳代码_C++_Nasm_Shellcode - Fatal编程技术网

C++ 在函数指针内强制转换外壳代码

C++ 在函数指针内强制转换外壳代码,c++,nasm,shellcode,C++,Nasm,Shellcode,我试图在32位上执行系统调用,但存在一个问题 我最初有一个裸函数作为我的存根并使用内联汇编,但当我试图将其转换为外壳代码时,尽管它是裸函数的1对1副本(在Visual Studio的反汇编中查看时),它不起作用(访问冲突执行NULL) 顺便说一句,它与裸函数完美结合 以下是我编写的外壳代码: 0: b8 26 00 00 00 mov eax,0x26 5: 64 ff 15 c0 00 00 00 call DWORD PTR fs:0xc0 c: c3

我试图在32位上执行系统调用,但存在一个问题

我最初有一个裸函数作为我的存根并使用内联汇编,但当我试图将其转换为外壳代码时,尽管它是裸函数的1对1副本(在Visual Studio的反汇编中查看时),它不起作用(访问冲突执行NULL)

顺便说一句,它与裸函数完美结合

以下是我编写的外壳代码:

0:  b8 26 00 00 00        mov    eax,0x26
5:  64 ff 15 c0 00 00 00  call   DWORD PTR fs:0xc0
c:  c3                           ret
下面是代码:一切正常。内存分配成功,问题是每当我试图调用NtOpenProcess时:它试图执行空指针,导致访问执行冲突

typedef NTSTATUS(NTAPI * f_NtOpenProcess)(PHANDLE, ACCESS_MASK, OBJECT_ATTRIBUTES *, CLIENT_ID *);
 
INT
main(
    VOID
)
{
    HANDLE            hProcess  = NULL;
    OBJECT_ATTRIBUTES oaAttributes;
    memset(&oaAttributes,
           NULL,
           sizeof(oaAttributes));
    oaAttributes.Length         = sizeof(oaAttributes);
 
    CLIENT_ID        ciClient;
    ciClient.UniqueProcess      = GetCurrentProcessId();
    ciClient.UniqueThread       = NULL;
    
    BYTE Stub[] = { 0xB8, 0x00, 0x00, 0x00, 0x00, 0x64, 0xFF, 0x15, 0x0C, 0x00, 0x00, 0x00, 0xC3 };
    *(DWORD*)(Stub + 1) = 0x26;
    PVOID Mem = VirtualAlloc(NULL, sizeof(Stub), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    memcpy(Mem, &Stub, sizeof(Stub));
    DWORD Old = NULL;
    VirtualProtect(Mem, sizeof(Stub), PAGE_EXECUTE, &Old);
 
    f_NtOpenProcess NtOpenProcess = (f_NtOpenProcess)Mem;
 
    DWORD Status = NtOpenProcess(&hProcess,
                                 PROCESS_ALL_ACCESS,
                                 &oaAttributes,
                                 &ciClient);
 
    printf("Status: 0x%08X\nHandle: 0x%08X\n",
           Status,
           hProcess);
 
    getchar();
 
    return NULL;
}

如果有人想知道我为什么要这样做,我真的很无聊,我喜欢在这样做的时候乱搞代码:)

正如Micheal Petch所指出的,外壳代码是错误的。 我只遗漏了一个应该是0xC0的字节(0x0C)


如果有人尝试过像我这样愚蠢无用的事情,请先仔细检查你的外壳代码

如果您显示完整的代码,如
include
行,这会有所帮助。一个问题是您在
存根
数组中使用
0x0C
,它应该是
0xC0
@MichaelPetch I仅包括stdio.h和windows.h