“主”地址的功能保持不变。为什么局部变量地址每次运行都会改变?

时间:2019-01-11 14:13:35

标签: c linux

请参考以下程序:

<?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变量的地址存储在哪里?

1 个答案:

答案 0 :(得分:2)

加载程序的软件会在每次执行中故意改变堆栈的位置,从而使攻击者更难利用漏洞。

程序知道a的位置是因为编译器将main的堆栈帧内的偏移量内置到其中,并且main的堆栈帧的地址来自于加载程序并启动main的软件传递给main的堆栈指针。