4

我刚刚开始研究缓冲区溢出攻击的工作原理,并尝试使用 Visual C 2010 在Windows 7上模拟攻击。缓冲区溢出攻击非常人为,它只是将返回地址覆盖为“缓冲区”局部变量的地址。缓冲区保存 shellcode 字符串。

无论我是否在 Visual Studio 2010 Debug 中运行程序,程序都会跳转到 shellcode并几乎开始执行它,但是我得到一个访问冲突错误,程序将不会继续执行 shellcode。

为什么我会收到此错误?这是对 Windows 中缓冲区溢出的某种保护吗?

如何程序在缓冲区中执行 shellcode?

编辑:

汉斯(答案)是正确的。这在 Windows Internals 5th 的安全章节中进行了讨论,错误的原因是 Microsoft 的Executable Space Protection实施。

如果这个问题对任何人有帮助,任何赞成票都将不胜感激。

void execute_my_shellcode()
{
    char buffer[24];
    memcpy(buffer, "\x6A\x21\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\x6A\x0A\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\xC3", 24); 
    printf("current return address: %p\n", *(int*)((char*)&buffer + 24 + 4));   
    *(int*)((char*)&buffer + 24 + 4) = (int)&buffer; 
    printf("return address is now : %p\n\n", (int*)*(int*)((char*)&buffer + 24 + 4) );
}
4

4 回答 4

7

这可能在 10 年前有效。这些明显的安全漏洞已经被修补,现在处理器支持的不执行位是对策之一。

于 2011-04-10T19:45:58.737 回答
1

还有其他针对缓冲区溢出攻击的保护措施可能使这成为不可能,例如在堆栈帧的每个开始和结束处设置保护页面。有地址空间布局随机化等。 是一篇关于此的文章。

事实上,您的 shellcode 可能包含 nullbytes 或其他类型的无效字符,这些字符在转换后不会变成指令或有效地址……这是您自己弄清楚的。

请注意,我不会给后一个建议以供滥用。您有责任合法正确地使用此建议。

于 2011-04-10T21:16:24.290 回答
1

首先,你的 shellcode 中有空值。回到你的 shellcode 并找到不产生空操作码 (0x00) 的指令,这样你的 shellcode 就不会被视为字符串。

其次,访问冲突并不一定意味着它是某种保护方案的原因。可能(一时兴起)您的返回地址或 shellcode 正试图使 EIP 寄存器跳转到无法在内存中执行的位置。

您将不得不过期更多。每个编译器和计算机都会有所不同。几乎所有事情都有办法。一般来说,您可能想对该主题进行更多研究,但我建议的第一件事是创建一个重复的返回地址,该地址指向 shellcode 之前缓冲区中的 NOP sled,以便您的 shellcode 更有效地执行并且可能更多准确的。

正如您所说,可执行空间保护是正确的,但我上面的回答在大多数情况下都是非正式的和必要的。快乐的黑客:)

于 2012-05-07T17:06:59.573 回答
0

程序到底在哪里中断?您是否尝试过使用OllyDbg逐步执行汇编指令以查看您是否至少开始执行缓冲区或在此之前失败?如果您甚至没有执行缓冲区中的第一条指令,那么很可能堆栈页面(或本例中的数据部分,因为您将其作为字符串文字提供)已被标记为不可执行,您将不得不使用另一种技术. 可能有一种方法可以告诉 Windows 使堆栈页面可执行(或在这种情况下为数据部分)以用于测试/学习目的(我知道 ELF 二进制文件具有可执行堆栈标志,Linux 提供了execstack编辑标志的实用程序)。

如果它在缓冲区中的几条指令后中断,那么很可能是因为缓冲区中的指令试图(间接)调用绝对地址(0xff 0x15 0x40 0x62 0x40 x00=> call dword ptr ds:[406240])并且在 W7 中,地址空间布局随机化(ASLR)可能已启用(I' m 不确定 VS2010 链接器是否默认设置了 PE 标头中的 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 位)。

编辑

根据您添加到问题中的其他信息,我在第一段中提到的不可执行堆栈的问题似乎是罪魁祸首。但是,即使您解决了第二个问题,也可能仍然是一个问题,因为您不知道如果启用了 ASLR,0x00406240 会发生什么。

于 2011-04-10T21:31:15.133 回答