小编som*_*iam的帖子

ELF,PIE ASLR以及介于两者之间的所有内容,特别是在Linux中

好吧,所以在问我的问题之前,我想介绍一些技术细节,我想确保我是正确的:

位置无关可执行文件 - PIE,是一个无论加载到哪个内存地址都能执行的代码,对吗?

ASLR ------地址空间布局随机化,几乎说明为了保持地址静态,我们会以某种方式随机化它们,

我已经在Linux和基于Unix的系统中特别阅读了实现ASLR是可能的,无论我们的代码是否是PIE,如果它是PIE,所有跳转,调用和偏移是相对的,因此我们没有问题如果不是,请编写一些如何无论代码是可执行的还是共享对象,都会被修改并编辑地址....

对......现在这让我提出几个问题

  1. 如果ASLR可以在不是PIE的代码中实现并且是可执行的并且不共享/可重定位对象(我知道重定位如何在可重定位的对象中工作!!!!)它是如何完成的?,elf格式应该没有任何部分说明代码部分中的函数是什么,所以内核加载器可以修改它,对吧?ASLR应该是内核功能,因此实际上可以是例如包含例如这些指令的可执行文件

    伪代码:

    inc_eax:
     add eax, 5
     ret
    
    main:
     mov eax, 5
     mov ebx, 6
     call ABSOLUTE_ADDRES{inc_eax}
    
    Run Code Online (Sandbox Code Playgroud)

    如果内核可执行加载器没有存储在elf文件中的某个可重定位表中并且不是相对的,以便将可执行文件加载到某个随机地址,那么内核可执行加载器如何知道如何更改地址?

  2. 假设我错了,为了实现ASLR,你必须有一个PIE可执行文件,所有段都是相对的,如何编译C++ OOP代码并使其工作,例如,如果我有一个类的实例使用指向其结构中的虚拟表的指针,并且该虚拟表应该保存绝对地址,因此我无法为使用运行时虚拟表的C++程序编译纯PIE,并且不能再使用ASLR. ...我怀疑虚拟表是否包含相对地址,并且对于某些虚拟函数的每次调用都会有不同的虚拟表...

  3. 我的最后一个也是最不重要的问题是关于ELF和PIE,是否有一些特殊的方法来检测ELF可执行文件是PIE?我对ELF格式很熟悉所以我怀疑它有一种方法但是我可能错了,无论如何如果没有办法,内核加载器如何知道我们的可执行文件是否是PIE,因此它可以在其上使用ASLR

我已经把这一切搞砸了,如果有人能在这里帮助我,我会很感激,感谢提前

linker compilation elf aslr

5
推荐指数
1
解决办法
7281
查看次数

内存分段、堆和 mmap

这个问题主要与x86、linux相关

在 x86 上,访问内存的每个操作都需要在执行程序时从某个“段”内完成,您的程序保存三个指向某些内存地址的段寄存器,例如

  • 你有CSwhich 指向一些内存,你可以在其中读取和执行
  • 你有DSwhich 指向一些内存,你可以在其中读写
  • 你有SSwhich 指向一些内存,在那里你也可以读写

在执行一些代码时,每次JMPCALL您对某个地址的指令将通过您的处理器检查是你内CS,如果你的范围内,每一个读/写操作系你就全局变量在您的代码将被CPU检查DS内存限制,并因此SS,鉴于此,我们提供了一些提供内存保护的内存模型。

现在我的问题是,当我们动态分配一些内存时会发生什么?还是内存映射?,操作系统给我分配一些内存是不够的,执行程序必须有一些寄存器指向进行 IO 操作的地方......我假设这是 FS / GS / ES 寄存器启动,但我不确定。如果这里有在该领域有更多经验的人可以向我解释这一点,我希望它...

我之前写了一些代码测试它并反汇编它,输出令人失望。

我的代码是这样的

int main()
{
 int * mem = (int *) malloc(4096)

 mem[0] = 5;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望在反汇编代码中看到类似的东西

lea eax, mem_addr
mov fs:[eax], 5
Run Code Online (Sandbox Code Playgroud)

但这并没有发生..如果有人能向我澄清这一点,我会很高兴的

linux memory x86 memory-segmentation

0
推荐指数
1
解决办法
1116
查看次数

标签 统计

aslr ×1

compilation ×1

elf ×1

linker ×1

linux ×1

memory ×1

memory-segmentation ×1

x86 ×1