gpt4 book ai didi

c++ - 无法溢出 Shell 编码的缓冲区

转载 作者:行者123 更新时间:2023-12-05 03:17:19 25 4
gpt4 key购买 nike

我有这个 shell 代码,可以打开一个 MessageBox。它在使用 https://github.com/NytroRST/ShellcodeCompiler 测试时有效, 但是当我使用 c 创建一个新的控制台应用程序并尝试编译它时

#include <stdio.h>
#include <Windows.h>

unsigned char rc[] = "\x31\xC3\x89\x64\xE2\x80\xB9\x41\x30\xE2\x80\xB9\x40\x0C\xE2\x80\xB9\x70\x14\xC2\xAD\xE2\x80\x93\xC2\xAD\xE2\x80\xB9\x58\x10\xE2\x80\xB9\x53\x3C\x01\xC3\x9A\xE2\x80\xB9\x52\x78\x01\xC3\x9A\xE2\x80\xB9\x72\x20\x01\xC3\x9E\x31\xC3\x89\x41\xC2\xAD\x01\xC3\x98\xC2\x81\x38\x47\x65\x74\x50\x75\xC3\xB4\xC2\x81\x78\x04\x72\x6F\x63\x41\x75\xC3\xAB\xC2\x81\x78\x08\x64\x64\x72\x65\x75\xC3\xA2\xE2\x80\xB9\x72\x24\x01\xC3\x9E\x66\xE2\x80\xB9\x0C\x4E\x49\xE2\x80\xB9\x72\x1C\x01\xC3\x9E\xE2\x80\xB9\x14\xC5\xBD\x01\xC3\x9A\x31\xC3\x89\x53\x52\x51\x68\x61\x72\x79\x41\x68\x4C\x69\x62\x72\x68\x4C\x6F\x61\x64\x54\x53\xC3\xBF\xC3\x92\x92\xC3\x84\x0C\x59\x50\x31\xC3\x80\x66\xC2\xB8\x6C\x6C\x50\x68\x33\x32\x2E\x64\x68\x75\x73\x65\x72\x54\xC3\xBF\x54\x24\x10\xC6\x92\xC3\x84\x0C\x50\x31\xC3\x80\xC2\xB8\x6F\x78\x41\x23\x50\xC6\x92\x6C\x24\x03\x23\x68\x61\x67\x65\x42\x68\x4D\x65\x73\x73\x54\xC3\xBF\x74\x24\x10\xC3\xBF\x54\x24\x1C\xC6\x92\xC3\x84\x0C\x50\x31\xC3\x80\xC2\xB8\x65\x73\x73\x23\x50\xC6\x92\x6C\x24\x03\x23\x68\x50\x72\x6F\x63\x68\x45\x78\x69\x74\x54\xC3\xBF\x74\x24\x20\xC3\xBF\x54\x24\x20\xC6\x92\xC3\x84\x0C\x50\x31\xC3\x80\xC2\xB8\x59\x6F\x75\x23\x50\xC6\x92\x6C\x24\x03\x23\x68\x41\x72\x65\x20\x68\x48\x6F\x77\x20\x68\x48\x65\x79\x20\x54\x31\xC3\x80\x50\x68\x54\x65\x73\x74\x54\x31\xC3\x80\x50\xC3\xBF\x74\x24\x04\xC3\xBF\x74\x24\x14\x31\xC3\x80\x50\xC3\xBF\x54\x24\x34\x92\xC3\x84\x20\x31\xC3\x80\x50\xC3\xBF\x54\x24\x04\x6e";

int main() {
(*(void(*)()) rc)();
}

它在运行后总是抛出一个访问冲突异常,如果我改变 shell 代码注入(inject)位置的内存保护,我可以摆脱这个异常。但是它仍然不显示 MessageBox。我确信 shell 代码有效,因为上面的链接有一个测试 shellcode 的程序并且它可以完美运行。他们的开发方法之间的唯一区别是他们使用 c++ 来做,而我使用 c。

最佳答案

因为您正在尝试调用 rc 的地址,它是 Memory ProtectionPAGE_READWRITE,因此出现访问冲突错误。

您必须分配一个缓冲区并将保护设置为 PAGE_EXECUTE_READ 才能使其正常工作。

辅助函数:

void* AllocFunction(const void* rawData, const size_t size)
{
void* pFunction = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE);
if (pFunction == nullptr) throw;

memcpy(pFunction, rawData, size);

DWORD dwOldProtect;
if (!VirtualProtect(pFunction, size, PAGE_EXECUTE_READ, &dwOldProtect)) throw;

return pFunction;
}

用法:

void (*lpFunction)() = nullptr;
*(void**)&lpFunction = AllocFunction(rc, sizeof(rc));

lpFunction();

关于c++ - 无法溢出 Shell 编码的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74169044/

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