【发布时间】:2018-03-25 09:20:21
【问题描述】:
我在很多地方都听说过缓冲区溢出,类 C 语言中的非法索引可能会危及系统的安全性。但根据我的经验,它所做的只是让我正在运行的程序崩溃。谁能解释缓冲区溢出如何导致安全问题?举个例子就好了。
我正在寻找一个关于这样的事情如何工作的概念性解释。我没有任何道德黑客的经验。
【问题讨论】:
标签: security buffer-overflow exploit
我在很多地方都听说过缓冲区溢出,类 C 语言中的非法索引可能会危及系统的安全性。但根据我的经验,它所做的只是让我正在运行的程序崩溃。谁能解释缓冲区溢出如何导致安全问题?举个例子就好了。
我正在寻找一个关于这样的事情如何工作的概念性解释。我没有任何道德黑客的经验。
【问题讨论】:
标签: security buffer-overflow exploit
首先,缓冲区溢出(BOF)只是获得代码执行的方法之一。当它们发生时,影响是攻击者基本上获得了对该过程的控制。这意味着攻击者将能够触发进程以当前进程权限执行任何代码(取决于进程是否以系统上的高权限或低权限用户运行,将分别增加或减少利用 BOF 对该应用程序)。这就是为什么始终强烈建议以最少需要的权限运行应用程序的原因。
基本上,要了解 BOF 的工作原理,您必须了解您构建的代码如何编译成机器代码 (ASM),以及软件管理的数据如何存储在内存中。
我将尝试为您提供一个称为基于堆栈的缓冲区溢出的 BOF 子类别的基本示例:
假设您有一个应用程序要求用户提供用户名。
该数据将从用户输入中读取,然后存储在名为USERNAME 的变量中。此可变长度已分配为 20 字节的字符数组。
为了使这种情况正常工作,我们将考虑程序不检查用户输入长度。
在某些时候,在数据处理过程中,用户输入会被复制到USERNAME 变量(20 字节),但由于用户输入较长(比如说 500 字节),因此该变量周围的数据将在内存中被覆盖:
想象一下这样的内存布局:
size in bytes 20 4 4 4
data [USERNAME][variable2][variable3][RETURN ADDRESS]
如果您定义了 3 个局部变量 USERNAME、variable2 和 variable3,则可能会以上面显示的方式存储在内存中。
注意RETURN ADDRESS,这个 4 字节的内存区域将存储调用当前函数的函数的地址(因此,当您在程序中调用函数并读取该函数的结尾时,程序在初始调用该函数之后,流程自然会返回到下一条指令。
如果您的攻击者提供的用户名包含 24 x 'A' 字符,则内存布局会变成这样:
size in bytes 20 4 4 4
data [USERNAME][variable2][variable3][RETURN ADDRESS]
new data [AAA...AA][ AAAA ][variable3][RETURN ADDRESS]
现在,如果攻击者发送 50 * 'A' 字符作为 USERNAME,内存布局将如下所示:
size in bytes 20 4 4 4
data [USERNAME][variable2][variable3][RETURN ADDRESS]
new data [AAA...AA][ AAAA ][ AAAA ][[ AAAA ][OTHER AAA...]
在这种情况下,在函数执行结束时,程序会崩溃,因为它会尝试到达地址无效的地址 0x41414141 (char 'A' = 0x41),因为覆盖的RETURN ADDRESS 不会匹配正确的代码地址。
如果您将多个“A”替换为经过深思熟虑的字节,您也许可以:
RETURN ADDRESS 覆盖到一个有趣的位置。例如,您可以将RETURN ADDRESS 设置为USERNAME 变量的第一个字节的地址(由于已添加到操作系统和已编译程序的许多保护措施,此方法几乎不再可用)。
我知道一开始理解起来很复杂,这个解释是一个非常基本的解释。如果您想了解更多详情,请直接询问。
我建议你看看像this one 这样的教程,这些教程非常先进但更现实
【讨论】: