Tham gia thực thi và tất cả các thư viện của nó


8

Hãy nói rằng tôi có một /bin/cattệp thực thi sử dụng các thư viện chia sẻ sau:

linux-vdso.so.1
libc.so.6
/lib64/ld-linux-x86-64.so.2

Có thể bằng cách nào đó "tham gia" những thứ đó với nhau (kho lưu trữ thực thi hoặc một cái gì đó tương tự)?

Tôi không có mã chương trình tôi muốn làm điều đó, vì vậy tôi không thể biên dịch nó với cờ -static.

Câu trả lời:


6

Bạn có thể sao chép tất cả các thư viện của nó từ các vị trí hệ thống của chúng vào thư mục con nơi thực thi của bạn và sử dụng patchelf , để làm cho giao diện thực thi của nó đối với các thư mục lib của nó ở đó thay vì các thư mục lib của hệ thống.

Ví dụ:

tương đối_libs:

#!/bin/bash -e
[ -n "$1" ] || set -- a.out
mkdir -p ./lib/ #<copy the libraries here
#use ldd to resolve the libs and use `patchelf --print-needed to filter out
# "magic" libs kernel-interfacing libs such as linux-vdso.so, ld-linux-x86-65.so or libpthread
# which you probably should not relativize anyway
join \
    <(ldd "$1" |awk '{if(substr($3,0,1)=="/") print $1,$3}' |sort) \
    <(patchelf --print-needed "$1" |sort) |cut -d\  -f2 |

#copy the lib selection to ./lib
xargs -d '\n' -I{} cp --copy-contents {} ./lib 
#make the relative lib paths override the system lib path
patchelf --set-rpath "\$ORIGIN/lib" "$1"

(Tôi tin rằng không giống như LD_LIBRARY_PATHhack, điều này cũng sẽ hoạt động với các tệp thực thi setuid).

Sau đó, tất cả những gì bạn phải làm là di chuyển ./libthư mục đó cùng với tệp thực thi.


1
Công việc tốt đẹp! Các đầu vào "tham gia" phải được sắp xếp, vì vậy bạn nên đặt các đầu ra ldd và patchelf thông qua sắp xếp.
Bklyn

5

Phụ thuộc vào những gì bạn có nghĩa là "tham gia". Cách tốt nhất là biên dịch lại nguồn gốc dưới dạng nhị phân tĩnh.

Tuy nhiên, bạn có thể bao gồm tất cả các thư viện trong thư mục con được điều khiển bởi ứng dụng ( /usr/share/myappví dụ) và sau đó đặt thư mục đó theo thứ tự tìm kiếm thư viện. Một cách để làm điều này là (trong Linux) để sử dụng LD_LIBRARY_PATH:

LD_LIBRARY_PATH=/usr/share/myapp/lib:/usr/local/lib:/usr/lib/i686-linux-gnu:/lib/i686-linux-gnu

Trong Linux, bạn có thể sửa đổi /etc/ld.so.conftệp để thực hiện điều tương tự - và Ubuntu cũng thêm các *.conftệp trong /etc/ld.so.conf.dthư mục.


+1. Để làm rõ, tôi tin rằng bạn phải biên dịch lại nhị phân ban đầu dưới dạng nhị phân tĩnh.
Kyle Smith

Không. Chỉ cần thiết lập đường dẫn tìm kiếm thư viện như mong muốn và được thực hiện với nó.
Mei

4

Việc chuyển đổi một loạt các đối tượng được chia sẻ và ELF chia sẻ có thể thực thi được thành một blob được liên kết tĩnh không đơn giản.

Các kho lưu trữ thực thi mà bạn đề cập có thể có thể. Giả sử rằng bằng 'lưu trữ thực thi', bạn có nghĩa là một tệp khi chạy un-zips chính nó và chạy một chương trình mà không phụ thuộc vào các tệp khác trên hệ thống.

Điều này có thể được thực hiện khá đơn giản bằng cách sử dụng shell script và một loạt các tiện ích được tìm thấy trong hầu hết các bản phân phối linux (Tuy nhiên, nó bổ sung các phụ thuộc vào shell và các tiện ích). Làm cho ELF 'lưu trữ thực thi' có thể được tham gia nhiều hơn mặc dù các nguyên tắc là như nhau. Nếu bạn mong muốn phiên bản chương trình của mình được thực thi thường xuyên, bạn nên sửa đổi tập lệnh để 'cài đặt' nó vào hệ thống người dùng như được chỉ định bởi Davidjanneb .

Một ví dụ sử dụng shell script dựa trên lưu trữ thực thi

Thu thập các tệp bạn cần để thực hiện, một ví dụ sử dụng catchương trình sẽ có các mục sau:

fachas_cat_files/cat
fachas_cat_files/lib/libc.so.6

Base64 mã hóa tệp tgz và tạo nó cat.b64, có thể được thực hiện như thế này sau khi thiết lập fachas_cat_filesthư mục của bạn .

tar -cz fachas_cat_files | base64 > cat.b64

Điều này làm cho một đại diện của tệp tar với các ký tự có thể in được để nó có thể được bao gồm trong tập lệnh.

Lưu ý md5sums của các tệp bạn đang đóng gói, mà bạn sử dụng để xác minh xem các tệp chưa được chỉnh sửa là của riêng bạn hay không, trong tập lệnh shell.

find fachas_cat_files/ -type f -exec md5sum {} \; > cat.md5

Tạo một kịch bản shell như sau và đặt tên cho chương trình "lưu trữ" mới của bạn.

#!/bin/bash

TEMP_DIR=/tmp

# Check Md5sum
md5sum -c --quiet >/dev/null 2>&1 <<EOF 
--- Paste contents of cat.md5 here. ---
EOF

# Untar from base64 encoded tarball.
test $? -eq 0 || base64 -d <<EOF | tar -xz -C ${TEMP_DIR}
--- Paste contents of cat.b64 here. ---
EOF

# Execute the binary.
LD_LIBRARY_PATH=${TEMP_DIR}/fachas_cat_files/lib/ ${TEMP_DIR}/fachas_cat_files/cat $*

# Optionally remove the temporary files, if you do, the whole md5sum set of steps is 
# not necessary.
# rm -fr ${TEMP_DIR}/fachas_cat_files

0

Không, nó không thể. Những gì bạn có thể làm là tạo một kho lưu trữ (.tar.gz hoặc bất cứ thứ gì) có chứa

  • Bản thực thi ban đầu được đổi tên, nói bin / cat.real
  • Một thư mục riêng, giả sử lib / fachas-cat chứa các bản sao của tất cả các thư viện cần bin / cat.real
  • Một thùng / mèo shellscript đặt LD_LIBRARY_PATH thành $ SOME_INSTALL_PREFIX / lib / fachas-cat / và chạy bin / cat.real
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.