gpt4 book ai didi

c - 地址随机化: print address of a static var in c

转载 作者:太空狗 更新时间:2023-10-29 15:03:30 28 4
gpt4 key购买 nike

我在读一本操作系统教科书,有一个验证系统是否支持虚拟地址的例子,并说下面的程序每次都应该打印相同的结果。我发现我的 macbook pro 有一些不同。

#include <stdio.h>

int var = 0;
int main(void)
{
var += 1;
printf("Address: %x, value: %d\n", &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 中始终看起来相同的原因。

关于c - 地址随机化: print address of a static var in c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036927/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com