规范的缓冲区溢出

2020-11-30 23:04:34

我们可以将缓冲区视为保存我们的数据以供以后使用的容器。实际上,我们在电子,机械,化学甚至政治领域都有缓冲!可以说缓冲这个词只是占位符(临时存储)的一个好名字!

现在,是时候获取更多技术知识并进一步了解计算机科学中的缓冲区了!

在线视频流是缓冲的一个很好的应用,在过去,我们会看到YouTube在等待视频加载时显示怀旧的加载条,这正是我们使用缓冲区的原因!我们需要将视频数据存储在某个地方,以便在我们需要这些数据,因此我们可以直接从计算机的内存中加载数据,因为如果没有临时存储空间来存放数据,就无法真正使Internet连接实时播放实时视频,这就是实时流永远不会与Realtime同步并具有几秒钟的延迟。

该代码段基本上会检查是否有可用数据,然后从标准输入(命令行)中读取数据,并将该数据写回到标准输出(命令行中也是如此)。

假设我们有一个大小为5个字节的任意变量,并且在该变量中存储了一些超过5个字节的值,这是一个简单的缓冲区溢出!

char someVariable [5]; memcpy(someVariable,“你好,世界!\ n”,15); / *我们试图将15个字节复制到5个字节大小的变量* / printf(someVariable);

我们比我们想象的更频繁地遇到缓冲区溢出,您是否曾看到过Segmentation Fault在您的C程序中无处不在?这也是缓冲区溢出,但是您的计算机阻止了它造成任何损坏并停止了程序的运行。

让我们回到我们的5字节溢出变量示例。溢出的数据会怎样?目的地在哪里?它会在虚无中迷失吗?

不,事实上,当我们溢出任何变量时,我们只会覆盖其他数据,这就是问题的核心。我们不能只是覆盖数据并像没有发生任何事情一样行动,如果我们覆盖重要数据该怎么办?如果我们可以覆盖与进程内存和已经运行的程序有关的数据怎么办?这些都是缓冲区溢出的唯一结果,可能会严重损坏计算机

黑客利用缓冲区溢出漏洞时使用的一种基本技术是确定数据被覆盖的位置,并手工溢出数据以将任意代码注入程序中,想象一下该程序是否以提升的特权运行并且黑客控制了其执行流程,你被抓了。

缓冲区溢出在2020年(截至撰写本文时)不像过去的计算机那样流行,所有现代处理器/操作系统都对缓冲区溢出的所有范例和技术都有严格的规定和缓解措施。

基本上,只要您执行任何程序,运行时就基本上将所有内存地址随机化,因此无法对内存地址进行硬编码以利用缓冲区溢出攻击

基本上将内存区域标记为不可执行,从而防止黑客将恶意代码注入内存区域以试图执行该代码。

基本上是在运行时在内存中生成一些随机值,并在从任何函数返回之前检查该随机值是否被覆盖,如果是,则程序退出。

但是同样,这些并不能使您的计算机立于不败之地,而不仅仅是让攻击者更难使用缓冲区溢出攻击来破坏您的系统。

黑客仍然可以使用诸如暴力破解和从内存中泄漏地址之类的不受欢迎的方法来绕过这些缓解措施,但是正确使用这些缓解措施会使缓冲区溢出几乎毫无用处。

还值得注意的是,通过遵循编码最佳实践和避免未过滤的输入等内容,可以防止程序员从缓冲区溢出。