😈
ReverseMe
  • Introduction
  • References
  • ReverseMe
    • Introduction
      • What is Reverse Engineering?
      • Legality of Reverse Engineering
      • Reverse Engineering Communities
  • Programming Language
    • C
      • Basic
        • Pointer
        • Casting
      • Reference
        • stdio.h
          • fclose()
          • fopen()
          • fseek()
          • ftell()
          • fgetc()
          • fgets()
          • fread()
          • fprintf()
          • fwrite()
          • printf()
          • putchar()
          • puts()
          • sprintf()
          • snprintf()
        • stdlib.h
          • malloc()
          • calloc()
          • realloc()
          • free()
          • rand()
          • srand()
        • string.h
          • strcat()
          • strncat()
          • strcmp()
          • strncmp()
          • strcpy()
          • strncpy()
        • time.h
          • time()
  • Reversing Fundamentals
    • Stripped and Unstripped
  • Tools
    • file
    • strings
    • ltrace
    • ghidra
  • CTF Writeups
    • HackTheBox Challenges
      • Baby RE
      • You Cant C Me
  • ABOUT ME
    • Mail
    • LinkedIn
    • GitHub
Powered by GitBook
On this page
  • Apa itu ltrace?
  • Dynamic vs Static Library
  • 1. Dynamic Library
  • 2. Static Library
  1. Tools

ltrace

PreviousstringsNextghidra

Last updated 3 months ago

Apa itu ltrace?

adalah alat di Linux yang digunakan untuk memantau interaksi program dengan shared library, yaitu melihat fungsi-fungsi library yang dipanggil program saat dijalankan.

Di Linux, shared library (yang dikenal sebagai dynamic library atau shared object) umumnya berekstensi .so. Ketika sebuah library didekompilasi, biasanya hasilnya berupa pseudocode dalam format bahasa C. Hal ini terjadi karena decompiler mengubah kode mesin (assembly) yang kompleks menjadi pseudocode yang lebih mudah dipahami. Bahasa C dipilih karena strukturnya yang sederhana dan kedekatannya dengan kode assembly.

Dynamic vs Static Library

Sebelumnya dijelaskan bahwa ltrace hanya memantau interaksi program dengan dynamic library. Jika ada dynamic library, maka ada static library. Apa perbedaannya?

1. Dynamic Library

Dynamic library adalah kode yang disimpan pada file terpisah (misalnya, file dengan ekstensi .so) dan dimuat saat program utama dijalankan (runtime).

Berikut adalah karakteristik dari dynamic library:

  • Program utama hanya memanggil fungsi dari dynamic library, tidak menyimpan kode dari fungsi tersebut.

  • Fungsi pada library dapat diperbarui atau diganti tanpa perlu mengkompilasi ulang program utama.

  • Contoh dynamic library bawaan Linux:

    • ibc.so.6: Standar library untuk fungsi dasar bahasa C (misalnya, printf, scanf).

    • libm.so.6: Library matematika (misalnya, fungsi sin, cos, sqrt).

  • Bisa juga berupa library custom buatan sendiri.

Dari penjelasan ini seharusnya kita sudah semakin paham fungsi ltrace, yaitu memantau fungsi yang dipanggil oleh sebuah program ketika dijalankan.

a. Contoh: Program dengan Dynamic Library dari Sistem (libc)

Kita coba membuat program "Hello World" sederhana menggunakan bahasa C.

main.c
#include <stdio.h>

int main() {
    printf("Hello World!");
    return 0;
}

Kompilasi kode program tersebut, kemudian jalankan program menggunakan ltrace:

# Mengompilasi file main.c menjadi executable 'test'
➜ gcc -o test main.c

# Mengubah hak akses agar file 'test' dapat dieksekusi
➜ chmod +x test

# Menjalankan program dengan ltrace untuk memantau pemanggilan fungsi library
➜ ltrace ./test
printf("Hello World!")                      = 12
Hello World!+++ exited (status 0) +++

Terlihat bahwa ketika program memanggil fungsi printf, maka pemanggilan fungsi tersebut akan terlihat beserta parameter yang digunakan.

