Procurando pelo arquivo ELF de 32 bits

2

Gostaria de saber se existe alguma possibilidade de encontrar arquivos que são objetos ELF de 32 bits usando um único comando no sistema de arquivos? Na verdade, estou trabalhando no fedora 23 de 64 bits e não consigo localizar nenhum desses arquivos, mas o exercício que estou tentando fazer com precisão diz que deve ser um arquivo ELF de 32 bits. Obrigado por qualquer ajuda.

    
por sh1nen 25.03.2016 / 18:29

6 respostas

3

Tudo o que você precisa fazer é verificar se os primeiros 5 bytes no arquivo são 7f 45 4c 46 01 (é o que faz o file ). Então você só precisa ler 5 bytes de cada arquivo:

PERLIO=:raw find . -type f -size +51c -exec perl -lne '
  BEGIN{$/=};print $ARGV if $_ eq "\x7f\x45\x4c\x46\x01"; close ARGV' {} +

Aqui, verificar apenas os arquivos regulares com no mínimo 52 bytes, pois tem o tamanho de o cabeçalho ELF para um Arquivo ELF de 32 bits, embora os arquivos ELF sejam geralmente muito maiores que isso.

    
por 25.03.2016 / 20:10
1

Tente isto:

find . -type f -exec file '{}' \; | grep -i 'elf 32'
    
por 25.03.2016 / 18:48
0

Você pode usar o comando file e procurar a palavra-chave executable na saída deste comando. Se encontrado, pegue os dois primeiros campos com awk , ou seja, $1 e $2 . aí está sua resposta. Você pode criar uma lógica para fazer o que quiser com os arquivos ELF de 32 bits. Também você pode olhar através dos arquivos nos diretórios do seu desejo, em um loop.

    
por 25.03.2016 / 18:44
0

Você pode usar find para obter os arquivos e, em seguida, file para obter as informações do arquivo e grep para pesquisar a string 32-bit na saída de file :

find /bin /usr/bin -type f -exec sh -c '{ file -L "$1" | grep -q 32-bit ;} \
      && echo "$1"' _ {} \;

Alterar / adicionar local (is) para pesquisar para atender às suas necessidades.

Exemplo:

% find /usr/bin -type f -exec sh -c '{ file -L "$1" | grep -q 32-bit ;} && echo "$1"' _ {} \; 
/usr/bin/unix2dos
/usr/bin/dos2unix
    
por 25.03.2016 / 19:52
0

Existem pelo menos 3 maneiras de fazer isso. Em vez de imprimir todos os nomes de arquivos Eu adicionei | wc -l no final de cada comando sugerido para provar que eles retornam o mesmo:

  1. use find em conjunto com -exec :

    $ time find . -type f  -exec file {} \;  | grep -i "ELF 32" | wc -l
    2872
    
    real    0m7.422s
    user    0m5.095s
    sys     0m0.384s
    
  2. use find em conjunto com xargs - note que embora seja muito mais rápido, é menos seguro, pois xargs executará um determinado comando, mesmo se find não retorna resultados e -r opção usada aqui é uma extensão GNU e não está especificado POSIX :

    $ time find . -type f  | xargs -r file | grep "ELF 32" | wc -l
    2872
    
    real    0m1.754s
    user    0m1.712s
    sys     0m0.052s
    
  3. use grep para verificar manualmente o cabeçalho de cada arquivo. -r aqui é para ignorar links simbólicos:

    $ grep -l -a -m1 $'^\x7F\x45\x4c\x46\x01' -r . | wc -l
    2872
    
por 25.03.2016 / 21:27
0

Você quer dizer algo como o comando file usado assim?

$ which ls
/bin/ls
$ file /bin/ls
/bin/ls: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=cecbb9e27978d91bc6fe2cc4d46d0cd58deafdb2, stripped
$ 

Você pode fazer um comando find canalizado para file da seguinte forma:

$ find /bin -type f -exec file '{}' \; | grep -c "ELF 32-bit LSB  executable" 
88
$ find /bin -type f -exec file '{}' \; 2>&1  | grep  "ELF 32-bit LSB  executable" | head -2
/bin/bzip2: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=8ec5364bf1b5aae5a29b02aaa89db511e988f26a, stripped
/bin/more: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=2cf8c3651ba3e5dd6a053d40a969b4b7bca9cac0, stripped
$
    
por 25.03.2016 / 18:44