Mengatasi Masalah Kompatibilitas Library di Linux Menggunakan PatchELF

Mengatasi Masalah Kompatibilitas Library di Linux Menggunakan PatchELF. Kali ini saya akan sharing sedikit mengenai bagaimana mengatasi masalah kompatibilitas library sebuah file binary menggunakan utilitas bernama patchelf.

Saya sendiri sebenarnya bingung mau kasih judul artikelnya apa. Mungkin langsung kita contohkan saja.

Disini, sama memiliki program C sederhana, yang saya compile di Kali Linux.

#include <stdio.h>

int main() {
    printf("Hello from LinuxSec.n");
    return 0;
}

Program tersebut ketika di compile dan dijalankan akan menampilkan tulisan "Hello from LinuxSec".

gcc -o hello.elf hello.c

Masalahnya adalah, ketika file program yang sudah dicompile tersebut di transfer ke OS lain, misalnya disini saya kirim ke Ubuntu 18.04, ada kemungkinan program tersebut akan gagal dijalankan.

Contohnya disini muncul error:

./hello.elf: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./hello.elf)

Meskipun sebenarnya file /lib/x86_64-linux-gnu/libc.so.6 ini ada di Ubuntu.

Hal ini terjadi dikarenakan versi LIBC yang ada pada sistem Ubuntu 18.04 lebih rendah dari LIBC yang ada pada Kali Linux yang saya gunakan untuk meng-compile program tersebut.

Jika kasusnya hanyalah program sederhana seperti yang saya contohkan diatas, sebenarnya solusinya cukup mudah. Cukup kita compile ulang programnya menggunakan flag -static.

gcc -o hello-static.elf hello.c -static

Program yang di-compile menggunakan flag -static, seluruh library yang dibutuhkan oleh si aplikasi akan diikutsertakan kedalam program, alih-alih menggunakan shared library dari OS yang menjalankan program tersebut.

Namun, jika program yang dibuat terlalu kompleks, atau semisal kita tidak memiliki source code dari program yang akan dijalankan, kita bisa gunakan alternatif lain yakni menggunakan patchelf. Dengan utilitas ini, kita bisa memodifikasi dependensi atau shared library yang digunakan oleh si aplikasi.

Sebagai contoh, pada program sederhana yang kita pakai di tutorial ini, kita bisa mengganti lokasi library dan dynamic linker yang dibutuhkan.

ldd hello.elf

Kita copy libc.so.6 dan ld-linux-x86-64.so.2 ke current directory.

cp /lib/x86_64-linux-gnu/libc.so.6 . 
cp /lib64/ld-linux-x86-64.so.2 .

 Lalu ubah dynamic linker menggunakan flag --set-interpreter.

patchelf ./hello.elf --set-interpreter ./ld-linux-x86-64.so.2

Selanjutnya ubah juga lokasi library yang digunakan menggunakan flag --replace-needed.

patchelf ./hello.elf --replace-needed libc.so.6 ./libc.so.6

Sekarang kita copy seluruh file nya ke sistem operasi target.

Selain cara diatas, sebenarnya masih ada satu cara lagi yakni melakukan compile dari sistem operasi yang memiliki versi LIBC yang sama atau lebih rendah.

Cara-cara diatas sangat membantu ketika kita ingin menjalankan exploit atau program pada sistem operasi yang lawas, dan di sistem operasi tersebut belum terinstall gcc sehingga kita harus mengirim pre-compiled binary.

Oke mungkin sekian sharing kali ini, jika ingin explore lebih lanjut mengenai patchelf bisa cek dikumentasi yang ada di GitHub:

  • https://github.com/NixOS/patchelf

Posting Komentar untuk "Mengatasi Masalah Kompatibilitas Library di Linux Menggunakan PatchELF"