gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:21:56 25 4
gpt4 key购买 nike

我正在尝试在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com