Назад | Перейти на главную страницу

Как найти любой исполняемый файл или библиотеку

Допустим, кто-то предоставляет вам архив, говоря, что это исходный код и ничего больше. Вы хотите убедиться, что это правда, и что никакие загруженные вирусом исполняемые файлы или библиотеки не спрятаны в каталог. Как использовать для этого команду find?

Спасибо.

Вы можете распаковать файл в надежное место (как файловая система смонтирована noexec) и проверьте полученные каталоги на наличие двоичных файлов. В file команда может сказать вам, является ли файл текстовым, исходным, двоичным и т. д.

[root@xt ~]# file ./packages/Digest-MD5-2.33/t/badfile.t 
./packages/Digest-MD5-2.33/t/badfile.t: ASCII text

[root@xt ~]# file ./packages/Digest-MD5-2.33/MD5.pm 
./packages/Digest-MD5-2.33/MD5.pm: Perl5 module source text

[root@xt ~]# file ./packages/rrdtool-1.0.50/src/gdpng.o 
./packages/rrdtool-1.0.50/src/gdpng.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped

Что-то вроде следующего, где вы фильтруете исполняемые файлы ELF, будет работать:

find . -type f -exec file {} + | grep ELF

И результат будет:

[root@xt ~]# find . -type f -exec file {} + | grep ELF
./packages/rrdtool-1.0.50/gd1.3/gdfontl.o:       ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
./packages/rrdtool-1.0.50/gd1.3/gdfontmb.o:      ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
./packages/rrdtool-1.0.50/gd1.3/gdlucidan10l2.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
./packages/rrdtool-1.0.50/gd1.3/gdlucidab14.o:   ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
./packages/rrdtool-1.0.50/gd1.3/gdlucidan10.o:   ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped

Файл, помеченный как исполняемый, не обязательно должен быть исполняемым или загружаемым файлом или объектом.

Вот что я использую:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print