GNU/Linux >> Belajar Linux >  >> Linux

Apa yang dilakukan ENV (“_”) untuk anti-debugging?

Bash menetapkan variabel lingkungan _ ke jalur ke perintah yang sedang dieksekusi. Begitu juga zsh dan pdksh. Tetapi shell lain, seperti fish dan dash (yang merupakan shell skrip default pada banyak distribusi Linux) tidak melakukannya. ATT ksh menyetelnya ke nilai yang menyertakan jalur ke perintah.

Idenya adalah sebuah program dapat memeriksa nilai dari variabel lingkungan _ untuk melihat apa yang memanggilnya, saya kira. Kecuali bahwa ini sangat tidak dapat diandalkan meskipun pengguna tidak melakukan apa pun untuk mengubahnya. Jika program diluncurkan dari GUI atau melalui skrip, _ bisa kosong atau bisa memiliki nilai yang sama sekali tidak terkait, dan itu sangat sah dan sangat umum. Dan tentu saja jika pengguna memang ingin mengubahnya, itu sangat sepele — jalankan saja env -u _ myprogram atau env myprogram .

Saat tindakan "anti-debugging", yang ini cukup konyol. Tidak hanya dapat dipalsukan dengan upaya nol, itu tidak akan benar-benar berfungsi dalam penggunaan normal. Jika beberapa bahan bacaan menggembar-gemborkannya sebagai tindakan anti-debugging, saya akan merekomendasikan bahan ini sebagai bahan yang sangat tidak dapat diandalkan.


Dalam konteks ini, _ variabel lingkungan biasanya berisi jalur ke debugger yang memulai program, bukan program itu sendiri. Program yang mencoba mendeteksi debugger kemudian dapat membaca variabel itu dan berperilaku berbeda jika melihat debugger (mungkin dengan mencari nama debugger yang dikenal seperti gdb atau dengan membandingkannya dengan argv[0] ).

Berikut adalah contoh yang menunjukkan aksi variabel ini dan perbedaannya dari argv[0] :

Kode C:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    char *path = getenv("_");
    printf("%s\n", argv[0]);
    printf("%s\n", path);
    return 0;
}

Keluaran cangkang:

$ gcc -o main main.c
$ ./main
./main
./main
$ gdb main
...
(gdb) r
Starting program: /home/user/tmp/main
/home/user/tmp/main
/usr/bin/gdb
[Inferior 1 (process 21694) exited normally]
(gdb)

CATATAN:Ini tidak unik untuk Linux, Anda dapat melakukannya di macOS dan mungkin juga sistem POSIX lainnya.

JUGA CATATAN:Ini adalah trik yang sangat murah yang sangat mudah untuk dilewati dan memiliki kemungkinan besar untuk tidak berfungsi sebagaimana mestinya (baik positif palsu maupun negatif palsu).


Linux
  1. Apa Artinya “–” (tanda hubung ganda)?

  2. Apa yang Dilakukan "lc_all=c"?

  3. Apa Env X=() { :;}; Command' Bash Do Dan Mengapa Tidak Aman?

  1. Apa?

  2. Apa itu Exec 3?

  3. Apa yang Dilakukan Program Saat Mengirim Sinyal Sigkill?

  1. Apa Kepanjangan Dll?

  2. Apa yang poll() lakukan dengan batas waktu 0?

  3. Apa yang dikembalikan malloc(0)?