GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa fa ENV ("_") per l'anti-debug?

Bash imposta la variabile d'ambiente _ al percorso del comando in esecuzione. Quindi fai zsh e pdksh. Ma altre shell, come fish e dash (che è la shell di scripting predefinita su molte distribuzioni Linux) non lo fanno. ATT ksh lo imposta su un valore che include il percorso del comando.

L'idea è che un programma possa controllare il valore della variabile d'ambiente _ per vedere cosa l'ha invocato, immagino. Tranne che questo è estremamente inaffidabile anche se l'utente non sta facendo nulla per cambiarlo. Se il programma viene avviato da una GUI o tramite uno script, _ potrebbe essere vuoto o avere un valore completamente non correlato, e questo è perfettamente legittimo e molto comune. E ovviamente se l'utente vuole cambiarlo, è assolutamente banale:basta eseguire env -u _ myprogram o env myprogram .

Per quanto riguarda le misure "anti-debug", questa è piuttosto ridicola. Non solo è falsificabile senza alcuno sforzo, ma in realtà non funzionerebbe nell'uso normale. Se qualche materiale di lettura lo pubblicizza come misura anti-debug, consiglierei di non utilizzare questo materiale in quanto molto inaffidabile.


In questo contesto, il _ la variabile di ambiente in genere conterrà il percorso del debugger che ha avviato il programma anziché il programma stesso. Il programma che tenta di rilevare il debugger può quindi leggere quella variabile e comportarsi in modo diverso se vede il debugger (magari cercando nomi di debugger noti come gdb o confrontandolo con argv[0] ).

Ecco un esempio che mostra questa variabile in azione e come differisce da argv[0] :

Codice 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;
}

Output della shell:

$ 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)

NOTA:questo non è univoco per Linux, puoi farlo su macOS e probabilmente anche su altri sistemi POSIX.

NOTA INOLTRE:è un trucco davvero economico che è davvero facile da aggirare e ha un'alta probabilità di non funzionare come previsto (sia falsi positivi che falsi negativi).


Linux
  1. Cosa significa "-" (doppio trattino)?

  2. Cosa fa "lc_all=c"?

  3. Che cosa significa Env X=() { :;}; Command' Bash Do e perché non è sicuro?

  4. Cosa fa ?

  5. Cosa fa Exec 3?

Che cosa significa "tty"?

SystemD - A cosa serve SystemD?

Cosa significa 'cd-'?

Cosa fa 'bash -c'?

Cosa fa kill -- -0?

Cosa significa echo $? fare?