Podemos obter informações do compilador de um binário elf?

39

Existe alguma chance de saber como um binário foi construído no Linux? (e ou outro Unix)

Compilador, versão, hora, sinalizadores etc ...

Eu olhei para readelf e não consegui encontrar muito, mas pode haver outras maneiras de analisar o código binário / seção etc ...

Tudo o que você sabe extrair?

    
por elmarco 18.08.2010 / 19:58

8 respostas

38

Não há um caminho universal, mas você pode adivinhar procurando coisas que só são feitas por um compilador.

O GCC é o mais fácil; ele grava uma seção .comment que contém a string de versão do GCC (a mesma string que você obtém se executar gcc --version ). Não sei se há uma maneira de exibi-lo com readelf , mas com objdump é:

objdump -s --section .comment /path/binary

Acabei de perceber que ignorei o resto da sua pergunta. As bandeiras geralmente não são salvas em nenhum lugar; eles estariam em uma seção de comentários muito provavelmente, mas eu nunca vi isso feito. Há um ponto no cabeçalho do COFF para um timestamp, mas não há equivalente no ELF, então não acho que o tempo de compilação esteja disponível

    
por 18.08.2010 / 20:34
24

Que tal:

readelf -p .comment a.out
    
por 19.08.2011 / 09:48
15

Você pode tentar usar o comando strings . Isso criará muita saída de texto; verificando isso, você pode adivinhar o compilador.

pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Aqui eu sei que é compilado com gcc , mas você sempre pode redirecionar strings output para um arquivo e examiná-lo.

Existe um utilitário muito bom chamado peid para Windows, mas não consigo encontrar nenhuma alternativa para ele no Linux.

    
por 18.08.2010 / 20:59
4

Existem dois métodos. Ambos darão o mesmo resultado

objdump -s --section .comment path/to/binary

Usando o comando readelf, readelf -S binary exibirá os 40 cabeçalhos de seção no binário. Anote o número de série do cabeçalho da seção .comment . No meu sistema, mostrou como 27 (pode ser diferente para o seu caso)

readelf -x 30 path/to/binary - > que exibirá o dump hex da seção '.comment'. Nesse despejo, você pode ver o compilador usado para construir o binário.

    
por 09.10.2012 / 15:44
4

Você também pode usar este script inteligente que conta os números de várias instruções de CPU usadas pelo binário. Ele é baseado na análise da saída do objdump. Esteja ciente de que pode demorar um bom tempo para terminar se você usá-lo em um grande binário.

    
por 20.08.2011 / 02:57
3

readelf ou objdump ambos podem fazer isso.

O arquivo ELF compilado pelo gcc adicionará .note.ABI-tag e .note.gnu.build-id duas seções. ambos podem ser exibidos por

objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu-build-id ELFFILE

opção "s" significa exibir conteúdo completo, "j" para indicar o nome da seção. Este estilo obtém o conteúdo hexadecimal dessas seções.

readelf -n

mostrará o conteúdo legível por humanos do ELFFILE uma vez. opção "n" significa NOTAS.

Escolha um como seu gosto.

A propósito, use objcopy, você pode adicionar sua própria seção no arquivo elf.

    
por 02.06.2015 / 08:57
0

Pode valer uma chance, dependendo de qual programa. Alguns programas terão isso compilado como informação e acessível por algum tipo de chamada de versão (-V, --version, -Version, etc). Você pode encontrar qualquer subconjunto desses itens que você está procurando (incluindo o conjunto nulo). Aqui está um exemplo particularmente frutífero, Perl 5:

$ perl -V

