尝试进行中毒“ls”二进制文件以隐藏文件和文件夹的概念证明

尝试进行中毒“ls”二进制文件以隐藏文件和文件夹的概念证明

我目前正在尝试修改“ls.c”源文件以隐藏包含该词的文件和文件夹。经过一些研究后,我发现通过将此代码添加到“ls.c”源文件中可以实现这一点:

            char attr_command[1024] = "attr -Lqg hidden "; // Oh, dear. That's bad
            int attr_code;
            strcat(attr_command, d->d_name);
            strcat(attr_command, " >/dev/null 2>&1");
            attr_code = system(attr_command);
            if (!attr_code)
                    continue;

必须在以下行之后添加此代码:

while ((d = readdir(dp))) {

我们可以通过 'git clone git://git.suckless.org/sbase' 获取 coreutils 源文件(包括 ls.c)

因此,在使用修改后的“ls.c”源文件运行“make”后,“隐藏”文件仍然显示。

我需要修改“ls.c”以真正隐藏文件和文件夹。

答案1

命令attr处理扩展属性,特别是与 XFS 文件系统相关的。 (它也适用于 ext4,但我认为getfattrsetfattr适用于一般的、独立于文件系统的用途。)

也就是说,attr -Lqg hidden "$filename"不检查有关文件的任何内容姓名hidden,但它会检查文件上是否设置了调用的扩展属性。

如果您想检查文件名是否包含特定字符串,您可能应该使用功能strstr()

由于d->d_name包含正在处理的文件的名称,因此类似的操作可能会起作用。

if (strstr(d->d_name, "hidden") == 0) { ... 

这并不意味着您不能基于扩展属性隐藏文件......但即使您这样做,最好查找用于此目的的实际系统调用。system()分叉出一个 shell 和外部进程,并且目录列表很长,这可能会明显很慢。

另请注意,修改ls对其他也可以提供文件列表的程序没有任何作用。它们可能像find, 或 一样简单printf "%s\n" *

答案2

好吧,我找到了一种解决方法,通过在第 261 行之后的“ls.c”中添加以下行来“隐藏”“ls”的字符串(感谢 ilkkachu 在下面的回答):

                if (strstr(d->d_name, "HIDDEN") == 0)
                    return 0;

可能不是最好的解决方案,但嘿它有效:)

如果有人想提出更好的选择/解决方案,请这样做,如果可能的话,我希望有更多的选择和更好的选择!

谢谢

相关内容