为什么每次执行时函数的地址都不同?
Why is the address of a function different on each execution?
可执行代码的地址是在链接时决定的,不是吗?
#include <stdio.h>
int main ()
{
printf("%p", (void*)&main);
return 0;
}
示例输出 #1:
0x563ac3667139
示例输出 #2:
0x55e3903a9139
在许多现代系统上,它将在链接时确定函数相对于基址模块的地址。加载模块(exe、dll 等(时,地址空间布局随机化 (ASLR( 会为其提供不同的基址。
这是为了安全起见,这意味着函数的地址是不可预测的。这意味着某些攻击可能会溢出堆栈变量以覆盖返回地址或函数指针以覆盖其他函数(出于恶意目的(,无法轻松预测要覆盖它的地址,它会因运行而异。
重新定位基址的能力也解决了冲突的实际问题,如果你加载a.dll和b.dll,它们是为同一个基址独立编译的,这是行不通的,所以能够重新定位一个可以解决冲突。
在机器代码级别,这很好,因为大多数跳转和调用使用相对指令偏移量,而不是绝对值。尽管某些构造在加载模块时会动态修补,或者使用某种形式的"表"填充正确的地址。
另请参阅重新定位(计算(
这是一种称为地址空间布局随机化的安全技术。
它故意在每次执行时移动内容,使攻击者更难知道数据位在您的进程中的位置并对其进行黑客攻击。
相关文章:
- 如何在c++程序中找到函数的地址
- 函数名是c中该函数的第一条指令的地址吗
- 从 C++ 中的函数返回数组地址问题
- 为什么成员函数地址离自由函数这么远?
- 调用 lua 函数的地址为 C/C++?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 为什么每次执行时函数的地址都不同?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 获取函数的地址?
- 模板到函数的时刻地址是否可以作为指向某个函数的函数指针传递?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 指针在函数调用后更改其地址
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 在每个运行时将函数保存到相同的地址
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 如何定义全局函数指针并分配给特定地址
- 常量引用函数参数的地址何时唯一?
- 打印我的Get MAC地址函数的std::字符串时出现意外输出
- 成员函数地址(函数指针)