我在教程中学习 C并且已经达到了经常提到术语“缓冲区”的地步。
它还提到了某些涉及内存的不良编程实践如何“容易受到缓冲区溢出”的影响。它将缓冲区定义为:
为输入源保留的少量内存
虽然我听说过与恶意软件有关的缓冲区溢出攻击,但我从未理解它是什么或它实际上是如何工作的,尤其是从编程的角度来看。
理想情况下,这可以用“外行”术语来解释,因为我对计算机理论知识知之甚少。
我在教程中学习 C并且已经达到了经常提到术语“缓冲区”的地步。
它还提到了某些涉及内存的不良编程实践如何“容易受到缓冲区溢出”的影响。它将缓冲区定义为:
为输入源保留的少量内存
虽然我听说过与恶意软件有关的缓冲区溢出攻击,但我从未理解它是什么或它实际上是如何工作的,尤其是从编程的角度来看。
理想情况下,这可以用“外行”术语来解释,因为我对计算机理论知识知之甚少。
缓冲区是预先分配的内存区域,您在处理数据时可以在其中存储数据。基本上它只是说从内存中的某个地址直到内存地址 + x Bytes 被保留用于分配数据。在 C 中,这通常称为数组。
当您分配的数据超出缓冲区的容量并覆盖超出内存地址 + x 的代码时,就会发生缓冲区溢出。您之前可能已经这样做了,您会注意到您的程序崩溃了。现在的问题是,缓冲区之外的某个地方是返回地址(这指向在分配缓冲区并将数据加载到其中之后将执行的下一条指令),如果您用随机数据覆盖它,您的程序将崩溃。但是,如果您设法加载字节码(这是一个 CPU 可以直接执行的编译程序)并且您实际上可以使其指向您的程序,那么您可以在该机器上执行代码。
现在您可能认为如果您在本地运行它,这并不是一个真正的问题,但是想象一下在互联网上运行的程序,如 SSH 或 FTP 服务器,或者想象一个受限环境,其中某些程序以提升的权限运行。如果您能够在其他程序的上下文和权限内执行代码,您就可以突破您的限制或接管远程服务器。
如果您想了解更多关于汇编、缓冲区溢出和 shellcode 的信息,我建议您购买 Shellcoder 的手册。这是学习这些东西的书。
当您编写缓冲区时,需要少量内存(例如 16 个字节)。当我现在向缓冲区写入比其容量更多的字节(例如 20 个字节)时,这称为缓冲区溢出。
如果缓冲区中的数据来自外部,这是一个安全漏洞,因为新字节被写入用于其他目的的内存区域。
当覆盖字节的另一个目的是包含程序代码时,您可以想象会发生什么。
在 C 中,缓冲区溢出最常发生在复制到数组(缓冲区)中的数据超过其定义的大小时。 这完美地解释了它。如果您不熟悉汇编,只需阅读那里的 C 代码
为了更好地理解缓冲区溢出,我可以推荐这个站点。它包含非常清晰的解释,但没有解释如何利用溢出后发生的奇怪情况。尽管如此,以下网站解释得更好。
在阅读指南之前,请注意以下几个指示: 内存被划分为段,每个段被划分为位于同一段内某个偏移量的项目:段中的每个项目都在起始位置(偏移量)加上为每种项目分配内存(在内存段中分配对象需要多少字节),因此您应该知道“分段错误”是什么意思,并且永远不要超出编程技术的界限。
第二个指南,使用两种操作系统:Linux和Windows;对偶性非常重要,因为您会看到指令指针的偏移量 ( 0x7c9d30d7) 在漏洞利用编码 ( ) 中以相反的顺序写入buff = 'x90'*230+'xd7x30x9dx7c'+'x43'*366。目标是一个 FTP 服务器,它容易受到堆栈溢出的影响,但在使用键盘输入编写和执行一个小 C 脚本的情况下,幕后的概念是相同的,正如您所建议的。在指南的最后,攻击者在 Linux 主机上侦听 TCP 端口 443 并从 Windows 主机(易受攻击的 FTP 服务器)接收 shell 提示(反向 shell 中的利用)。
由于这些指南,您应该理解我写的那句话:“让软件做其他事情,它最初是用输入数据编程的” 作为建议,我可以建议您从第一个指南开始,然后转到第二个并返回到第一个,只是为了理解可能晦涩的段落。
从黑客的角度来看,XSS、RFI 甚至 SQL 都缺乏兴趣;例如,SQL 语言可用于使用布尔逻辑从数据库中检索(或修改数据)。
当您需要获取有关表、列和记录的信息时,您将条件作为参数传递给 SQL 引擎;这些参数与 AND、OR、NOT 的逻辑一起进行比较。
想象一下,在预定义的 SQL 语句中添加(注入)一个新参数(语法必须正确),其中结果条件对于原始限制条件始终为真;通过这种方式,您可以绕过限制。就是这样,非常简单,不需要任何黑客技术或技能。
顺便说一句,非常感谢作为 NSA EternalBlue(和衍生物)的利用,因为它覆盖了部分身份验证过程(挑战响应),在没有指定密码的情况下连接到资源,并使用 SMBv1 未修补的 Windows 上的隐藏进程间通信通道注入新代码机器。