ENV(“_”)对反调试有什么作用?

信息安全 linux
2021-09-07 21:09:33

我正在阅读一些 PPT,上面说ENV("_")可以用于 Linux 中的反调试

在此处输入图像描述

有谁知道这意味着什么?

2个回答

Bash 将环境变量设置_为正在执行的命令的路径。zsh 和 pdksh 也是如此。但是其他 shell,例如 fish 和 dash(这是许多 Linux 发行版上的默认脚本 shell)不这样做。ATT ksh 将其设置为包含命令路径的值。

这个想法是一个程序可以检查环境变量的值,_看看是什么调用了它,我猜。除了这非常不可靠,即使用户没有做任何改变它。如果程序是从 GUI 或通过脚本启动的,则_可能是空的或可能具有一些完全不相关的值,这是完全合法且非常常见的。当然,如果用户确实想要更改它,那绝对是微不足道的——只需运行env -u _ myprogramenv 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 系统上执行此操作。

另请注意:这是一个非常便宜的技巧,非常容易绕过并且很有可能无法按预期工作(误报和误报)。