为什么 libc.so 的地址总是在变化

Why does the address of libc.so always change

提问人:programme3219873 提问时间:1/10/2022 最后编辑:Peter Cordesprogramme3219873 更新时间:1/10/2022 访问量:623

问:

我最近一直在研究 ELF 二进制文件以及如何在 ELF 文件中使用 GOT 和 PLT 调用函数。

据我所知,当调用函数时,会发生以下情况:

  1. 函数被调用
  2. 跳转是对 PLT 的,特别是函数 plt 存根 (function@plt)
  3. 内部跳转到 GOT 以检查函数地址是否存在,如果没有,则将其加载到 GOT 中function@plt
  4. 下次调用函数时,PLT 存根 () 将通过 GOT 直接跳转到函数地址function@plt

这是有道理的,但是在对此进行进一步研究时,我想知道包含函数的库是如何以及为什么随机加载的。具体来说,这里有一个 ELF 动态链接二进制文件的示例,称为:x

user1@ubuntu:~$ ldd x
    linux-vdso.so.1 (0x00007ffeff6f6000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd65aa52000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fd65ac94000)

user1@ubuntu:~$ ldd x
    linux-vdso.so.1 (0x00007ffdda5ee000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f10242a0000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f10244e2000)

调用可执行文件会发现,我的可执行文件使用许多 C 标准库函数所在的位置,例如。但是,您可能还会注意到,每次呼叫时地址都会更改,并且多次呼叫时地址总是会更改。lldlibc.soprintf0x00007ffeff6f60000x00007ffdda5ee000lld x

为什么地址不断变化,计算机如何知道libc的新地址在哪里?

C 装配 ELF 动态链接 ASLR

评论

10赞 Jester 1/10/2022
安全。阅读有关 ASLR 的信息。加载程序当然知道地址,因此它会相应地在 GOT 中设置地址。您可以通过以下方式禁用它(仅用于实验)。那么地址就不会改变。也有一个设置echo 0 > /proc/sys/kernel/randomize_va_spacegdbdisable-randomization
1赞 yugr 1/10/2022
@Jester为什么不把这个作为答案,这样我们就可以+1呢?
3赞 Peter Cordes 1/10/2022
计算机如何知道 libc 的新地址在哪里?- 从返回值!用于查看系统调用 ld.so 使动态可执行文件映射 libc。mmapstrace /bin/true

答: 暂无答案