考虑以下用于验证密码的函数:
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);
}
如果连续分配k
和sk
,则通过提供2个相同的16字节块来轻松破解该功能。
如果我是编写编译器/ malloc / free / OS的人,有什么方法可以识别这些类型的hacks MOST 并阻止它们?
修改
一种可能的解决方案是在每两个不同的分配之间加入某种金丝雀字。还有另一种方式吗?
答案 0 :(得分:0)
你希望使用和操作系统最好的是malloc的一个实现,它随机化它返回的内存。它不会阻止溢出,但会更难以利用它们。对于大型分配,使用的技术是将分配返回到页面末尾,并将下一页显式取消映射为保护页面。
您可以阅读一点on this page及其中的链接,了解OpenBSD如何实现malloc保护。据我所知,这是您在广泛使用的操作系统中从malloc获得的最佳效果。
答案 1 :(得分:0)