gpt4 book ai didi

c - 如果全局变量的地址在 ELF 中被硬编码,那么它们如何随机化?

转载 作者:太空狗 更新时间:2023-10-29 16:10:58 25 4
gpt4 key购买 nike

我在几个地方读到 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 在这些情况下如何工作?

最佳答案

反汇编的指令输出为您提供 601038 作为相对于任意基数 (0x400000) 的便利,但请阅读实际指令;它正在写入 DWORD PTR [rip+0x200b3d]rip 是指令指针。代码和数据相对于彼此处于固定偏移量;随机化基地址不会改变这一点。通过使用指令指针加载,它正在使用一个已经包含 ASLR 重定位的地址。

描述中方便映射到601038是因为散落在整个代码中的rip的固定偏移量都依赖于指令所在的位置,所以它们是不对指令位置进行调整就无法比较;反汇编器虽然知道指令偏移量,因此它可以减去该指令偏移量,以便您获得通用 0x400000 基址的全局可比较地址。

关于c - 如果全局变量的地址在 ELF 中被硬编码,那么它们如何随机化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36752879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com