C 绕过地址随机化和堆栈粉碎保护的可行性——缓冲区溢出攻击

C 绕过地址随机化和堆栈粉碎保护的可行性——缓冲区溢出攻击,c,security,unix,assembly,buffer,C,Security,Unix,Assembly,Buffer,我只是研究了UNIX中2.6以上内核版本中可用的缓冲区溢出攻击和相关保护机制背后的逻辑,以避免缓冲区溢出攻击地址随机化和堆栈粉碎保护 在每次编译以分析缓冲区溢出攻击时,我们都会禁用地址随机化,将“0”分配给内核地址随机化和堆栈粉碎保护,包括-fno Stack protector 只是想知道,是否有任何旁路保护机制,而不必做上述两项活动,只是禁用,而它仍然是强制性的。如果有这样的机制,我会很高兴听到,你能帮忙吗 据我所知,避免缓冲区溢出的最佳方法是使用100%完全穷举的单元测试来检查处理任何大小

我只是研究了UNIX中2.6以上内核版本中可用的缓冲区溢出攻击和相关保护机制背后的逻辑,以避免缓冲区溢出攻击地址随机化和堆栈粉碎保护

在每次编译以分析缓冲区溢出攻击时,我们都会禁用地址随机化,将“0”分配给内核地址随机化和堆栈粉碎保护,包括-fno Stack protector


只是想知道,是否有任何旁路保护机制,而不必做上述两项活动,只是禁用,而它仍然是强制性的。如果有这样的机制,我会很高兴听到,你能帮忙吗

据我所知,避免缓冲区溢出的最佳方法是使用100%完全穷举的单元测试来检查处理任何大小和类型的缓冲区的任何函数。当然,这并不总是现实的

穷举意味着考虑了所有可能的情况,不管您的应用程序是否会在您第一次编写代码时生成所有这些特定情况

尽管有一些工具可以在这个领域帮助你。有些是相当好的自动化,将自动生成单元测试。我从来没有试过,所以我不能保证任何一个,但如果你在一个时间紧迫,这可能会有所帮助

另一种可行的方法是对代码运行静态分析器。代码Coverity是我在过去使用过的一个,但是还有很多其他的。在大多数情况下,静态分析只会捕获在堆栈上声明静态缓冲区的问题,如:

 char buf[256];
 ...
 char a = buf[256];  // <- bug here, although not too bad
 buf[256] = a;       // <- bug here, could be bad, you're writing to the stack!
现在。。。在Unix下,缓冲区溢出有两个问题。在大多数情况下,它会使系统崩溃。但是,如果黑客可以访问您的代码,那么他们可能会将特定的系统函数称为内核函数。在这种情况下,潜在的问题是,如果您的流程使用提升的用户运行,即最坏情况:root。在这一点上,黑客可能已经获得了一些权限,可以在没有你授权的情况下做更多的事情。为了消除这种风险,您有两种主要的解决方案:

使用chroot环境;如果您是Linux新手,这可能很难设置,但这适用于虚拟所有Unice 使用virtualbox环境或qemu等其他虚拟系统;获得这样的环境设置通常非常容易,不过如果您想自动生成新环境。。。有一个API,它可能是乏味的。 还有最后一种方法,但可能很慢。CPU有一个MMU。您可以使用MMU来保护/取消保护内存,并确保每次读写都发生在堆栈中分配的缓冲区上,帧缓冲区用于确保您在正确的窗口内。正如您可以想象的那样,对于每一次写入和可能的多次读取,您都会得到一个中断,并且处理程序并不小。调试一个有许多缓冲区溢出的软件是一个很好的工具/想法,但一般来说,它在生产中不可用

不幸的是,默认情况下,这些选项都不是g++套件的一部分