LD_PRELOAD hilesi nedir?


342

Son zamanlarda proggit üzerinde bir referans geldi ve (şu andan itibaren) açıklanmıyor.

Sanıyorum bu o olabilir, ama emin değiliz.


1
Gerçekten bir cevap değil, bu yüzden bir tane olarak yayınlamayacağım ama ... Stephen Kell bu videodaki liballocs kütüphanesi için LD_PRELOAD kullanıyor ve önceki bitleri izlerseniz nasıl / neden olduğunu daha iyi anlayabilirsiniz. Diğer dinamik diller birbirleriyle konuşabilmeleri için liballocs kullanılıyor gibi görünüyor. Bu konuşmanın içinde bazı derin içsel açıklamalar var. youtu.be/LwicN2u6Dro?t=24m10s
Elijah Lynn

Yanıtlar:


415

LD_PRELOADPaylaşılan bir nesnenin yolunu ayarlarsanız , bu dosya diğer kitaplıklardan (C çalışma zamanı dahil) önce yüklenir libc.so. lsÖzel malloc()uygulamanızla çalıştırmak için şunu yapın :

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

12
Bunun var olduğu hakkında hiçbir fikrim yoktu ... güvenlik saldırıları için büyük bir vektör gibi görünüyor. Nasıl güvence altına alındığına dair bir fikrin var mı?
08:24

141
Yükleyici, ruid! - euid - Joshua
Joshua

18
@Joshua: Ruid ve euid nedir?
heinrich5991

20
@ heinrich5991 Gerçek ve etkili kullanıcı kimlikleri: lst.de/~okir/blackhats/node23.html
gsingh2011

59
Akılda tutulması gereken önemli bir şey: genellikle mutlak bir yol belirtmek istersiniz LD_PRELOAD. Bunun nedeni, bir ortam değişkeni olması, üst süreçten farklı bir çalışma dizinine sahip olabilecek alt süreçler tarafından miras alınmasıdır. Bu nedenle, göreceli herhangi bir yol önceden yüklenecek kitaplığı bulamaz.
Frerich Raabe

49

Aynı sembollere sahip bir kütüphane oluşturarak ve içindeki kütüphaneyi belirterek stok kütüphanelerindeki sembolleri geçersiz kılabilirsiniz LD_PRELOAD.

Bazı insanlar standart olmayan yerlerde kütüphaneleri belirtmek için kullanır, ancak LD_LIBRARY_PATHbu amaç için daha iyidir.


17
“Bazı insanlar bunu standart olmayan yerlerde kütüphaneleri belirtmek için kullanıyor” ... Gerçekten mi? "Bazı insanlar yanlış kullanıyor" gibi geliyor!
Tom

6
LD_PRELOAD, yük sırası kesme uygulaması tarafından belirlenen sabit kodlanmış yollar nedeniyle olabilir.
Joshua

1
Uyumlu olduklarını varsayarak, bir kütüphanenin farklı bir sürümünü önceden yüklemek yanlış olur mu?
z0r

2
Bir hata ayıklama veya enstrümanlı varyant yüklemek için veya başka bir sistemi taklit etmek gibi temel kütüphaneden tamamen farklı bir şey yapan bir kitaplık yüklemek için kullanıldığını gördüm.
Joshua

1
Kütüphanelerin doğru bir şekilde derlenmemesi durumunda (daha önce kullandığınız perl sürümüne bağlı olarak, daha eski bir sürümün simgesinin üzerine yazılan genel bir libmysql_client ile gevşek bir bağlantısı olduğu her zaman mysql ile çalışmak için kullanılır) . / bu oldukça kullanışlı .. Yanlış hatırlamıyorsam LD_PRELOAD .. kullanışlı hile ile zorlamak, valgrind recompile gerek kalmadan ikili için hata ayıklama yeteneği sağlamak için bu tekniği kullanır.
synthesizerpatel

37

