Fle*_*exo 27
完全没有理由确定它是确定性的,事实上它可能有一些好处,它不是确定性的,例如增加利用漏洞的复杂性(参见本文).
这种随机性有助于使利用更难写.要成功利用缓冲区溢出,通常需要做两件事:
如果内存位置不可预测,那么跳转会变得非常困难.
标准§7.20.3.3/ 2中的相关引用:
malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的
如果打算使其具有确定性,那么就可以明确说明.
即使它今天看起来确定性,我也不会打赌它更新的内核或更新的libc/GCC版本.
这完全取决于malloc
实施.没有固有的原因可以解释为什么特定的malloc
实现会引入非确定性(除了可能作为应用程序模糊测试,但即使这样,它也应该默认禁用).例如,Doug Leamalloc
不使用rand(3)
或使用任何类似的方法.
但是,因为malloc
使如调用内核sbrk(2)
或mmap(2)
Linux或VirtualAlloc
Windows上,这些系统调用可能并不总是确定的,即使在其他方面相同的过程.内核可能会mmap
出于某种原因决定故意在不同的进程中提供不同的'ed地址.
因此,对于通常在没有系统调用的情况下在用户空间中进行服务的小分配,很可能在a之后生成的指针将是相同的fork()
.由系统服务的大型分配可以是相同的.
但总的来说,不要依赖它.如果您确实需要在单独的进程中使用相同的指针,请在分叉之前创建它们,或者使用共享内存并适当地共享它们.