Что такое трюк LD_PRELOAD?

292

Недавно я встретил ссылку на proggit и (на данный момент) не объясняется.

Я подозреваю, что это может быть, но я точно не знаю.

  • 1
    На самом деле это не ответ, так что я не буду публиковать его как один, но ... Стивен Келл использует LD_PRELOAD для своей библиотеки liballocs в этом видео, и если вы посмотрите предыдущие биты, вы можете лучше понять, как и почему. Похоже, что liballocs используется, чтобы другие динамические языки могли общаться друг с другом. В этом разговоре объясняются некоторые глубокие внутренние аспекты. youtu.be/LwicN2u6Dro?t=24m10s
Теги:
environment-variables

9 ответов

365
Лучший ответ

Если вы установите для LD_PRELOAD путь к общему объекту, этот файл будет загружен до любой другой библиотеки (включая C runtime, libc.so). Поэтому для запуска ls с вашей специальной реализацией malloc() сделайте следующее:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
  • 11
    Я понятия не имел, что это существует ... кажется, что это будет основным вектором для атак безопасности. Есть идеи, как это обеспечить?
  • 132
    Это обеспечивается тем, что загрузчик игнорирует LD_PRELOAD, если ruid! = Euid - Джошуа
Показать ещё 9 комментариев
42

Вы можете переопределить символы в библиотеках запаса, создав библиотеку с теми же символами и указав библиотеку в LD_PRELOAD.

Некоторые люди используют его для указания библиотек в нестандартных местах, но LD_LIBRARY_PATH лучше для этой цели.

  • 16
    «Некоторые люди используют его для указания библиотек в нестандартных местах» ... Правда? Звучит как "Некоторые люди используют это неправильно"!
  • 6
    LD_PRELOAD может в силу порядка загрузки перехватывать заданные приложением жестко заданные пути.
Показать ещё 4 комментария
31

С LD_PRELOAD вы можете присвоить библиотеку приоритет.

Например, вы можете написать библиотеку, которая реализует malloc и free. И загружая их с помощью LD_PRELOAD, ваши malloc и free будут выполняться, а не стандартные.

  • 0
    а что если программа использует calloc ? разве это не все испортит?
  • 6
    @JanusTroelsen, если библиотека, которую вы пишете, не реализует определенную часть, эта часть будет загружена из исходной библиотеки.
Показать ещё 1 комментарий
22

Как упоминалось многие люди, используя 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

легко экспортировать mylib.so в env:

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

отключить:

$ export LD_PRELOAD=
2

Вот подробное сообщение в блоге о предварительной загрузке:

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

1

Используя путь LD_PRELOAD, вы можете заставить загрузчик приложений загружать предоставленный общий объект по предоставленному по умолчанию.

Разработчики используют это для отладки своих приложений, предоставляя разные версии общих объектов.

Мы использовали его для взлома некоторых приложений путем переопределения существующих функций с использованием готовых общих объектов.

0

когда используется LD_PRELOAD, этот файл будет загружен до того, как будет предварительно загружен любой другой $export LD_PRELOAD=/path/lib lib, даже это можно использовать и в программах

Ещё вопросы

Сообщество Overcoder
Наверх
Меню