파일과 폴더를 숨기기 위해 "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에서도 작동하지만 일반적인, 파일 시스템 독립적인 사용에 적합하다고 생각합니다 getfattr. setfattr)

즉, attr -Lqg hidden "$filename"파일에 대해 아무것도 확인하지 마십시오.이름hidden이지만 호출된 확장 속성이 파일에 설정되어 있는지 확인합니다.

파일 이름에 특정 문자열이 포함되어 있는지 확인하려면 다음을 사용해야 합니다.strstr()기능.

d->d_name처리 중인 파일의 이름이 포함되어 있으므로 비슷한 것이 작동할 수 있습니다.

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

그렇다고 확장된 속성을 기반으로 파일을 숨길 수 없다는 의미는 아닙니다. 하지만 숨기더라도 이 목적에 사용되는 실제 시스템 호출을 찾는 것이 좋습니다. system()쉘과 외부 프로세스를 분기하고 긴 디렉토리 목록을 사용하면 눈에 띄게 느려질 수 있습니다.

또한 수정은 ls파일 목록을 제공할 수 있는 다른 프로그램에는 영향을 주지 않습니다. find, 또는 와 같이 간단 할 수도 있습니다 printf "%s\n" *.

답변2

글쎄요, "ls.c"의 261번째 줄 뒤에 다음 줄을 추가하여 "ls" 문자열을 "숨기는" 해결 방법을 찾았습니다(아래 답변을 주신 ilkkachu에게 감사드립니다).

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

아마도 최선의 해결책은 아니지만 작동합니다 :)

더 나은 옵션/솔루션을 제안하고 싶은 분이 계시다면 그렇게 해주세요. 가능하다면 더 많은 옵션과 더 나은 옵션을 갖고 싶습니다!

감사해요

관련 정보