LD_PRELOAD 트릭은 무엇입니까?


342

나는 최근 proggit 에서 그것에 대한 언급을 보았 으며 (현재로서는) 설명되어 있지 않습니다.

나는 이것이 그럴 지도 모른다, 그러나 나는 확실하지 않다.


1
실제로 답변이 아니기 때문에 하나로 게시하지는 않지만 ... Stephen Kell 은이 비디오에서 liballocs 라이브러리에 LD_PRELOAD를 사용하고 있으며 이전 비트를 보면 어떻게 / 왜 더 잘 이해할 수 있습니다. liballocs는 다른 동적 언어가 서로 통신 할 수 있도록 사용되는 것으로 보입니다. 이 강연에는 그 안에 몇 가지 깊은 내부 내용이 있습니다. youtu.be/LwicN2u6Dro?t=24m10s
Elijah Lynn

답변:


415

LD_PRELOAD공유 객체의 경로로 설정 하면 해당 파일이 다른 라이브러리 (C 런타임 포함) 보다 먼저 로드됩니다 libc.so. 따라서 ls특별한 malloc()구현 으로 실행하려면 다음 을 수행하십시오.

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls

12
나는 이것이 존재한다는 것을 몰랐다. 그것은 보안 공격의 주요 벡터가 될 것 같다. 그것이 어떻게 보호되는지 아십니까?
rmeador

141
ruid! = euid 인 경우 로더가 LD_PRELOAD를 무시한다는 사실에 의해 보장됩니다! = euid-Joshua
Joshua

18
@Joshua : Ruid와 Euid 란 무엇입니까?
heinrich5991 10

20
@ heinrich5991 실제적이고 효과적인 사용자 ID : lst.de/~okir/blackhats/node23.html
gsingh2011

59
명심해야 할 중요한 사항 중 하나는 일반적으로에 대한 절대 경로를 지정하려는 것 LD_PRELOAD입니다. 그 이유는 환경 변수이기 때문에 자식 프로세스에 의해 상속되므로 부모 프로세스와 다른 작업 디렉토리를 가질 수 있습니다. 따라서 상대 경로는 사전로드 할 라이브러리를 찾지 못합니다.
Frerich Raabe

49

동일한 기호로 라이브러리를 만들고에 라이브러리를 지정하여 스톡 라이브러리의 기호를 재정의 할 수 있습니다 LD_PRELOAD.

일부 사람들은이 라이브러리를 사용하여 비표준 위치에 라이브러리를 지정하지만 LD_LIBRARY_PATH그 목적에 더 좋습니다.


17
"어떤 사람들은 비표준 위치에 라이브러리를 지정하기 위해 그것을 사용합니다"... 정말? "어떤 사람들은 그것을 잘못 사용합니다"라고 들립니다!
Tom

6
로드 순서로 인해 LD_PRELOAD는 애플리케이션 지정 하드 코딩 된 경로를 가로 챌 수 있습니다.
Joshua

1
호환 되는 다른 버전 의 라이브러리 를 미리로드하는 것이 오용 입니까?
z0r

2
디버그 또는 계측 변형을로드하거나 다른 시스템을 에뮬레이트하는 것처럼 기본 라이브러리와 완전히 다른 것을 수행하는 라이브러리를로드하는 데 사용되는 것을 보았습니다.
Joshua

1
라이브러리가 올바르게 컴파일되지 않은 경우 (사용하는 perl의 버전에 따라 이전 버전의 심볼릭 링크를 덮어 쓰는 일반 libmysql_client에 느슨하게 연결되는 모든 시간이 mysql과 함께 실행되는 경우) . / 그것은 아주 유용 .. 만약 내가 올바르게 기억 LD_PRELOAD .. 유용한 트릭과 강제, Valgrind의 재 컴파일 할 필요없이 바이너리에 대한 디버깅 기능을 제공하기 위해이 기술을 사용한다.
synthesizerpatel

37

함께 LD_PRELOAD사용하면 라이브러리에게 우선 순위를 부여 할 수 있습니다.

예를 들어, 당신은 구현 라이브러리를 쓸 수 mallocfree. 그리고에 의해 이러한로드 LD_PRELOAD당신 mallocfree표준들보다는 실행됩니다.


그러나 프로그램이 사용한다면 calloc어떨까요? 그게 다 엉망이 아닌가?
Janus Troelsen

7
@JanusTroelsen 작성한 라이브러리가 특정 파트를 구현하지 않으면 해당 파트는 원래 라이브러리에서로드됩니다.
Woodrow Barlow

@JanusTroelsen, 즉, LD_PRELOAD를 사용하면 사용할 특정 심볼 구현을 지정할 수 있습니다 . 사전로드 된 라이브러리가 심볼을 내 보내지 않으면 다른 곳에서 찾을 수 있습니다.
sherrellbc

1
@JanusTroelsen : mallocFree는 특별히 glibc로 디자인되어 있으며이를 통해 재고 calloc관리는 수입품을 호출 할 수 있습니다 malloc. 다른 기능으로는 시도하지 마십시오. 잘 작동하지 않습니다.
Joshua

30

많은 사람들이 언급했듯이 LD_PRELOAD라이브러리를 미리로드 하는 데 사용 합니다. BTW, 당신은 할 수 확인 설정을하여 사용할 수있는 경우 ldd명령.

예 : 자신을 미리로드해야한다고 가정합니다 libselinux.so.1.

> ldd /bin/ls
    ...
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)

따라서 사전로드 환경을 설정하십시오.

  export LD_PRELOAD=/home/patric/libselinux.so.1

라이브러리를 다시 확인하십시오.

>ldd /bin/ls
    ...
    libselinux.so.1 =>
    /home/patric/libselinux.so.1 (0x00007fb9245d8000)
    ...

9

LD_PRELOAD표준 세트를 재정의하는 함수가있는 공유 라이브러리를 나열합니다 /etc/ld.so.preload. 이것들은 로더에 의해 구현됩니다 /lib/ld-linux.so. 선택한 기능 중 일부만 무시하려면 재정의 객체 파일을 만들고 설정을 사용하면됩니다 LD_PRELOAD. 이 객체 파일의 함수는 다른 함수를 그대로 남겨둔 함수 만 무시합니다.

공유 라이브러리에 대한 자세한 내용은 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html을 방문하십시오.


3

사전로드에 대한 자세한 블로그 게시물은 다음과 같습니다.

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/


13
답변을 게시 해 주셔서 감사합니다! 이 사이트 또는이 사이트에서 답변의 필수 부분을 게시 해야합니다. 원하는 경우 링크를 계속 포함 할 수 있지만 '참조'로만 사용할 수 있습니다. 답은 링크가 없어도 독자적으로 세워 져야합니다.
Taryn

3

mylib.soenv로 쉽게 내보낼 수 있습니다.

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

비활성화하려면 :

$ export LD_PRELOAD=

7
또는unset LD_PRELOAD
Morten

2

LD_PRELOAD를 사용하면 파일을 $export LD_PRELOAD=/path/lib미리로드 할 다른 lib 보다 먼저 로드 할 수 있으며 프로그램에서도 사용할 수 있습니다.


1

LD_PRELOAD경로를 사용 하면 응용 프로그램 로더가 제공된 기본값보다 제공된 공유 오브젝트를 강제로로드 할 수 있습니다.

개발자는이를 사용하여 다른 버전의 공유 객체를 제공하여 응용 프로그램을 디버깅합니다.

준비된 공유 객체를 사용하여 기존 기능을 재정 의하여 특정 응용 프로그램을 해킹하는 데 사용했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.