【问题标题】:Statically assign a memory address in c program在c程序中静态分配内存地址
【发布时间】:2020-05-06 03:54:49
【问题描述】:

我正在构建非常小的测试程序,我想让程序每次都访问相同的内存地址(我知道这不是一个好习惯)来模拟一些行为。我怎样才能在程序中选择一个内存地址来硬编码并尝试一下?有没有办法查看未使用的内存地址块并阻止它们?

我完全理解这可能会造成不必要的条件/情况。

【问题讨论】:

  • 在嵌入式系统上,这可能是正常的,外围设备可能是内存映射和可访问的。在 PC 上,由于旨在阻止攻击者的“地址空间随机化”,您不会每次都获得相同的地址空间。
  • 使用内存映射文件怎么样? (mmap) 就像stackoverflow.com/questions/29210851/… 一样?每次重新启动程序时,您都使用保存在文件中的值而不是重置值
  • 我建议您使用静态数组或malloc 分配一块内存,并使用指向该空间内固定偏移量的指针。

标签: c memory-address


【解决方案1】:

您可以使用ampersand operator (&) 指向一个指向特定内存地址的指针。但是,您的程序必须能够合法访问该地址,该地址由您的操作系统分配给您的程序的地址范围决定,否则您将获得segmentation fault

示例代码:

void * p1 = (void *)0x28ff44;

或者如果你想要它作为一个字符指针:

char * p2 = (char *)0x28ff44;

附言

您可以找出分配给您的程序的地址,并将其中的一个地址放入您的程序中。对于单次运行,您的程序将访问相同的内存位置,但对于另一次运行,分配给您的进程的内存位置将不同,但对于该运行而言相同。

您可以参考here 来检查如何读取分配给您的进程的内存地址。您可以在运行时输入您的process id 以获取文件路径

解决方法

既然你提到它是small test program,你也可以通过禁用randomization of memory addresses 来为你的测试你的程序禁用randomization of memory addresses 来节省你的精力,你只需在Linux 中使用禁用ASLR

echo 0 > /proc/sys/kernel/randomize_va_space

然后运行你的程序,声明和初始化一个变量,打印它的地址,然后在你的程序中硬编码那个地址。答对了!!每次都将使用该地址,直到您再次启用 ASLR。

但是关闭 ASLR 并不安全,测试后您应该再次启用 ASLR

echo 1 > /proc/sys/kernel/randomize_va_space

【讨论】:

  • 如果我想让两个程序读取/写入单个内存位置并通过它交换信息怎么办?这是可能的还是只有一个人能够写信给它?
  • 好吧,使用上述方法是不允许的,因为操作系统不允许您以这种方式访问​​和干扰其他程序的内存地址,并导致segmentation fault。您需要在您的程序之间合法 共享内存位置,请参阅stackoverflow.com/questions/5656530/… 此处。之后,您可以使用这些程序对该内存位置进行任何操作。
  • 是否可以在 windows 上禁用内存地址的随机化?
  • 是的。对于 Windows 10,您可以使用 gist.github.com/trietptm/b84ccad9db01f459ac7e(归功于拥有 git repo 的人)或者您可以手动编辑注册表文件。步骤顺序可以通过谷歌搜索“在windows中禁用ASLR”找到。
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2015-07-23
  • 2013-04-16
  • 2014-12-19
  • 2013-01-13
相关资源
最近更新 更多