首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >黑客如何在没有源代码的情况下发现缓冲区溢出?

黑客如何在没有源代码的情况下发现缓冲区溢出?
EN

Security用户
提问于 2021-02-15 18:49:14
回答 1查看 486关注 0票数 2

我是网络专业的学生,我们学习网络安全,但我们不深入学习缓冲区溢出漏洞,我理解它是如何工作的,但我不明白黑客如何检测到这个漏洞。这是很困难,还是可以很容易地用一些技术?

EN

回答 1

Security用户

回答已采纳

发布于 2021-02-15 21:43:17

有很多种方法。不过,最常见的可能是模糊和逆向工程。

模糊化是一种自动安全测试形式,在这种情况下,程序使用不可信的输入(例如文件解析器、接受来自低特权代码的IOCTL的驱动程序、网络服务器或连接到不受信任服务器的网络客户端)反复受到算法生成的输入的影响。模糊化有几种变体,例如突变模糊(在测试前有效输入随机变化)和代际模糊化(对模糊对象进行预期数据格式的描述,然后生成近似于(尽管不一定遵循)该格式的输入)。对于给定的数据规范,模糊化也可以是从完全随机更改到完全确定性的任何地方,尽管大多数模糊化器介于两者之间(它们使用一些逻辑来确定输入中的有趣位置,而感兴趣的值则将其更改为,但实际细节是随机的)。这种随机性意味着模糊通常不能对程序进行详尽的测试,但它仍然是查找漏洞的一种非常有效的方法。

被模糊化的程序在调试器下运行,调试器将检测崩溃的时间、地点和原因(或表现出其他不受欢迎的行为,如失去响应或使用过高的内存)。即使没有调试符号(更不用说源代码),通常也可以确定程序遇到什么样的异常,安全研究人员可以使用这种异常来估计可被利用的可能性(例如,进程试图执行非可执行地址的NX冲突,或者程序试图写入只读地址或未映射地址的写入访问冲突/分段错误,两者都可能被利用)。在每一次崩溃或其他表明程序无法处理输入的情况下,fuzzer记录崩溃转储、失败类型和导致问题的特定输入。然而,模糊输入本身不太可能是有用的攻击(除了可能导致拒绝服务程序崩溃),因此将漏洞(利用开发)武器化通常需要更多的工作。

逆向工程是指在没有实际设计的情况下,计算出某物的设计细节的过程。特别是在软件环境中,它通常涉及将二进制代码分解成人类可读的汇编语言,并可能“反编译”以生成更高层次的编程语言,更易于理解和导航。无论是反汇编还是反编译都不能可靠地生成原始源代码。例如,像注释这样的东西不可避免地会丢失,许多语言不会以其编译的形式维护数据类型信息,优化可以重新排列代码和折叠常量等等,这些方法很难让人读懂,而且表达某些编程概念的方法有很多种(forwhile循环在逻辑上是可以互换的,尽管它们看起来有点不同)。然而,有些工具在大多数程序中都能很好地完成工作,有些人在阅读这些工具的输出时非常熟练,就像他们阅读实际的人工编写的源代码一样。(此外,有些语言非常容易反编译,尽管这些语言通常包括内置保护,特别是防止缓冲区溢出。)

在没有源代码的情况下利用开发通常需要大量非常集中的反向工程,其中详细检查易受攻击的代码,以确定哪些输入将具有所需的结果。这通常是一个有点交互的过程,包括在调试器下多次运行程序,单步遍历易受攻击的代码,查看寄存器和内存布局的具体情况,然后更改输入,使易受攻击的程序执行所需的操作(通常加载“外壳代码”或类似的代码,以便能够执行任意程序)。这个过程是相同的,不管漏洞是通过模糊、整个二进制的逆向工程或其他方法发现的。

票数 4
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/244870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档