GNU/Linux >> Linux の 問題 >  >> Linux

ENV (“_”) はアンチデバッグのために何をしますか?

Bash は環境変数 _ を設定します 実行中のコマンドへのパス。 zsh と pdksh も同様です。ただし、fish や dash (多くの Linux ディストリビューションでデフォルトのスクリプト シェル) などの他のシェルでは、これが行われません。 ATT ksh は、コマンドへのパスを含む値に設定します。

アイデアは、プログラムが環境変数 _ の値をチェックできるということです 何がそれを引き起こしたのかを見るために、私は推測します。ただし、ユーザーが何も変更していない場合でも、これは非常に信頼できません。プログラムが GUI またはスクリプト経由で起動された場合、_ 空であるか、まったく関係のない値を持つ可能性があります。これは完全に正当であり、非常に一般的です。そしてもちろん、ユーザーがそれを変更したい場合、それはまったく簡単です — env -u _ myprogram を実行するだけです または env myprogram .

「アンチデバッグ」対策が進んでいるので、これはかなりばかげています。努力なしでなりすましが可能であるだけでなく、通常の使用では実際には機能しません。一部の読み物がデバッグ対策としてそれを宣伝している場合、私はこの資料を非常に信頼できないものとして推奨しません.


このコンテキストでは、_ 通常、環境変数には、プログラム自体ではなく、プログラムを開始したデバッガーへのパスが含まれます。デバッガーを検出しようとするプログラムは、その変数を読み取り、デバッガーが検出された場合 (おそらく gdb のような既知のデバッガー名を探すことによって) 異なる動作をすることができます。 または argv[0] と比較して ).

この変数の動作と、argv[0] との違いを示す例を次に示します。 :

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

シェル出力:

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

注:これは Linux に固有のものではなく、macOS やおそらく他の POSIX システムでも実行できます。

また注意:これは非常に安価なトリックであり、回避するのは非常に簡単であり、意図したとおりに機能しない可能性が高くなります (偽陽性と偽陰性の両方)。


Linux
  1. 「lc_all=c」は何をしますか?

  2. エコー$は何ですか?行う??

  3. Sigkillシグナルが送信された場合、プログラムは何をしますか?

  1. Etcは何の略ですか?

  2. Libgl_always_indirect =1は実際に何をしますか?

  3. malloc(0) は何を返しますか?

  1. 「cd -」は何の略ですか?

  2. 「bash -c」は何をしますか?

  3. kill -- -0 は何をしますか?