C++ 启用ASLR后,是否每次都以相对于图像基址的相同偏移量加载图像的所有部分?
C++ 启用ASLR后,是否每次都以相对于图像基址的相同偏移量加载图像的所有部分?,c++,c,linux,x86-64,aslr,C++,C,Linux,X86 64,Aslr,libc的不同部分(例如.text,.plt,.got,.bss,.rodata和其他部分)是否每次都以相对于libc基地址的相同偏移量加载 我知道每次我运行程序时,加载程序都会在随机位置加载libc 提前谢谢。我想我找到了我自己问题的答案。我使用英特尔管脚编写了一个管脚工具,在每个libc节上,get-load输出相对于libc地址的节偏移量。以下是以相同偏移量加载的节及其相应的偏移量(前面的-是库名,即libc及其版本,后面的是节名): 事实上,每次都有不同偏移量的部分被加载。你可以在下面看
libc
的不同部分(例如.text
,.plt
,.got
,.bss
,.rodata
和其他部分)是否每次都以相对于libc
基地址的相同偏移量加载
我知道每次我运行程序时,加载程序都会在随机位置加载libc
提前谢谢。我想我找到了我自己问题的答案。我使用英特尔管脚编写了一个管脚工具,在每个
libc
节上,get-load输出相对于libc
地址的节偏移量。以下是以相同偏移量加载的节及其相应的偏移量(前面的-
是库名,即libc
及其版本,后面的是节名):
事实上,每次都有不同偏移量的部分被加载。你可以在下面看到它们。然而,由于我不认识它们,对我来说也不重要,我想得出结论,是的,我们最关心的部分在每次程序运行时都以相同的偏移量加载
libc.so.6-.note.stapsdt
libc.so.6-.gnu.warning.sigstack
libc.so.6-.gnu.warning.sigreturn
libc.so.6-.gnu.warning.siggetmask
libc.so.6-.gnu.warning.tmpnam
libc.so.6-.gnu.warning.tmpnam_r
libc.so.6-.gnu.warning.tempnam
libc.so.6-.gnu.warning.sys_errlist
libc.so.6-.gnu.warning.sys_nerr
libc.so.6-.gnu.warning.gets
libc.so.6-.gnu.warning.getpw
libc.so.6-.gnu.warning.re_max_failures
libc.so.6-.gnu.warning.lchmod
libc.so.6-.gnu.warning.getwd
libc.so.6-.gnu.warning.sstk
libc.so.6-.gnu.warning.revoke
libc.so.6-.gnu.warning.mktemp
libc.so.6-.gnu.warning.gtty
libc.so.6-.gnu.warning.stty
libc.so.6-.gnu.warning.chflags
libc.so.6-.gnu.warning.fchflags
libc.so.6-.gnu.warning.__compat_bdflush
libc.so.6-.gnu.warning.__memset_zero_constant_len_parameter
libc.so.6-.gnu.warning.__gets_chk
libc.so.6-.gnu.warning.inet6_option_space
libc.so.6-.gnu.warning.inet6_option_init
libc.so.6-.gnu.warning.inet6_option_append
libc.so.6-.gnu.warning.inet6_option_alloc
libc.so.6-.gnu.warning.inet6_option_next
libc.so.6-.gnu.warning.inet6_option_find
libc.so.6-.gnu.warning.getmsg
libc.so.6-.gnu.warning.putmsg
libc.so.6-.gnu.warning.fattach
libc.so.6-.gnu.warning.fdetach
libc.so.6-.gnu.warning.setlogin
libc.so.6-.gnu_debuglink
libc.so.6-.shstrtab
您是否测试过它,可能是通过多次运行
cat/proc/self/maps
?是的,我尝试过,但是/proc/self/maps
只显示图像的基本地址,而不显示它们的部分。我可以找到加载libc
和ld
的位置,但我仍然有一个问题,即它们的部分是否每次都以相同的偏移量加载。这可能取决于您使用的编译器/链接器/操作系统组合。如果指定了它(无论是在规范中,还是在编译器手册中),最好有一个链接。我想你是对的。我在64位Ubuntu Linux
中使用了gcc
。如果其他人尝试了其他编译器或链接器,并且得到了不同的答案,请同时发布您的答案。除非受到规范的限制,否则在不同版本的gcc
之间很可能会有所不同,特别是在考虑真正的旧版本时。IDK,不过:我通常会尽量远离C!;-)@jpaugh:为了使BSS和数据段中静态数据的RIP相对寻址能够在没有文本重新定位的情况下工作,它们必须映射到与文本段相同的相对地址。ELF对象作为一个整体是ASLRed的,而不是相对于彼此的各个片段。RIP相对寻址的最大好处之一是PIC代码,它不需要使用GOT来处理所有事情,并且在加载后也不需要重新定位修正,因此,是的,您可以确定这就是它的工作原理;你确定他们被映射了,你在为他们计算一些合理的东西吗?(.)
libc.so.6-.note.stapsdt
libc.so.6-.gnu.warning.sigstack
libc.so.6-.gnu.warning.sigreturn
libc.so.6-.gnu.warning.siggetmask
libc.so.6-.gnu.warning.tmpnam
libc.so.6-.gnu.warning.tmpnam_r
libc.so.6-.gnu.warning.tempnam
libc.so.6-.gnu.warning.sys_errlist
libc.so.6-.gnu.warning.sys_nerr
libc.so.6-.gnu.warning.gets
libc.so.6-.gnu.warning.getpw
libc.so.6-.gnu.warning.re_max_failures
libc.so.6-.gnu.warning.lchmod
libc.so.6-.gnu.warning.getwd
libc.so.6-.gnu.warning.sstk
libc.so.6-.gnu.warning.revoke
libc.so.6-.gnu.warning.mktemp
libc.so.6-.gnu.warning.gtty
libc.so.6-.gnu.warning.stty
libc.so.6-.gnu.warning.chflags
libc.so.6-.gnu.warning.fchflags
libc.so.6-.gnu.warning.__compat_bdflush
libc.so.6-.gnu.warning.__memset_zero_constant_len_parameter
libc.so.6-.gnu.warning.__gets_chk
libc.so.6-.gnu.warning.inet6_option_space
libc.so.6-.gnu.warning.inet6_option_init
libc.so.6-.gnu.warning.inet6_option_append
libc.so.6-.gnu.warning.inet6_option_alloc
libc.so.6-.gnu.warning.inet6_option_next
libc.so.6-.gnu.warning.inet6_option_find
libc.so.6-.gnu.warning.getmsg
libc.so.6-.gnu.warning.putmsg
libc.so.6-.gnu.warning.fattach
libc.so.6-.gnu.warning.fdetach
libc.so.6-.gnu.warning.setlogin
libc.so.6-.gnu_debuglink
libc.so.6-.shstrtab