繁体   English   中英

Windows上的缓冲区溢出攻击导致访问冲突

[英]A buffer overflow attack on Windows results in access violation

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

无论我是否在Visual Studio 2010 Debug中运行程序,程序都会跳转到shellcode并几乎开始执行它,但是我遇到了Access Violation错误,程序将不会继续执行shellcode。

为什么我收到此错误? 这是否可以防止Windows中的缓冲区溢出?

将如何让程序在缓冲区执行的shellcode?

编辑:

汉斯(回答)是对的。 这在Windows Internals 5th的安全章节中讨论,错误的原因是Microsoft的可执行空间保护实现

如果这个问题对任何人都有帮助,那么任何赞成票都会受到赞赏

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) );
}

这可能在10年前就有效了。 这些明显的安全漏洞已被修补,现在处理器支持的无执行位是反措施之一。

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

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

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

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

还有其他针对缓冲区溢出攻击的保护可能会使这种情况变得不可能,例如在堆栈帧的每个开始和结束时都有Guard Pages。 有地址空间布局随机化等。 是一篇关于此的文章。

事实上,你的shellcode可能包含nullbytes或其他类型的无效char,它们在转换时不会变成指令或有效地址......这是你要弄清楚的。

请注意,我并未将后一种建议视为滥用。 您有责任 合法且正确地使用此建议。

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

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

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM