好吧,所以在问我的问题之前,我想介绍一些技术细节,我想确保我是正确的:
位置无关可执行文件 - PIE,是一个无论加载到哪个内存地址都能执行的代码,对吗?
ASLR ------地址空间布局随机化,几乎说明为了保持地址静态,我们会以某种方式随机化它们,
我已经在Linux和基于Unix的系统中特别阅读了实现ASLR是可能的,无论我们的代码是否是PIE,如果它是PIE,所有跳转,调用和偏移是相对的,因此我们没有问题如果不是,请编写一些如何无论代码是可执行的还是共享对象,都会被修改并编辑地址....
对......现在这让我提出几个问题
如果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文件中的某个可重定位表中并且不是相对的,以便将可执行文件加载到某个随机地址,那么内核可执行加载器如何知道如何更改地址?
假设我错了,为了实现ASLR,你必须有一个PIE可执行文件,所有段都是相对的,如何编译C++ OOP代码并使其工作,例如,如果我有一个类的实例使用指向其结构中的虚拟表的指针,并且该虚拟表应该保存绝对地址,因此我无法为使用运行时虚拟表的C++程序编译纯PIE,并且不能再使用ASLR. ...我怀疑虚拟表是否包含相对地址,并且对于某些虚拟函数的每次调用都会有不同的虚拟表...
我的最后一个也是最不重要的问题是关于ELF和PIE,是否有一些特殊的方法来检测ELF可执行文件是PIE?我对ELF格式很熟悉所以我怀疑它有一种方法但是我可能错了,无论如何如果没有办法,内核加载器如何知道我们的可执行文件是否是PIE,因此它可以在其上使用ASLR
我已经把这一切搞砸了,如果有人能在这里帮助我,我会很感激,感谢提前