有没有人详细解释如何利用整数?我已经阅读了很多关于这个概念的内容,我理解它是什么,我理解缓冲区溢出,但我不明白如何通过使整数大于它定义的内存....
5 回答
它绝对是可以利用的,但当然取决于情况。
旧版本的 ssh 有一个整数溢出,可以远程利用。该漏洞导致 ssh 守护进程创建一个大小为零的哈希表,并在尝试在其中存储一些值时覆盖内存。
有关 ssh 整数溢出的更多详细信息:http ://www.kb.cert.org/vuls/id/945216
有关整数溢出的更多详细信息:http ://projects.webappsec.org/w/page/13246946/Integer%20Overflows
我在 60 年代后期在 IBM 360/40 上使用 APL/370。APL 是一种语言,其中基本上所有事物都是多维数组,并且有用于操作数组的惊人运算符,包括从 N 维重塑为 M 维等。
不出所料,N 维数组的索引范围为 1..k,每个轴的正k 值不同。k 在法律上总是小于 2^31(32 位有符号机器字中的正值)。现在,一个 N 维数组在内存中分配了一个位置。APL 会根据数组上限检查使用对于轴而言太大的索引来访问数组槽的尝试。当然,这适用于 N == 1 的 N 维数组。
APL 没有检查您是否使用 RHO(数组重塑)运算符做了一些非常愚蠢的事情。APL 只允许最多 64 个维度。因此,您可以创建一个 1-64 维的数组,如果数组维数都小于 2^31,APL 会这样做。或者,您可以尝试创建一个65维的数组。在这种情况下,APL 搞砸了,出乎意料地返回了一个 64 维数组,但未能检查轴大小。(这实际上是“发生整数溢出”的地方)。这意味着您可以创建一个轴大小为 2^31 或更大的数组......但被解释为有符号整数,它们被视为负数。
应用于这样一个数组的正确 RHO 运算符咒语可以将维度减少到 1,其上限为“-1”。称这个矩阵为“虫洞”(你马上就会明白为什么)。这种虫洞阵列在内存中占有一席之地,就像任何其他阵列一样。但是所有数组访问都根据上限进行检查......但是数组边界检查结果是通过 APL的无符号比较完成的。因此,您可以毫无异议地访问 WORMHOLE[1]、WORMHOLE[2]、... WORMHOLE[2^32-2]。实际上,您可以访问整个机器的内存。
APL 还有一个数组赋值操作,您可以在其中用一个值填充数组。WORMHOLE[]<-0 因此将所有内存归零。
我只这样做了一次,因为它删除了包含我的 APL 工作区、APL 解释器的内存,以及明显启用分时的 APL 的关键部分(在那些日子里它没有受到用户的保护)......终端机室从其机械噪音的正常状态(我们有 2741 个 Selectric APL 终端)在大约 2 秒内完全静音。透过玻璃进入计算机室,我可以看到操作员抬头看着 370 上的灯,因为它们都熄灭了。大量的跑来跑去接踵而至。
虽然当时很有趣,但我还是闭上了嘴。
稍加小心,显然有人可能以任意方式篡改了操作系统。
这取决于变量的使用方式。如果你从来没有根据你添加的整数和输入整数做出任何安全决定(对手可能会引发溢出),那么我想不出你会遇到什么麻烦(但这种东西可能很微妙)。
再说一次,我看到很多这样的代码不能验证用户输入(尽管这个例子是人为的):
int pricePerWidgetInCents = 3199;
int numberOfWidgetsToBuy = int.Parse(/* some user input string */);
int totalCostOfWidgetsSoldInCents = pricePerWidgetInCents * numberOfWidgetsToBuy; // KA-BOOM!
// potentially much later
int orderSubtotal = whatever + totalCostOfWidgetInCents;
直到您以 - 21,474,817.95 美元的价格出售 671,299 个小部件的那一天,一切都变得很糟糕。老板可能会生气。
一个常见的情况是通过询问将提供的输入数量,然后尝试强制执行该限制来防止缓冲区溢出的代码。考虑我声称提供 2^30+10 个整数的情况。接收系统分配一个 4*(2^30+10)=40 字节 (!) 的缓冲区。由于内存分配成功,我可以继续。当我发送第 11 个输入时,输入缓冲区检查不会阻止我,因为 11 < 2^30+10。然而我会溢出实际分配的缓冲区。
我只是想总结一下我发现的关于我原来的问题的一切。
事情让我感到困惑的原因是因为我知道缓冲区溢出是如何工作的,并且可以理解如何轻松利用它。整数溢出是一种不同的情况——你不能利用整数溢出来添加任意代码,并强制改变应用程序的流程。
但是,可能会溢出整数,例如,该整数用于索引数组以访问内存的任意部分。从这里开始,可以使用错误索引的数组来覆盖内存并导致应用程序的执行改变为您的恶意意图。
希望这可以帮助。