C 防止堆溢出

标签 c heap-memory

考虑以下应该验证密码的函数:

char *systemkey = ...... ;


int validate(char* key) { 
 char* k = malloc(16); 
 char* sk = malloc(16); 
 strcpy(sk,systemkey); 
 strcpy(k,key); 
 return (strncmp(k,sk,16) ==0);
}

如果ksk是连续分配的,因此通过提供 2 个相同的每个 16 字节的 block 很容易破坏该函数。

如果我是编译器/malloc/free/OS 的编写者,有什么方法可以识别大多数这些类型的黑客攻击并阻止它们?

编辑

一种可能的解决方案是在每两个不同的分配之间放置某种金丝雀词。还有别的办法吗?

最佳答案

操作系统所希望使用的最好的结果是 malloc 的实现,它可以随机化它返回的内存。它不能防止溢出,但会使利用它们变得更加困难。对于大型分配,使用的技术是返回与页面末尾对齐的分配,并将下一页显式未映射为保护页面。

你可以读一点on this page以及其中的链接,了解 OpenBSD 如何实现 malloc 保护。据我所知,这是在广泛使用的操作系统中从 malloc 中可以获得的最好结果。

关于C 防止堆溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470267/

相关文章:

c - 字符串值数组中缺少条目

c - 如何知道 c 中是否传递了特定 optarg 选项

c++ - 终端如何在 shell 提示符下以编程方式阻止退格,这样你就不能在它上面退格,例如$ 用于 bash 或 C :\blah\>

使用##运算符创建宏

c - 复制字符串数组时出现错误结果

server - 分析 Java 8 Release 144 中的堆使用情况 - 功能已删除?那么如何分析堆呢?

java - Android:WebView 是否受 Java 堆限制的影响?

objective-c - 堆栈 - 框架 - Objective-C 中的堆

.net - 委托(delegate)总是固定的吗?

java - JDeveloper 堆内存不足