我在一些地方读到,ASLR 应该.data
在每次运行程序时在随机地址加载该部分,这意味着全局变量的地址应该不同。但是,如果我有以下代码:
int global_var = 42;
int main()
{
global_var = 10;
return 0;
}
我用 编译它gcc -fpie -o global global.c
,objdump -d -M intel
显示以下内容:
4004ed: 55 push rbp
4004ee: 48 89 e5 mov rbp,rsp
4004f1: c7 05 3d 0b 20 00 0a mov DWORD PTR [rip+0x200b3d],0xa # 601038 <global_var>
看起来它global_var
总是被放置在 601038。事实上,如果我用调试符号编译,global_var
's DIE 的地址是硬编码的:
$ gcc -ggdb3 -fpie -o global global.c
$ objdump --dwarf=info global
...
<1><55>: Abbrev Number: 4 (DW_TAG_variable)
<56> DW_AT_name : (indirect string, offset: 0x30c): global_var
<5a> DW_AT_decl_file : 1
<5b> DW_AT_decl_line : 1
<5c> DW_AT_type : <0x4e>
<60> DW_AT_external : 1
<60> DW_AT_location : 9 byte block: 3 38 10 60 0 0 0 0 0 (DW_OP_addr: 601038)
在这些情况下,ASLR 是如何工作的?