最近几周,媒体对Stagefright进行了大量关注,Stagefright是Android操作系统的基于C ++的组件,负责播放各种不同的多媒体文件。的怯场利用(本身中更详细地讨论本文中)从根本整数缓冲区溢出和下溢的结果。虽然我们的前一篇文章对此进行了详细的讨论,但此后在撰写该文章后才浮出水面,但该补丁的弱点在于修复Stagefright。是的,当前正在向设备推出的补丁程序已经在最近几天内投放Nexus设备。所以现在我们需要另一个。
不过,有一个(好消息)好消息–新补丁只是对源代码的一行更改。您可以在AOSP gerrit上看到实际的补丁程序,该补丁程序为整数变量添加了另一个边界检查,以防止溢出。
但是,不断出现“上溢和下溢”这个短语,并且本文旨在通过使用一些简单的示例来演示这些示例,您可以在家中学习这些问题的实际含义以及它们的工作方式。我正在Linux上使用GCC C编译器(确切地说是5.2.0版)进行此操作。如果愿意,您可以尝试在家中进行跟踪,并且这些结果在大多数系统上都可以重现。如果不是,或者您不想启动Linux VM或实时CD,请随时阅读-我将向您展示正在编译的代码以及运行时发生的事情。
如果您懂一点C会很有帮助,但这不是必不可少的-我会讲解基础知识。
让我们分配一些内存
几乎所有用C或C ++编写的软件(对于我们这里的目的,后者实际上是前者的扩展)的基础都是内存分配。要存储东西,我们需要内存。为此,我们声明一个变量。这是为整数(整数)声明变量的示例:
我们在这里告诉编译器,我们将创建一个整数。这表明我们需要多少内存(即足以容纳一个标准大小的整数)。我们也将其命名为(a),以便稍后再参考。最后,我们在其中设置一个值(5)–最后一步是可选的。如果不这样做,我们将得到一个未初始化的整数。那是其值不可预测的值,因为它恰好是该内存中的最后值。让我们用一个快速程序尝试一下:
在这里,我们要制作几个数组。数组只是一个类型的组的序列。因此,在这种情况下,整数数组只是几个整数的序列,它们全部排成一行,并连续分配内存。第一个(称为herpDerp)仅用于占用一些空间,以使结果更易于查看。第二个数组称为myArray,包含10个整数。如果我们要在内存中查找myArray的第一个整数的地址,则可以每次向前移动1个地址,并查看数组中的下一个值。实际上,这就是从“ printf”开始的行所做的–它将内容从变量打印到屏幕上。在这里,我们将数组中每个整数的值打印到屏幕上。