当前位置: 首页 > 面试题库 >

malloc是确定性的吗?

舒斯伯
2023-03-14
问题内容

malloc 是确定性的吗?假设我有一个分叉的进程,即另一个进程的副本,并且在某个时候它们都调用了 malloc
函数。在两个过程中分配的地址是否相同?假设执行的其他部分也是确定性的。

注意:在这里,我只谈论虚拟内存,而不是物理内存。


问题答案:

完全没有理由要使它具有确定性,实际上,没有确定性可以带来一些好处,例如,增加利用漏洞的复杂性(另请参见本文)。

这种随机性可能有助于使漏洞更难编写。要成功利用缓冲区溢出,通常需要做两件事:

  1. 将有效负载传送到可预测/已知的内存位置
  2. 使执行跳转到该位置

如果内存位置不可预测,则跳转变得非常困难。

标准§7.20.3.3/ 2中的相关引用:

malloc函数为大小由大小指定且值不确定的对象分配空间

如果要使其具有确定性,那么可以这样明确地指出。

即使今天看起来是确定性的,我也不会打赌它会保留下来,所以使用更新的内核或更新的libc / GCC版本。



 类似资料:
  • 问题内容: 我了解python集的元素没有顺序。调用pop方法将返回一个任意元素;我很好。 我想知道的是,当集合具有相同的历史记录时,pop是否总是返回相同的元素。当然,在一个版本的python中,我不介意不同版本的python实现自己的事情。特别是,我问的是python 2.7。在这种情况下,这比api的实现问题更多。 我在游戏的程序地牢生成器中大量使用了set,​​我希望结果对于给定的种子是确

  • 当使用相同的JDK(即相同的可执行文件)时,生成的类文件是否总是相同的?是否会因操作系统或硬件的不同而有所不同?除了JDK版本之外,还有其他因素导致差异吗?有没有避免差异的编译器选项?这仅仅是理论上的差异,还是Oracle的实际上为相同的输入和编译器选项生成了不同的类文件? 更新1我感兴趣的是生成,即编译器输出,而不是类文件是否可以在各种平台上运行。 更新2同样的JDK,我也指同样的javac可执

  • 本文向大家介绍确定性和非确定性算法之间的差异,包括了确定性和非确定性算法之间的差异的使用技巧和注意事项,需要的朋友参考一下 在编程的上下文中,“算法”是依次执行一组明确定义的指令,以执行特定任务并获得所需的输出。在这里,我们说一组定义的指令,这意味着如果某个指令以预期的方式执行,那么某个地方的用户就会知道这些指令的结果。 根据有关指令结果的知识,有两种算法,即-确定性算法和非确定性算法。以下是两种

  • 问题内容: 当使用 相同的JDK (即相同的可执行文件)时,生成的类文件是否始终相同?取决于 操作系统 或 硬件 ,会有所区别吗?除JDK版本外,是否还有其他因素导致差异?是否有任何编译器选项来避免差异?是仅在理论上可能有所不同,还是Oracle 实际上针对相同的输入和编译器选项生成了不同的类文件? 更新1 我对 生成 感兴趣,即对编译器输出感兴趣,而不对是否可以在各种平台上 运行 类文件感兴趣。

  • malloc(配置内存空间) 相关函数 calloc,free,realloc,brk 表头文件 #include<stdlib.h> 定义函数 void * malloc(size_t size); 函数说明 malloc()用来配置内存空间,其大小由指定的size决定。 返回值 若配置成功则返回一指针,失败则返回NULL。 范例 void p = malloc(1024); /*配置1k的内存

  • malloc 配置内存空间 相关函数 calloc,free,realloc,brk 表头文件 #include<stdlib.h> 定义函数 void *malloc(size_t size); 函数说明 malloc()用来配置内存空间,其大小由指定的size决定。 返回值 若配置成功则返回一指针,失败则返回NULL。 范例 void p = malloc(1024); /*配置1k的内存