İle LD_PRELOADsize kütüphaneler öncelik verebilir.

Örneğin, mallocve uygulayan bir kütüphane yazabilirsiniz free. Ve tarafından bu yükleme LD_PRELOADSİZİN mallocve freestandart olanlardan daha ziyade çalıştırılacaktır.


ama program kullanırsa calloc? bu her şeyi mahvetmez miydi?
Janus Troelsen

7
@JanusTroelsen, yazdığınız kitaplık belirli bir parçayı uygulamıyorsa, bu bölüm orijinal kitaplıktan yüklenir.
Woodrow Barlow

@JanusTroelsen, Başka bir deyişle, LD_PRELOAD belirli bir sembolün hangi uygulamasının kullanılacağını belirlemenizi sağlar. Önceden yüklenmiş kitaplık bir sembolü dışa aktarmazsa, başka bulunabilir.
sherrellbc

1
@JanusTroelsen: mallocÜcretsiz ve ücretsiz olarak glibc'de buna izin vermek için özel olarak tasarlandığı ortaya çıkıyor ve hisse senedi callociçe aktarılanınızı aramayı başarıyor malloc. Bunu başka işlevlerle denemeyin. O kadar iyi çalışmayacak.
Joshua

30

Birçok kişinin belirttiği gibi, LD_PRELOADkütüphaneyi önceden yüklemek için kullanıyor . BTW, ayarın komutla kullanılabilir olup olmadığını KONTROL EDİN ldd.

Örnek: kendi yüklemenizi yapmanız gerektiğini varsayalım 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)

Böylece, önyükleme ortamınızı ayarlayın:

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

Kütüphanenizi tekrar kontrol edin:

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

9

LD_PRELOADTıpkı standart kümeyi geçersiz kılan işlevlere sahip paylaşılan kitaplıkları listeler /etc/ld.so.preload. Bunlar yükleyici tarafından uygulanır /lib/ld-linux.so. Sadece birkaç seçilen işlevi geçersiz kılmak istiyorsanız, bunu geçersiz kılan bir nesne dosyası ve ayar oluşturarak yapabilirsiniz LD_PRELOAD; bu nesne dosyasındaki işlevler yalnızca diğerlerini oldukları gibi bırakan işlevleri geçersiz kılar.

Paylaşılan kütüphaneler hakkında daha fazla bilgi için http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html adresini ziyaret edin.


3

İşte önyükleme hakkında ayrıntılı bir blog yazısı:

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


13
Cevabınızı gönderdiğiniz için teşekkürler! Cevabın önemli kısımlarını burada, bu sitede yayınlamanız veya kayıt risklerinizin silinmesi gerektiğini lütfen unutmayın . 'Bağlantıdan çok daha fazla' olan cevaplardan bahsettiği SSS'ye bakın. İsterseniz bağlantıyı yine de ekleyebilirsiniz, ancak yalnızca 'başvuru' olarak ekleyebilirsiniz. Cevap, bağlantıya ihtiyaç duymadan kendi başına durmalıdır.
Taryn

3

mylib.soenv'ye dışa aktarmak kolaydır :

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

devre dışı bırakmak için:

$ export LD_PRELOAD=

7
veyaunset LD_PRELOAD
Morten

2

LD_PRELOAD kullanıldığında, bu dosya $export LD_PRELOAD=/path/libönceden yüklenecek diğer herhangi bir lib'den önce yüklenir, hatta bu programlarda da kullanılabilir


1

LD_PRELOADYolu kullanarak , uygulama yükleyiciyi sağlanan varsayılan nesneyi sağlanan varsayılan nesneyi yüklemeye zorlayabilirsiniz.

Geliştiriciler, paylaşılan nesnelerin farklı sürümlerini sağlayarak uygulamalarında hata ayıklamak için bunu kullanır.

Hazır paylaşılan nesneleri kullanarak mevcut işlevleri geçersiz kılarak belirli uygulamaları kesmek için kullandık.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.