c++ - 在函数指针内转换 shellcode

标签 c++ nasm shellcode

我正在尝试在 32 位上执行系统调用,但有一个问题。
我最初有一个裸函数作为我的 stub 并使用内联汇编,但是当我尝试将它转换为 shellcode 时,尽管它是裸函数的一对一拷贝(在 Visual Studio 的反汇编中查看它时),它不起作用(访问冲突执行 NULL)。
顺便说一句,它与裸函数完美配合。
这是我写的shellcode:

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 所指出的,shellcode 是错误的。
我只错过了一个应该是 0xC0 的字节 (0x0C)。
如果有人会像我一样尝试如此愚蠢和无用的事情,请先仔细检查您的 shellcode!

关于c++ - 在函数指针内转换 shellcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64846269/

相关文章:

c++ - 使用 void *pointer to object 的安全性

linux - eax 是否始终且仅存储系统调用?

linux - NASM 遍历字节

windows - 如何将 .asm 文件汇编并链接到 Win32 可执行文件?

c - 如何让c代码执行十六进制机器码?

c# - C++ 在 C# 中有类似 List<string> 的东西吗?

c++ - OpenCL 的问题(opencl.dll、AMD APP SDK、cl.h)

c++ - 在返回值的函数中使用内部循环返回

assembly - Shellcoders手册中的汇编指令不一致

python - 我如何在 python 中添加字节数组?