Che cosa fa ENV ("_") per anti-debug?

35

Sto leggendo alcuni PPT e dice che ENV("_") può essere usato per anti-debugging in Linux

Qualcuno sa cosa significa?

    
posta daisy 20.06.2018 - 02:20
fonte

2 risposte

36

In questo contesto, 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 diversamente se vede il debugger (forse cercando nomi di debugger noti come gdb o confrontandolo con argv[0] ).

Ecco un esempio che mostra questa variabile in azione e in che modo si differenzia 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.

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

    
risposta data 20.06.2018 - 02:34
fonte
41

Bash imposta la variabile di ambiente _ sul percorso del comando che si sta eseguendo. 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 di 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 lanciato da una GUI o tramite uno script, _ potrebbe essere vuoto o potrebbe 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 .

Poiché le misure "anti-debug" vanno, questo è piuttosto ridicolo. Non solo è paragonabile a zero sforzi, ma non funzionerebbe in condizioni normali. Se alcuni materiali di lettura lo ritengono una misura anti-debug, raccomanderei contro questo materiale come molto inaffidabile.

    
risposta data 20.06.2018 - 08:22
fonte

Leggi altre domande sui tag