it-swarm.com.de

Was macht ENV ("_") für das Anti-Debugging?

Ich lese einige PPT und es heißt, dass ENV("_") für das Anti-Debugging unter Linux verwendet werden kann

(enter image description here

Weiß jemand was es bedeutet?

35
daisy

In diesem Zusammenhang enthält die Umgebungsvariable _ In der Regel den Pfad zum Debugger, der das Programm gestartet hat, und nicht das Programm selbst. Das Programm, das versucht, den Debugger zu erkennen, kann diese Variable dann lesen und sich anders verhalten, wenn es den Debugger sieht (möglicherweise indem es nach bekannten Debuggernamen wie gdb sucht oder sie mit argv[0] Vergleicht).

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. Sie können dies auch unter macOS und wahrscheinlich auch auf anderen POSIX-Systemen tun.

AUCH HINWEIS: Dies ist ein wirklich billiger Trick, der sehr einfach zu umgehen ist und mit hoher Wahrscheinlichkeit nicht wie beabsichtigt funktioniert (sowohl falsch positive als auch falsch negative).

35

Bash setzt die Umgebungsvariable _ Auf den Pfad zu dem Befehl, der ausgeführt wird. So auch zsh und pdksh. Andere Shells wie fish and dash (die Standard-Scripting-Shell für viele Linux-Distributionen) tun dies jedoch nicht. ATT ksh setzt einen Wert, der den Pfad zum Befehl enthält.

Die Idee ist, dass ein Programm den Wert der Umgebungsvariablen _ Überprüfen kann, um zu sehen, was sie aufgerufen hat, denke ich. Dies ist jedoch äußerst unzuverlässig, selbst wenn der Benutzer nichts unternimmt, um dies zu ändern. Wenn das Programm über eine GUI oder über ein Skript gestartet wird, kann _ Leer sein oder einen völlig unabhängigen Wert haben, und das ist absolut 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 Oder env myprogram Aus.

In Bezug auf "Anti-Debugging" -Maßnahmen ist diese ziemlich lächerlich. Es ist nicht nur ohne Aufwand fälschbar, es würde auch bei normalem Gebrauch nicht funktionieren. Wenn irgendein Lesematerial es als Anti-Debugging-Maßnahme ankündigt, würde ich dieses Material als sehr unzuverlässig empfehlen.