GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was bewirkt ENV („_“) für das Anti-Debugging?

Bash setzt die Umgebungsvariable _ auf den Pfad zu dem Befehl, der gerade ausgeführt wird. Also zsh und pdksh. Aber andere Shells wie fish und dash (die Standard-Scripting-Shell auf vielen Linux-Distributionen) tun dies nicht. ATT ksh setzt es auf einen Wert, der den Pfad zum Befehl enthält.

Die Idee ist, dass ein Programm den Wert der Umgebungsvariable _ prüfen kann um zu sehen, was es aufgerufen hat, denke ich. Abgesehen davon, dass dies äußerst unzuverlässig ist, selbst wenn der Benutzer nichts unternimmt, um es zu ändern. Wenn das Programm von einer GUI oder über ein Skript gestartet wird, _ kann leer sein oder einen völlig unabhängigen Wert haben, und das ist vollkommen legitim und sehr verbreitet. Und wenn der Benutzer es ändern möchte, ist es natürlich absolut trivial – führen Sie einfach env -u _ myprogram aus oder env myprogram .

Was „Anti-Debugging“-Maßnahmen angeht, ist diese ziemlich lächerlich. Es ist nicht nur ohne großen Aufwand fälschbar, es würde im normalen Gebrauch auch nicht funktionieren. Wenn es in einigen Lesematerialien als Anti-Debugging-Maßnahme angepriesen wird, würde ich von diesem Material als sehr unzuverlässig abraten.


In diesem Zusammenhang die _ Die Umgebungsvariable enthält normalerweise den Pfad zum Debugger, der das Programm gestartet hat, und nicht das Programm selbst. Das Programm, das versucht, den Debugger zu erkennen, kann dann diese Variable lesen und sich anders verhalten, wenn es den Debugger sieht (vielleicht indem es nach bekannten Debugger-Namen wie gdb sucht oder durch Vergleich mit argv[0] ).

Hier ist ein Beispiel, das diese Variable in Aktion zeigt und wie sie sich von argv[0] unterscheidet :

C-Code:

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

Shell-Ausgabe:

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

HINWEIS:Dies gilt nicht nur für Linux, sondern auch für macOS und wahrscheinlich auch für andere POSIX-Systeme.

BEACHTEN SIE AUCH:Das ist ein wirklich billiger Trick, der wirklich einfach zu umgehen ist und eine hohe Wahrscheinlichkeit hat, dass er nicht wie beabsichtigt funktioniert (sowohl falsch positive als auch falsch negative).


Linux
  1. Was macht „lc_all=c“?

  2. Was bedeutet Env X=() { :;}; Command’ Bash Do und warum ist es unsicher?

  3. Was macht ?

  4. Wofür steht „rc“ in .bashrc?

  5. Was bedeutet Exec 3?

Was macht . ~/.bashrc Befehl Tun??

Wofür steht „tty“?

SystemD - Wofür wird SystemD verwendet?

Was gibt malloc(0) zurück?

Was macht 'bash -c'?

Was macht kill -- -0?