【问题标题】:Can I enforce sbrk return address to be within a certain specific range?我可以强制 sbrk 返回地址在某个特定范围内吗?
【发布时间】:2021-03-10 03:40:12
【问题描述】:

我想确保sbrk 的返回地址在某个特定范围内。我在某处读到sbrk 从程序初始化时分配的区域分配。所以我想知道是否有办法强制程序初始化从特定地址分配?例如,使用mmap,我将能够使用MAP_FIXED_NOREPLACE 这样做。有没有可能有类似的东西?

【问题讨论】:

标签: c linux mmap sbrk brk


【解决方案1】:

不,这是不可能的。 brksbrk 指的是程序的数据段,可以加载到任何满足动态链接器需要的有效地址。不同的架构可以并且确实使用不同的地址,甚至相同架构的机器也可以根据内核的配置使用不同的范围。使用固定地址或地址范围是非常不可移植的,并且会使您的程序对未来的更改非常脆弱。我完全希望这样做会导致您的程序在未来仅通过升级 libc 就崩溃。

此外,现代程序通常被编译为与位置无关的可执行文件,因此可以使用 ASLR 来提高安全性。因此,即使您知道程序一次调用所使用的地址范围,程序的下一次调用也可能使用完全不同的地址范围。

此外,您几乎不想手动调用brksbrk。在几乎所有情况下,您都需要使用系统内存分配器(或类似 jemalloc 的替代品),它将为您处理这种情况。例如,glibc 的 malloc 实现与大多数其他实现一样,将使用 mmap 分配大块内存,这可以显着减少长时间运行的程序中的内存使用量,因为这些大块可以独立释放。内存分配器也可能不会感谢您在未咨询的情况下更改数据段的大小。

最后,如果您关心其他 Unix 系统的可移植性,并非所有系统都具有 brksbrk。 OpenBSD 使用 mmap 分配所有内存,这通过扩展 ASLR 的使用来提高安全性(以性能为代价)。

如果您绝对必须使用固定地址或地址范围并且别无选择,则需要使用mmap 来分配该范围的内存。

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2021-12-24
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多