C防止堆溢出

时间:2013-07-04 12:24:45

标签: c heap

考虑以下用于验证密码的函数:

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字节块来轻松破解该功能。

如果我是编写编译器/ malloc / free / OS的人,有什么方法可以识别这些类型的hacks MOST 并阻止它们?

修改

一种可能的解决方案是在每两个不同的分配之间加入某种金丝雀字。还有另一种方式吗?

2 个答案:

答案 0 :(得分:0)

你希望使用和操作系统最好的是malloc的一个实现,它随机化它返回的内存。它不会阻止溢出,但会更难以利用它们。对于大型分配,使用的技术是将分配返回到页面末尾,并将下一页显式取消映射为保护页面。

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

答案 1 :(得分:0)

  

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

一种可能性是使用“声音”静态分析器,如果使用得当,可以保证程序不会访问任何无效指针以执行任何操作。这是one

另一种是使用动态检测。 Valgrind就是这种方法的一个例子。