我的任务是在Linux中设计和编写一个新的内存覆盖测试工具,它可以捕获因动态分配的内存中的覆盖而导致的错误。
这样做的一个好方法是,如果用户请求x个字节,则分配x + r个字节。使用mprotect
不能访问r字节,因此如果用户程序运行到该部分,它将停止生成SIGSEGV。
但上述情况中的问题是,mprotect
需要映射内存(mmap
),并且每次有malloc
请求映射时,x + r字节实际上都是开销。
你能建议其他方式吗?或者,如果你使用过这样的工具,还是任何代码片段?
P.S:任何人都可以共享他们知道或使用过的任何此类开源工具的设计文档吗?
答案 0 :(得分:2)
一种方法是分配更多内存并在前面和后面填充特定的字节模式,用户数据将位于这些红色区域之间。在重新分配时,您可以检查红色区域图案是否完好无损。 Identifying Memory Management Bugs Within Applications Using the libumem Library更详细地解释了它。
答案 1 :(得分:1)
不是开源产品,但这里有一个technical paper,它详细描述了我们如何为C语言实现CheckPointer。 CheckPointer将检测Valgrind不会发现的错误。
读者可以为C ++做同样的练习: - {
答案 2 :(得分:0)
如果你想使用mprotect,你需要按页面工作
假设用户想要x个字节,假设x <= 4K(x> 4K使其复杂化)。
使用mmap(为您提供对齐的页面)分配8K,使用mprotect对第二页进行写保护。
当返回给用户时,不要给他指向第一页的指针,但是p + 3096-x
现在他可以访问x字节,并且在尝试写入后会崩溃。