Memory GDB&x27;地址';。它们是什么?

Memory GDB&x27;地址';。它们是什么?,memory,memory-management,assembly,gdb,Memory,Memory Management,Assembly,Gdb,这应该是一个非常简单、非常快速的问题。这是我写的C语言程序的前3行: Dump of assembler code for function main: 0x0804844d <+0>: push ebp 0x0804844e <+1>: mov ebp,esp 0x08048450 <+3>: and esp,0xfffffff0 ... ... ... ... ... ... ... 主函数的汇编程序代码转储: 0

这应该是一个非常简单、非常快速的问题。这是我写的C语言程序的前3行:

Dump of assembler code for function main:
   0x0804844d <+0>: push   ebp
   0x0804844e <+1>: mov    ebp,esp
   0x08048450 <+3>: and    esp,0xfffffff0
   ... ... ... ... ... ... ...
主函数的汇编程序代码转储: 0x080484D:推送ebp 0x080484E:mov ebp,esp 0x08048450:和esp,0xFFFFF0 ... ... ... ... ... ... ... 什么是
0x080484D
0x080484E
0x08048450
?它不受ASLR的影响。它仍然是内存地址还是文件的相对点?

如果查看,您可以看到
0x0804846d:eb 15 jmp 0x8048484
编码了相对地址。i、 这是短编码。这甚至适用于位置独立的代码,即在任何地址映射/加载时可以运行的代码

ASLR意味着每次将文件加载到内存中时,可执行文件中堆栈的地址(以及可选的代码+数据)都可以更改显然,一旦加载程序,地址将不再更改,直到再次加载。因此,如果您在运行时知道地址,您可以将其作为目标,但不能假设地址固定而编写攻击

GDB在任何ASLR之后显示进程虚拟内存空间中的代码地址。(顺便说一句,GDB默认禁用ASLR:
set disable randomization on | off
切换。)


对于可执行文件,通常只有堆栈指针,而代码依赖于位置并在固定地址加载,因此代码和静态数据地址是链接时间常数,因此类似于推送偏移量的代码。LC0/
调用put
可以工作,将字符串常量的地址硬编码为
push imm32

库通常需要位置独立,所以ASLR可以在随机地址加载它们

但是ASLR对于可执行文件是可能的,并且变得越来越普遍,无论是通过(Linux),还是通过让操作系统在加载可执行文件时在不同于为(Windows)编译的地址修复每个硬编码地址

地址仅与文件中的位置具有1:1的关系,仅在同一段中具有相对意义。i、 e.代码的下一个字节就是文件的下一个字节。可执行文件的标题描述了文件的哪些区域是什么(以及操作系统的程序加载器应该将它们映射到哪里)。

如果查看,您可以看到
0x0804846d:eb 15 jmp 0x8048484
编码了相对地址。i、 这是短编码。这甚至适用于位置独立的代码,即在任何地址映射/加载时可以运行的代码

ASLR意味着每次将文件加载到内存中时,可执行文件中堆栈的地址(以及可选的代码+数据)都可以更改显然,一旦加载程序,地址将不再更改,直到再次加载。因此,如果您在运行时知道地址,您可以将其作为目标,但不能假设地址固定而编写攻击

GDB在任何ASLR之后显示进程虚拟内存空间中的代码地址。(顺便说一句,GDB默认禁用ASLR:
set disable randomization on | off
切换。)


对于可执行文件,通常只有堆栈指针,而代码依赖于位置并在固定地址加载,因此代码和静态数据地址是链接时间常数,因此类似于推送偏移量的代码。LC0/
调用put
可以工作,将字符串常量的地址硬编码为
push imm32

库通常需要位置独立,所以ASLR可以在随机地址加载它们

但是ASLR对于可执行文件是可能的,并且变得越来越普遍,无论是通过(Linux),还是通过让操作系统在加载可执行文件时在不同于为(Windows)编译的地址修复每个硬编码地址


地址仅与文件中的位置具有1:1的关系,仅在同一段中具有相对意义。i、 e.代码的下一个字节就是文件的下一个字节。可执行文件的标题描述了文件的哪些区域是什么(以及操作系统的程序加载器应该将它们映射到哪里)。

所示地址的含义在三种情况下有所不同:

  • 对于可执行文件
  • 用于DLL(Windows)或共享对象(.so、Linux和Un*x-like)
  • 用于对象文件
对于可执行文件:

可执行文件通常无法加载到内存中的任何地址。在Windows中,可以将“重新定位表”添加到可执行文件(非常旧的Windows版本需要);如果不存在这种情况(通常是在使用GCC时),则无法将文件加载到另一个内存位置。在Linux中,永远不可能将可执行文件加载到其他位置

您可以尝试以下方法:

static int a;
printf("%X\n", &a);
当您执行程序100次时,您会看到a的地址始终相同,因此不会对可执行文件本身执行ASLR

objdump转储的地址是绝对地址

对于DLL/.so文件:

这些地址相对于DLL的基址(在Linux下)或绝对地址(在Windows下),当DLL加载到另一个内存区域时,这些地址将发生变化

对于对象文件:


转储对象文件时,地址与当前显示的节相对。如果文件中有多个“.text”节,则每个节的地址将从0开始。

所示地址的含义在三种情况下有所不同:

  • 对于可执行文件
  • 用于DLL(Windows)或共享对象(.so、Linux和Un*x-like)
  • 用于对象文件
对于可执行文件:

可执行文件通常无法加载到内存中的任何地址。在Windows中,可以将“重新定位表”添加到可执行文件(ve所需)