Sto leggendo alcuni PPT e dice che ENV("_")
può essere usato per anti-debugging in Linux
Qualcuno sa cosa significa?
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).
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.
Leggi altre domande sui tag linux