실행시 바이너리가로드하는 동적 라이브러리 목록 (전체 경로 포함)을 찾고 싶습니다. CentOS 6.0을 사용하고 있습니다. 이것을하는 방법?
실행시 바이너리가로드하는 동적 라이브러리 목록 (전체 경로 포함)을 찾고 싶습니다. CentOS 6.0을 사용하고 있습니다. 이것을하는 방법?
답변:
당신은 ldd
명령으로 이것을 할 수 있습니다 :
NAME
ldd - print shared library dependencies
SYNOPSIS
ldd [OPTION]... FILE...
DESCRIPTION
ldd prints the shared libraries required by each program or shared
library specified on the command line.
....
예:
$ ldd /bin/ls
linux-vdso.so.1 => (0x00007fff87ffe000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007ff0510c1000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff050eb9000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007ff050cb0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff0508f0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff0506ec000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff0512f7000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff0504ce000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007ff0502c9000)
otool -L <path-to-binary>
readelf -d $executable | grep 'NEEDED'
실행 파일을 실행할 수없는 경우 (예 : 크로스 컴파일 된 파일이거나 신뢰할 수없는 경우) 사용할 수 있습니다.
일반적인 경우, ldd는 LD_TRACE_LOADED_OBJECTS 환경 변수가 1로 설정된 표준 동적 링커 (ld.so (8) 참조)를 호출하여 링커가 라이브러리 종속성을 표시합니다. 그러나 일부 상황에서 일부 버전의 ldd는 프로그램을 직접 실행하여 종속성 정보를 얻으려고 시도 할 수 있습니다. 따라서 신뢰할 수없는 실행 파일에 ldd를 사용하면 안됩니다. 임의 코드가 실행될 수 있습니다.
예:
readelf -d /bin/ls | grep 'NEEDED'
샘플 ouptut :
0x0000000000000001 (NEEDED) Shared library: [libselinux.so.1]
0x0000000000000001 (NEEDED) Shared library: [libacl.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
라이브러리는 다른 라이브러리에 종속 될 수 있으므로 이제 종속성을 찾아야합니다.
자주 작동하는 순진한 접근 방식은 다음과 같습니다.
$ locate libselinux.so.1
/lib/i386-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libselinux.so.1
/mnt/debootstrap/lib/x86_64-linux-gnu/libselinux.so.1
그러나 더 정확한 방법은 ldd
검색 경로 / 캐시 를 이해하는 것 입니다. 나는 ldconfig
갈 길이 라고 생각 합니다.
하나를 선택하고 반복하십시오.
readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED'
샘플 출력 :
0x0000000000000001 (NEEDED) Shared library: [libpcre.so.3]
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2]
등등.
또한보십시오:
/proc/<pid>/maps
프로세스 실행
Basile 이 언급 한이 기능은 실행 파일을 실행하여 현재 사용중인 모든 라이브러리를 찾는 데 유용합니다. 예 :
sudo awk '/\.so/{print $6}' /proc/1/maps | sort -u
init
(PID 1
) 의 현재로드 된 모든 동적 종속성을 표시합니다 .
/lib/x86_64-linux-gnu/ld-2.23.so
/lib/x86_64-linux-gnu/libapparmor.so.1.4.0
/lib/x86_64-linux-gnu/libaudit.so.1.0.0
/lib/x86_64-linux-gnu/libblkid.so.1.1.0
/lib/x86_64-linux-gnu/libc-2.23.so
/lib/x86_64-linux-gnu/libcap.so.2.24
/lib/x86_64-linux-gnu/libdl-2.23.so
/lib/x86_64-linux-gnu/libkmod.so.2.3.0
/lib/x86_64-linux-gnu/libmount.so.1.1.0
/lib/x86_64-linux-gnu/libpam.so.0.83.1
/lib/x86_64-linux-gnu/libpcre.so.3.13.2
/lib/x86_64-linux-gnu/libpthread-2.23.so
/lib/x86_64-linux-gnu/librt-2.23.so
/lib/x86_64-linux-gnu/libseccomp.so.2.2.3
/lib/x86_64-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libuuid.so.1.3.0
이 방법은 또한 Ubuntu 18.04에서 해킹 된 최소 설정으로dlopen
테스트 한 라이브러리를 보여줍니다 .sleep(1000)
ldd와 lsof는 직접 또는 주어진 순간에 로드 된 라이브러리를 보여줍니다 . 이를 통해로드 된 dlopen
(또는에 의해 삭제 된dlclose
) 라이브러리는 설명하지 않습니다 . strace
예를 들어을 사용하여 더 나은 그림을 얻을 수 있습니다 .
strace -e trace=open myprogram
( dlopen
궁극적으로 전화하기 때문에 open
-물론 64 비트 열기에 다른 이름을 사용하는 시스템이있을 수 있습니다 ...).
예:
strace -e trace=open date
나에게 이것을 보여줍니다 :
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/etc/localtime", O_RDONLY) = 3
Wed Apr 12 04:56:32 EDT 2017
".so"이름을 grep하여 공유 객체 만 볼 수 있습니다.
strace -e trace=open,openat myprogram
/proc/<pid>/maps
또한 dlopen
다음과 같이 libs btw : unix.stackexchange.com/questions/120015 / ...를 보여줍니다 . ltrace -S
출력은 syscall과 라이브러리 호출을 모두 표시하므로 훨씬 더 시원합니다 dlopen
. unix.stackexchange.com/questions/226524/…
lsof 는 또한 하나의 특정 프로세스에 사용중인 라이브러리를 보여줄 수 있습니다.
즉
$ pidof nginx
6920 6919
$ lsof -p 6919|grep mem
nginx 6919 root mem REG 0,64 65960 43 /lib64/libnss_files-2.12.so
nginx 6919 root mem REG 0,64 19536 36 /lib64/libdl-2.12.so
nginx 6919 root mem REG 0,64 10312 1875 /lib64/libfreebl3.so
nginx 6919 root mem REG 0,64 1923352 38 /lib64/libc-2.12.so
nginx 6919 root mem REG 0,64 88600 1034 /lib64/libz.so.1.2.3
nginx 6919 root mem REG 0,64 1967392 1927 /usr/lib64/libcrypto.so.1.0.1e
nginx 6919 root mem REG 0,64 183080 1898 /lib64/libpcre.so.0.0.1
nginx 6919 root mem REG 0,64 40400 1217 /lib64/libcrypt-2.12.so
nginx 6919 root mem REG 0,64 142688 77 /lib64/libpthread-2.12.so
nginx 6919 root mem REG 0,64 154664 31 /lib64/ld-2.12.so
A의 공정 PID 1234, 당신은 또한 읽을 수 /proc/1234/maps
(텍스트) 의사 파일 (읽기 proc 디렉토리 (5) ...) 또는 사용 의 pmap을 (1)
이것은 해당 프로세스 의 가상 주소 공간 을 제공 하므로 메모리로 매핑되는 파일 (공유 라이브러리, dlopen (3) -ed one 포함)도 포함됩니다
(물론, 주어진 프로그램을 실행하는 프로세스를 찾으려면 ps aux
또는 pgrep (1) 을 사용하십시오)
사용 가능합니다 pmap
.
예를 들어, 프로세스를 시작하십시오. $ watch date
pid 받기 : $ ps -ef | grep watch
메모리 맵 표시 : $ pmap <pid>
전체 경로로 표시 : $ pmap <pid> -p
$ pmap 72770
72770: watch date
00005613a32c9000 20K r-x-- watch
00005613a34cd000 4K r---- watch
00005613a34ce000 4K rw--- watch
00005613a4f6a000 264K rw--- [ anon ]
00007f2f3a7d5000 204616K r---- locale-archive
00007f2f46fa7000 1748K r-x-- libc-2.27.so
00007f2f4715c000 2048K ----- libc-2.27.so
00007f2f4735c000 16K r---- libc-2.27.so
00007f2f47360000 8K rw--- libc-2.27.so
00007f2f47362000 16K rw--- [ anon ]
00007f2f47366000 12K r-x-- libdl-2.27.so
00007f2f47369000 2044K ----- libdl-2.27.so
00007f2f47568000 4K r---- libdl-2.27.so
00007f2f47569000 4K rw--- libdl-2.27.so
00007f2f4756a000 160K r-x-- libtinfo.so.6.1
00007f2f47592000 2048K ----- libtinfo.so.6.1
00007f2f47792000 16K r---- libtinfo.so.6.1
00007f2f47796000 4K rw--- libtinfo.so.6.1
00007f2f47797000 232K r-x-- libncursesw.so.6.1
00007f2f477d1000 2048K ----- libncursesw.so.6.1
00007f2f479d1000 4K r---- libncursesw.so.6.1
00007f2f479d2000 4K rw--- libncursesw.so.6.1
00007f2f479d3000 148K r-x-- ld-2.27.so
00007f2f47bdb000 20K rw--- [ anon ]
00007f2f47bf1000 28K r--s- gconv-modules.cache
00007f2f47bf8000 4K r---- ld-2.27.so
00007f2f47bf9000 4K rw--- ld-2.27.so
00007f2f47bfa000 4K rw--- [ anon ]
00007ffd39404000 136K rw--- [ stack ]
00007ffd3959b000 12K r---- [ anon ]
00007ffd3959e000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 215692K
$ pmap 72770 -p
72770: watch date
00005613a32c9000 20K r-x-- /usr/bin/watch
00005613a34cd000 4K r---- /usr/bin/watch
00005613a34ce000 4K rw--- /usr/bin/watch
00005613a4f6a000 264K rw--- [ anon ]
00007f2f3a7d5000 204616K r---- /usr/lib/locale/locale-archive
00007f2f46fa7000 1748K r-x-- /usr/lib64/libc-2.27.so
00007f2f4715c000 2048K ----- /usr/lib64/libc-2.27.so
00007f2f4735c000 16K r---- /usr/lib64/libc-2.27.so
00007f2f47360000 8K rw--- /usr/lib64/libc-2.27.so
00007f2f47362000 16K rw--- [ anon ]
00007f2f47366000 12K r-x-- /usr/lib64/libdl-2.27.so
00007f2f47369000 2044K ----- /usr/lib64/libdl-2.27.so
00007f2f47568000 4K r---- /usr/lib64/libdl-2.27.so
00007f2f47569000 4K rw--- /usr/lib64/libdl-2.27.so
00007f2f4756a000 160K r-x-- /usr/lib64/libtinfo.so.6.1
00007f2f47592000 2048K ----- /usr/lib64/libtinfo.so.6.1
00007f2f47792000 16K r---- /usr/lib64/libtinfo.so.6.1
00007f2f47796000 4K rw--- /usr/lib64/libtinfo.so.6.1
00007f2f47797000 232K r-x-- /usr/lib64/libncursesw.so.6.1
00007f2f477d1000 2048K ----- /usr/lib64/libncursesw.so.6.1
00007f2f479d1000 4K r---- /usr/lib64/libncursesw.so.6.1
00007f2f479d2000 4K rw--- /usr/lib64/libncursesw.so.6.1
00007f2f479d3000 148K r-x-- /usr/lib64/ld-2.27.so
00007f2f47bdb000 20K rw--- [ anon ]
00007f2f47bf1000 28K r--s- /usr/lib64/gconv/gconv-modules.cache
00007f2f47bf8000 4K r---- /usr/lib64/ld-2.27.so
00007f2f47bf9000 4K rw--- /usr/lib64/ld-2.27.so
00007f2f47bfa000 4K rw--- [ anon ]
00007ffd39404000 136K rw--- [ stack ]
00007ffd3959b000 12K r---- [ anon ]
00007ffd3959e000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 215692K
lld
다윈에, 그것은 나타납니다,도 나는 사제를 통해 찾을 수 있습니다.