什么是缓冲区溢出?如何导致缓冲区溢出?
我听说过缓冲区溢出,我想知道如何导致缓冲区溢出。
有人能给我看一个小缓冲区溢出的例子吗?
新的(它们用于什么?)
没有找到相关结果
已邀请:
11 个回复
却岸
编译和运行时会发生什么可能取决于您的操作系统和编译器。
誓猎贰
仅缓冲区溢出通常不会故意发生。它最常发生的原因是所谓的“一个一个”错误。这意味着你错误地计算了数组大小 - 可能是因为你忘了考虑终止空字符,或者因为其他一些东西。 但它也可以用于一些邪恶的东西。实际上,用户很久就知道这个漏洞,然后插入70个字符,最后一个包含一些特殊字节,覆盖一些堆栈槽 - 如果用户真的很棘手,他/她会点击堆栈中的返回地址槽,并覆盖它,使它跳转到刚插入的缓冲区:因为用户输入的不是他的名字,而是他之前编译并转出的shell代码。然后那个人就会被执行。有一些问题。例如,您必须安排在该二进制代码中不要使用“\ n”(因为获取将停止在那里阅读)。对于混乱危险字符串函数的其他方式,二进制零值是有问题的,因为字符串函数会停止将其复制到缓冲区。人们使用
两倍相同的值也产生零,而没有明确写出零字节。 这是经典的做法。但是有一些安全块可以告诉这些事情发生以及其他使堆栈不可执行的东西。但我想有比我刚才解释的更好的技巧。一些汇编人可能现在可以告诉你关于那个的长篇故事:) 如何避免它 如果你不是100%确定缓冲区确实足够大,那么总是使用带有最大长度参数的函数。不要玩“哦,数字不会超过5个字符”这样的游戏 - 它有一天会失败。请记住,一个火箭科学家说这个数字不会超过一定程度,因为火箭永远不会那么快。但是有一天,它实际上更快,结果是整数溢出并且火箭坠毁(这是关于Ariane 5中的一个错误,这是历史上最昂贵的计算机漏洞之一)。 例如,而不是使用
。而不是
使用
适当和可用(或只是C ++风格的东西,如istream和东西)
剿畦缄饥小
在这种情况下,不是关于你可能从互联网上获得的OLD STYLE缓冲区溢出教程。或者aleph一个教程现在不再适用于你的系统了。 现在让缓存溢出方案的程序漏洞
看看strcpy函数是没有堆栈保护的危险,因为函数没有检查我们将输入多少字节。 使用额外选项编译-fno-stack-protector dan -mpreferred-stack-boundary = 2用于在C程序中取消堆栈保护器
具有SUID根访问权限的缓冲区溢出C程序现在我们已经实现了。 现在让我们搜索我们需要将多少字节放入缓冲区以使程序分段出错
你看我们需要404字节才能使程序分段出现故障(崩溃)现在我们需要多少字节来覆盖EIP? EIP是指令执行后。所以黑客会在程序的二进制SUID上覆盖EIP到邪恶指令他们想要的东西。如果SUID根目录中的程序,该指令将以root访问方式运行。
程序GOT分段故障返回码。让我们输入更多的字节并看看EIP寄存器。
再多一点
现在你可以做下一步了......
容淑阔九
粟痢凰副
篮肥炼皖
抢垢洛韧
这使您可以使用缓冲区溢出参数并将它们调整到您的心灵内容。 “黑客 - 剥削的艺术”一书(链接到亚马逊)详细介绍了如何玩缓冲区溢出(显然纯粹是一种智力练习)。
味芯憨
联课
和:
在现代Linux平台上,这可能无法按预期或预期工作。由于FORTIFY_SOURCE安全功能,它可能无法正常工作。 FORTIFY_SOURCE使用“更安全”的高风险函数变体,如
和
。当编译器可以推导出目标缓冲区大小时,编译器会使用更安全的变体。如果副本超过目标缓冲区大小,则程序调用
。 要禁用FORTIFY_SOURCE进行测试,应使用
或
编译程序。
昧伎
公藕