mã của tôi là như sau: preload.c, với các nội dung sau đây:LD_PRELOAD ảnh hưởng đến đứa trẻ mới ngay cả sau khi unsetenv ("LD_PRELOAD")
#include <stdio.h>
#include <stdlib.h>
int __attribute__((constructor)) main_init(void)
{
printf("Unsetting LD_PRELOAD: %x\n",unsetenv("LD_PRELOAD"));
FILE *fp = popen("ls", "r");
pclose(fp);
}
sau đó trong vỏ (làm lệnh thứ 2 với chăm sóc !!):
gcc preload.c -shared -Wl,-soname,mylib -o mylib.so -fPIC
LD_PRELOAD=./mylib.so bash
!!! cẩn thận với lệnh cuối cùng, nó sẽ dẫn đến vòng lặp vô hạn của "sh-ls". Dừng lại sau 2 giây với^C, (hoặc tốt hơn^Z và sau đó xem ps).
Thông tin thêm
- Vấn đề này liên quan đến bash trong một cách nào đó; hoặc là lệnh mà người dùng chạy, hoặc như là bash popen thực thi.
- bổ sung Các yếu tố chính: 1) thực hiện popen từ thư viện được tải sẵn, 2) có thể cần phải làm popen trong phần khởi tạo của thư viện.
nếu bạn sử dụng:
LD_DEBUG=all LD_DEBUG_OUTPUT=/tmp/ld-debug LD_PRELOAD=./mylib.so bash
thay vì lệnh cuối cùng, bạn sẽ nhận được nhiều tác phẩm ld-debug, tên /tmp/ld-debug.*. Một cho mỗi quá trình chia hai. TRONG TẤT CẢ CÁC LỌC NÀY, bạn sẽ thấy rằng các ký hiệu được tìm kiếm lần đầu tiên trong mylib.so mặc dù LD_PRELOAD đã bị xóa khỏi môi trường.
chúng ta đang nói về ngôn ngữ nào? – mvds
chúng ta đang nói về ngôn ngữ C – avner
@ user395074, sau đó, có lẽ, bạn nên đã điều chỉnh thẻ của bạn để phản ánh ngôn ngữ (nhấp vào liên kết "chỉnh sửa"). Ngoài ra, thẻ [preloader] dường như không phản ánh thành phần hệ điều hành mà chúng ta đang thảo luận. –