使用 patchelf 0.6 和 0.8 在 ld-linux-x86-64.so.2 中设置 RUNPATH 后无法 chroot bash

使用 patchelf 0.6 和 0.8 在 ld-linux-x86-64.so.2 中设置 RUNPATH 后无法 chroot bash

我正在测试动态链接如何与RUNPATH变量一起工作,并尝试bash在最小chroot目录中运行:

$ find dir_chroot/ -type f
dir_chroot/bin/bash
dir_chroot/lib/x86_64-linux-gnu/libc.so.6
dir_chroot/lib/x86_64-linux-gnu/libdl.so.2
dir_chroot/lib/x86_64-linux-gnu/libtinfo.so.5
dir_chroot/lib64/ld-linux-x86-64.so.2

-- 这些都是 的依赖项bash,并且它们是实际的二进制文件 ( find -type f),而不是符号链接。他们也没有RUNPATH

$ find dir_chroot/ -type f -exec sh -c "readelf -d {} | grep RUNPATH" \;
$ 

chroot在此目录下工作正常:

$ sudo chroot dir_chroot /bin/bash
bash-4.3# exit
exit

但是,如果我复制所有内容并设置RUNPATH$ORIGIN/in,则在运行时lib64/ld-linux-x86-64.so.2会得到退出代码139( ?) :segfaultchroot

$ cp -R dir_chroot dir_chroot4
$ find dir_chroot4/ -type f -exec sh -c "echo {} `readelf -d {} | grep RUNPATH`" \; 
dir_chroot4/bin/bash
dir_chroot4/lib/x86_64-linux-gnu/libc.so.6
dir_chroot4/lib/x86_64-linux-gnu/libdl.so.2
dir_chroot4/lib/x86_64-linux-gnu/libtinfo.so.5
dir_chroot4/lib64/ld-linux-x86-64.so.2
$
$ patchelf --set-rpath "\$ORIGIN/" dir_chroot4/lib64/ld-linux-x86-64.so.2
$ find dir_chroot4/ -type f -exec sh -c "echo {} `readelf -d {} | grep RUNPATH`" \; 
dir_chroot4/bin/bash
dir_chroot4/lib/x86_64-linux-gnu/libc.so.6
dir_chroot4/lib/x86_64-linux-gnu/libdl.so.2
dir_chroot4/lib/x86_64-linux-gnu/libtinfo.so.5
dir_chroot4/lib64/ld-linux-x86-64.so.2 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/]
$
$ sudo chroot dir_chroot4 /bin/bash
$
$ echo $status
139

--是shell$status中的状态变量。fish

仅当ld-linux-x86-64.so.2已修补、其他库和bash可执行文件可以与RUNPATH.为什么会这样呢?

答案1

显然,ld-linux-x86-64.so.2是静态链接的,至少在我的系统上是这样:

>ldd ld-linux-x86-64.so.2
statically linked

不像libc.so.6,libdl.so.2libtinfo.so.5

>ldd libc.so.6 libdl.so.2 libtinfo.so.5

libc.so.6:
/lib64/ld-linux-x86-64.so.2 (0x000056469847a000)
linux-vdso.so.1 =>  (0x00007ffe95185000)

libdl.so.2:
linux-vdso.so.1 =>  (0x00007fffc4718000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa1df136000)
/lib64/ld-linux-x86-64.so.2 (0x0000558334a9c000)

libtinfo.so.5:
linux-vdso.so.1 =>  (0x00007ffe1b7bd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffa990b9000)
/lib64/ld-linux-x86-64.so.2 (0x00005590bfced000)

当你强行注入时,这会让加载程序发疯并导致段错误运行路径进去。

相关内容