提问人:programme3219873 提问时间:1/10/2022 最后编辑:Peter Cordesprogramme3219873 更新时间:1/10/2022 访问量:623
为什么 libc.so 的地址总是在变化
Why does the address of libc.so always change
问:
我最近一直在研究 ELF 二进制文件以及如何在 ELF 文件中使用 GOT 和 PLT 调用函数。
据我所知,当调用函数时,会发生以下情况:
- 函数被调用
- 跳转是对 PLT 的,特别是函数 plt 存根 (
function@plt
) - 内部跳转到 GOT 以检查函数地址是否存在,如果没有,则将其加载到 GOT 中
function@plt
- 下次调用函数时,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 标准库函数所在的位置,例如。但是,您可能还会注意到,每次呼叫时地址都会更改,并且多次呼叫时地址总是会更改。lld
libc.so
printf
0x00007ffeff6f6000
0x00007ffdda5ee000
lld x
为什么地址不断变化,计算机如何知道libc的新地址在哪里?
答: 暂无答案
评论
echo 0 > /proc/sys/kernel/randomize_va_space
gdb
disable-randomization
mmap
strace /bin/true