我在很多地方听说缓冲区溢出,C语言中的非法索引可能会危及系统的安全性。但根据我的经验,它所做的一切就是崩溃我正在运行的程序。任何人都可以解释缓冲区溢出如何导致安全问题?一个例子就是很好。
我正在寻找一个概念性的解释,说明这样的事情是如何起作用的。我对道德黑客没有任何经验。
答案 0 :(得分:1)
首先,缓冲区溢出(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'char,内存布局将如下所示:
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那样非常先进但更现实的优秀教程