Summary of my perl5 (revision 5 version 26 subversion 2) configuration:

  Platform:
    osname=linux
    osvers=4.15.15-1-arch
    archname=x86_64-linux-thread-multi
    uname='linux flo-64 4.15.15-1-arch #1 smp preempt sat mar 31 23:59:25 utc 2018 x86_64 gnulinux '
    config_args='-des -Dusethreads -Duseshrplib -Doptimize=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -Dprefix=/usr -Dvendorprefix=/usr -Dprivlib=/usr/share/perl5/core_perl -Darchlib=/usr/lib/perl5/5.26/core_perl -Dsitelib=/usr/share/perl5/site_perl -Dsitearch=/usr/lib/perl5/5.26/site_perl -Dvendorlib=/usr/share/perl5/vendor_perl -Dvendorarch=/usr/lib/perl5/5.26/vendor_perl -Dscriptdir=/usr/bin/core_perl -Dsitescript=/usr/bin/site_perl -Dvendorscript=/usr/bin/vendor_perl -Dinc_version_list=none -Dman1ext=1perl -Dman3ext=3perl -Dcccdlflags='-fPIC' -Dlddlflags=-shared -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -Dldflags=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now'
    hint=recommended
    useposix=true
    d_sigaction=define
    useithreads=define
    usemultiplicity=define
    use64bitint=define
    use64bitall=define
    uselongdouble=undef
    usemymalloc=n
    default_inc_excludes_dot=define
    bincompat5005=undef
  Compiler:
    cc='cc'
    ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
    optimize='-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt'
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
    ccversion=''
    gccversion='7.3.1 20180312'
    gccosandvers=''
    intsize=4
    longsize=8
    ptrsize=8
    doublesize=8
    byteorder=12345678
    doublekind=3
    d_longlong=define
    longlongsize=8
    d_longdbl=define
    longdblsize=16
    longdblkind=3
    ivtype='long'
    ivsize=8
    nvtype='double'
    nvsize=8
    Off_t='off_t'
    lseeksize=8
    alignbytes=8
    prototype=define
  Linker and Libraries:
    ld='cc'
    ldflags ='-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fstack-protector-strong -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.1/include-fixed /usr/lib /lib/../lib /usr/lib/../lib /lib /lib64 /usr/lib64
    libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
    libc=libc-2.26.so
    so=so
    useshrplib=true
    libperl=libperl.so
    gnulibc_version='2.26'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs
    dlext=so
    d_dlsymun=undef
    ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib/perl5/5.26/core_perl/CORE'
    cccdlflags='-fPIC'
    lddlflags='-shared -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -L/usr/local/lib -fstack-protector-strong'


Characteristics of this binary (from libperl): 
  Compile-time options:
    HAS_TIMES
    MULTIPLICITY
    PERLIO_LAYERS
    PERL_COPY_ON_WRITE
    PERL_DONT_CREATE_GVSV
    PERL_IMPLICIT_CONTEXT
    PERL_MALLOC_WRAP
    PERL_OP_PARENT
    PERL_PRESERVE_IVUV
    USE_64_BIT_ALL
    USE_64_BIT_INT
    USE_ITHREADS
    USE_LARGE_FILES
    USE_LOCALE
    USE_LOCALE_COLLATE
    USE_LOCALE_CTYPE
    USE_LOCALE_NUMERIC
    USE_LOCALE_TIME
    USE_PERLIO
    USE_PERL_ATOF
    USE_REENTRANT_API
  Built under linux
  Compiled at Apr 18 2018 22:21:20
  %ENV:
    PERL5LIB="/home/jhuber/perl5/lib/perl5"
    PERL_LOCAL_LIB_ROOT="/home/jhuber/perl5"
    PERL_MB_OPT="--install_base "/home/jhuber/perl5""
    PERL_MM_OPT="INSTALL_BASE=/home/jhuber/perl5"
  @INC:
    /home/jhuber/perl5/lib/perl5/x86_64-linux-thread-multi
    /home/jhuber/perl5/lib/perl5
    /usr/lib/perl5/5.26/site_perl
    /usr/share/perl5/site_perl
    /usr/lib/perl5/5.26/vendor_perl
    /usr/share/perl5/vendor_perl
    /usr/lib/perl5/5.26/core_perl
    /usr/share/perl5/core_perl
    
por 08.05.2018 / 19:15
0

Se você abrir um binário ELF em 7-zip, ele listará as várias seções dentro dele. A partir daí, você pode usar a opção de menu contextual Exibir na seção ".comment" para ver os comentários do compilador (por exemplo, "GCC: (GNU) 4.9 20150123 (pré-lançamento) versão do clang Android 3.8.256229 (baseado em LLVM 3.8.256229) ").

Tenha em atenção que a secção ".comment", se existir, parece começar com um carácter nulo, por isso certifique-se de escolher uma aplicação visualizadora para utilizar dentro de 7-zip que não se confunda com isto (eg. interpretar os dados como Unicode). Outras seções que podem existir e serem interessantes são ".note. *".

    
por 30.05.2018 / 05:41