b. Contoh: Program dengan Dynamic Library Custom

Kita coba membuat custom library yang berisi fungsi custom_func().

customlib.c
#include <stdio.h>

void custom_func() {
    printf("Hello from custom_func (dynamic)!\n");
}

Kompilasi kode menjadi shared library (.so):

# -fPIC: Menghasilkan Position Independent Code (diperlukan untuk shared library)
# -shared: Menghasilkan shared library
# -o libcustom.so: Menentukan nama output file sebagai libcustom.so
➜ gcc -fPIC -shared -o libcustom.so customlib.c

Buat program utama yang menggunakan library custom.

main.c
// Deklarasi fungsi dari library custom
void custom_func();

int main() {
    custom_func();
    return 0;
}

Kompilasi program utama dengan me-link library custom.

# -L. : Mencari library di direktori saat ini (.)
# -lcustom : Meng-link library dengan nama 'custom' (mencari file libcustom.so)
➜ gcc -o myprog main.c -L. -lcustom

Jalankan program dengan ltrace:

# LD_LIBRARY_PATH=. : Mengatur agar sistem mencari shared library di direktori saat ini
➜ LD_LIBRARY_PATH=. ltrace ./myprog

custom_func(1, 0x7ffcadb1d1c8, 0x7ffcadb1d1d8, 0x56366928bdc8Hello from custom_func (dynamic)!
)                                                       = 34
+++ exited (status 0) +++

Terlihat bahwa pemanggilan fungsi dari library custom custom_func() berhasil terdeteksi oleh ltrace.

2. Static Library

Static library adalah kode yang disertakan langsung ke dalam file executable saat program dikompilasi, sehingga tidak ada pemanggilan fungsi dari file library terpisah saat program utama dijalankan (runtime).

Berikut adalah karakteristik dari static library:

  • Kode library menjadi bagian dari executable sehingga ukurannya lebih besar.

  • Tidak ada file library terpisah saat program dijalankan.

  • Fungsi pada library tidak bisa diperbarui secara terpisah dari executable.

Dari penjelasan ini, kita bisa mengetahui bahwa ltrace tidak dapat memantau pemanggilan fungsi dari static library karena kode yang dieksekusi sudah melebur ke dalam executable.

a. Contoh: Program dengan Static Library

Untuk membuat static library, kita akan membuat custom library dan mengintegrasikannya ke dalam program utama.

Untuk melakukannya, pertama-tama buat file custom library:

customlib.c
#include <stdio.h>

void custom_func() {
    printf("Hello from custom_func (static)!\n");
}

Jalankan perintah berikut untuk mengkompilasi dan menghasilkan file objek:

# -c : Mengompilasi file tanpa linking (menghasilkan file objek)
# -o customlib.o : Menentukan nama file objek sebagai customlib.o
➜ gcc -c customlib.c -o customlib.o

Buat static library (.a) dengan menggunakan perintah ar:

# ar : Alat untuk membuat, memodifikasi, dan mengekstrak arsip (library statis)
# r : Masukkan file ke dalam arsip (replace jika sudah ada)
# c : Membuat arsip jika belum ada
# s : Menghasilkan indeks simbol untuk linking yang lebih cepat
➜ ar rcs libcustom.a customlib.o

Buat file program utama:

// Deklarasi fungsi dari library custom
void custom_func();

int main() {
    custom_func();
    return 0;
}

Kompilasi program utama dengan static library:

# Mengompilasi main.c dan menggabungkan static library libcustom.a ke dalam executable
# -static : Memastikan linking dilakukan secara statis
➜ gcc -o myprog main.c libcustom.a -static

Jalankan program dengan ltrace:

➜ ltrace ./myprog

Couldn't find .dynsym or .dynstr in "/proc/12426/exe"
Hello from custom_func (static)! 

Karena library sudah dimasukkan langsung ke dalam executable (sebagai static library), ltrace tidak akan menampilkan pemanggilan fungsi dari libcustom.a.

ltrace