Câu hỏi Thủ thuật LD_PRELOAD là gì?


Tôi đã xem qua một tham chiếu đến nó gần đây trên proggit và (hiện tại) nó không được giải thích.

tôi nghi ngờ điều này có thể là nó, nhưng tôi không biết chắc chắn.


260
2018-01-08 22:14


gốc


Không thực sự là một câu trả lời vì vậy tôi sẽ không đăng nó như là một nhưng ... Stephen Kell đang sử dụng LD_PRELOAD cho thư viện liballocs của mình trong video này và nếu bạn xem các bit trước, bạn có thể hiểu rõ hơn về cách thức / lý do. liballocs dường như đang được sử dụng để các ngôn ngữ động khác có thể nói chuyện với nhau. Cuộc nói chuyện này có một số sâu bên trong giải thích trong đó. youtu.be/LwicN2u6Dro?t=24m10s - Elijah Lynn


Các câu trả lời:


Nếu bạn đặt LD_PRELOAD với đường dẫn của đối tượng được chia sẻ, tệp đó sẽ được tải trước bất kỳ thư viện nào khác (bao gồm cả thời gian chạy C, libc.so). Vì vậy, để chạy ls với đặc biệt của bạn malloc() thực hiện, làm điều này:

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

317
2018-01-08 22:20



Tôi không có ý tưởng này tồn tại ... nó có vẻ như nó sẽ là một vector chính cho các cuộc tấn công an ninh. Bất kỳ ý tưởng làm thế nào nó được bảo đảm? - rmeador
Nó được đảm bảo bởi thực tế bộ nạp sẽ bỏ qua LD_PRELOAD nếu ruid! = Euid - Joshua - Joshua
@ Joshua: những gì là ruid và euid? - heinrich5991
@ heinrich5991 Id người dùng thực và hiệu quả: lst.de/~okir/blackhats/node23.html - gsingh2011
Một điều quan trọng cần lưu ý: bạn thường muốn chỉ định tuyệt đối đường dẫn đến LD_PRELOAD. Lý do là nó là một biến môi trường, nó được thừa hưởng bởi các tiến trình con - có thể có một thư mục làm việc khác với tiến trình cha. Vì vậy, bất kỳ đường dẫn tương đối nào sẽ không tìm được thư viện để tải trước. - Frerich Raabe


Bạn có thể ghi đè các biểu tượng trong thư viện chứng khoán bằng cách tạo một thư viện có cùng biểu tượng và chỉ định thư viện trong LD_PRELOAD.

Một số người sử dụng nó để chỉ định thư viện ở những vị trí không chuẩn, nhưng LD_LIBRARY_PATH tốt hơn cho mục đích đó.


36
2018-01-08 22:18



"Một số người sử dụng nó để chỉ định thư viện ở những vị trí không chuẩn" ... Thật sao? Âm thanh như "Một số người sử dụng nó sai"! - Tom
LD_PRELOAD có thể nhờ vào thứ tự tải chặn các đường dẫn được mã hóa do ứng dụng chỉ định. - Joshua
Nó sẽ là một sự lạm dụng để tải trước một phiên bản của một thư viện - giả sử chúng tương thích? - z0r
Tôi đã nhìn thấy nó được sử dụng để tải một biến thể hoặc thiết bị biến thể, hoặc để tải một thư viện mà làm một cái gì đó hoàn toàn hoàn toàn khác nhau từ thư viện cơ sở như thể thi đua một số hệ thống khác. - Joshua
Trong trường hợp các thư viện không được biên dịch chính xác (được sử dụng để chạy với mysql tất cả thời gian mà nó có một khớp nối lỏng lẻo với một libmysql_client chung có ghi đè liên kết của phiên bản cũ hơn - tùy thuộc vào phiên bản của perl bạn đã sử dụng, bạn phải chỉ định / force nó với LD_PRELOAD .. hữu ích trick.Nếu tôi nhớ chính xác, valgrind sử dụng kỹ thuật này để cung cấp khả năng gỡ lỗi để nhị phân mà không cần phải biên dịch lại .. nó khá hữu ích. - synthesizerpatel


Với LD_PRELOAD bạn có thể ưu tiên thư viện.

Ví dụ bạn có thể viết một thư viện thực hiện malloc và free. Và bằng cách tải những LD_PRELOAD của bạn malloc và free sẽ được thực hiện hơn là tiêu chuẩn.


28
2018-01-08 22:19



nhưng nếu chương trình sử dụng calloc? sẽ không làm hỏng mọi thứ? - Janus Troelsen
@JanusTroelsen nếu thư viện bạn viết không thực hiện một phần nào đó, phần đó sẽ được tải từ thư viện gốc. - Woodrow Barlow
@JanusTroelsen, Nói cách khác, LD_PRELOAD cho phép bạn chỉ định triển khai cụ thể nào ký hiệu được sử dụng. Nếu thư viện được tải sẵn không xuất một biểu tượng, nó sẽ được tìm thấy khác. - sherrellbc


Như nhiều người đã đề cập, sử dụng LD_PRELOAD để tải trước thư viện. BTW, bạn có thể KIỂM TRA nếu cài đặt có sẵn theo ldd chỉ huy.

Ví dụ: giả sử bạn cần tải trước 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)

Do đó, hãy đặt môi trường tải trước của bạn:

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

Kiểm tra lại thư viện của bạn:

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

20
2017-12-09 06:20





LD_PRELOAD liệt kê các thư viện được chia sẻ với các hàm ghi đè lên tập hợp tiêu chuẩn, giống như /etc/ld.so.preload làm. Chúng được thực hiện bởi bộ nạp /lib/ld-linux.so. Nếu bạn muốn ghi đè lên chỉ một vài chức năng được chọn, bạn có thể thực hiện việc này bằng cách tạo tệp và cài đặt đối tượng ghi đè LD_PRELOAD; các hàm trong tệp đối tượng này sẽ chỉ ghi đè các hàm đó để lại các hàm khác như chúng.

Để biết thêm thông tin về thư viện được chia sẻ, hãy truy cập   http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html


9
2017-07-24 09:41





thật dễ dàng để xuất mylib.so để env:

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

để tắt:

$ export LD_PRELOAD=

4
2018-02-04 10:03





Đây là một bài đăng blog chi tiết về tải trước:

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


2
2017-08-11 10:11



Cảm ơn bạn đã đăng câu trả lời! Xin lưu ý rằng bạn nên đăng các phần thiết yếu của câu trả lời ở đây, trên trang web này hoặc các nguy cơ của bạn trong bài đăng sẽ bị xóa Xem Câu hỏi thường gặp nơi đề cập đến câu trả lời 'hầu như không phải là liên kết'. Bạn vẫn có thể bao gồm liên kết nếu bạn muốn, nhưng chỉ là 'tham chiếu'. Câu trả lời nên tự đứng lên mà không cần liên kết. - Taryn♦


Sử dụng LD_PRELOAD đường dẫn, bạn có thể buộc trình tải ứng dụng tải đối tượng được chia sẻ được cung cấp, qua mặc định được cung cấp.

Các nhà phát triển sử dụng điều này để gỡ lỗi ứng dụng của họ bằng cách cung cấp các phiên bản khác nhau của các đối tượng được chia sẻ.

Chúng tôi đã sử dụng nó để hack các ứng dụng nhất định, bằng cách ghi đè các hàm hiện có bằng cách sử dụng các đối tượng được chia sẻ đã chuẩn bị.


1
2018-05-31 03:16