当前位置: 代码迷 >> 综合 >> ldd 安全问题 | 更换链接器
  详细解决方案

ldd 安全问题 | 更换链接器

热度:22   发布时间:2023-12-16 12:13:02.0

转:https://blog.csdn.net/kwuwei/article/details/24721281
转:https://blog.csdn.net/buaa_shang/article/details/8929077

ldd介绍

ldd本身不是一个程序,而仅是一个shell脚本

$ file /usr/bin/ldd
/usr/bin/ldd: Bourne-Again shell script text executable

ldd命令其实是依靠设置一些环境变量而实现的(也就是说ldd的作用只是设置一些环境变量的值)
如:LD_TRACE_LOADED_OBJECTS
只要设置其值非空即可。

$ export LD_TRACE_LOADED_OBJECTS=1
$ ls /usr
linux-gate.so.1 =>  (0xb7fac000)
/lib/ld-linux.so.2 (0xb7fad000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7df0000)

撤销该环境变量,ls即又可以恢复正常使用:

$ unset LD_TRACE_LOADED_OBJECTS
$ ls  /usr/
bin  games  include  lib  lib32  lib64  local  sbin  share  src  X11R6

例如: 执行ldd /bin/ls
ldd 在执行的时候,首先是设置LD_TRACE_LOADED_OBJECTS 环境变量,然后调用ld-linux.so.2链接器,去输出ls文件的依赖
如果我们直接运行 /lib/ld-linux.so.2 /bin/ls 可以发现ls是执行成功的。
也就是说当执行ld-linux.so.2时候,它会先判断LD_TRACE_LOADED_OBJECTS有没有被设置,如果有,就输出依赖关系,如果没有,就执行命令本身

问题

如果我们更换一个链接器,让链接器不对LD_TRACE_LOADED_OBJECTS环境变量做判断,无论什么时候都执行命令本身,那么此时的ldd命令就有很大的风险了
具体例子看这个:https://blog.csdn.net/buaa_shang/article/details/8929077

更换链接器

-Wl,–dynamic-linker,$L/lib/ld-uClibc.so.0 — 指定一个新的装载器。

linux@Ubuntu1:~/app/test$ mips-linux-gnu-gcc test.c -Wl,--dynamic-linker,/mylib/ld-hello.so
linux@Ubuntu1:~/app/test$ mips-linux-gnu-ldd a.out 
checking sub-depends for 'not found'libc.so.6 => not found (0x00000000)/mylib/ld-hello.so => /mylib/ld-hello.so (0x00000000)
linux@Ubuntu1:~/app/test$ 

观察到,elf文件的链接器已经变了