我在一些地方读到过,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
的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是如何工作的?
gdb
运行和调试吗?我不确定,但也许有一些重定位操作。 - Tomer