地址随机化:c中静态var的打印地址



我正在阅读OS教科书,有一个示例验证系统是否支持虚拟地址,并说以下程序每次都应打印相同的结果。我在MacBook Pro上看到了一些不同。

#include <stdio.h>
int var = 0;
int main(void)
{
  var += 1;
  printf("Address: %x, value: %dn", &var, var);
  return 0;
}

运行时,我会看到某些字节中的地址更改(但不是全部):

./main
Address: e8c6018, value: 1
./main
Address: 9032018, value: 1
./main
Address: 1bc7018, value: 1

当我在GDB中运行时,我总是看到1018:

(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19631) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19636) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19654) exited normally]

那么,在直接和GDB中运行它有什么不同?为什么直接运行时地址会有所不同?

您的书很旧。如今,许多操作系统正在随机化程序和库,以使事情与某些攻击更加安全。

macOS随机将程序加载到内存中的位置。它确实禁用了GDB的随机化,这就是为什么地址一直在GDB中看起来相同的原因。

gdb 中,我们始终获得相同的地址,甚至使用不同的过程运行,但是正常行为应该像下面一样,如果直接在Linux

中运行
./main
Address: e8c6018, value: 1
./main
Address: 9032018, value: 1
./main
Address: 1bc7018, value: 1

因为这是由于以下事实:在 gdb 中, disable andomization 在上被 by default 。如果我们期望定期输出:

set disable-randomization off

参考链接:http://visualgdb.com/gdbreference/commands/set_disable-randomization

最新更新