请参考以下程序:
<?xml version="1.0"?>
<Order_Root>
<Orders Number="12345">
<Info Name="John Doe" Reference="1/2/2019">
<LineItems>
<LineItem LineItemNumber="01" CustomerProductName="Test">
<LineItemPrice Price="0" Charge="0" />
<Products>
<Product ProductName="A" />
</Products>
</LineItem>
<LineItem LineItemNumber="01" CustomerProductName="Test">
<LineItemPrice Price="0" Charge="0" />
<Products>
<Product ProductName="B" />
</Products>
</LineItem>
<LineItem LineItemNumber="01" CustomerProductName="Test">
<LineItemPrice Price="0" Charge="0" />
<Products>
<Product ProductName="C" />
</Products>
</LineItem>
</LineItems>
</Info>
</Orders>
</Order_Root>
我使用#include<stdio.h>
int main()
{
int a, b;
printf("address of main =%p\n", main);
a=3;
printf("Address of 'a' =%p\n", &a);
return 0;
}
编译了上述程序,然后运行了二进制文件。我得到以下输出:
gcc
使用[root@localhost gdb]# ./a.out
address of main =0x400536
Address of 'a' =0x7ffc4802cbdc
[root@localhost gdb]# ./a.out
address of main =0x400536
Address of 'a' =0x7ffe2bdcd66c
[root@localhost gdb]#
编译的相同源代码,现在我得到输出:
–m32
这是我的问题:为什么在64位内核中运行64位和32位应用程序时[root@localhost gdb]# ./a.out
address of main =0x804841b
Address of 'a' =0xffa6b29c
[root@localhost gdb]# ./a.out
address of main =0x804841b
Address of 'a' =0xff9b808c
变量范围的地址已更改? a
函数地址保持不变,为什么main
变量地址每次运行都会改变? a
变量的地址存储在哪里?
答案 0 :(得分:2)
加载程序的软件会在每次执行中故意改变堆栈的位置,从而使攻击者更难利用漏洞。
程序知道a
的位置是因为编译器将main
的堆栈帧内的偏移量内置到其中,并且main
的堆栈帧的地址来自于加载程序并启动main
的软件传递给main
的堆栈指针。