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

50

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 readelfe não consegui encontrar muita coisa, mas pode haver outras maneiras de analisar o código binário / seção etc ...

Alguma coisa que você sabe extrair?

elmarco
fonte

Respostas:

48

Não existe uma maneira universal, mas você pode fazer um palpite, procurando coisas feitas apenas por um compilador.

O GCC é o mais fácil; ele grava uma .commentseção 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 existe uma maneira de exibi-lo readelf, mas com objdumpele:

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 provavelmente estariam em uma seção de comentários, mas nunca vi isso feito. Há um ponto no cabeçalho COFF para um registro de data e hora, mas não há equivalente no ELF, então não acho que o tempo de compilação esteja disponível também

Michael Mrozek
fonte
28

E se:

readelf -p .comment a.out
Colin King
fonte
3
Como isso é diferente do Michael objdump? Dá mais informações? Disponível em plataformas diferentes? Formato de saída mais limpo?
Caleb
9
Formato de saída mais limpo.
21313
19

Você pode tentar usar o stringscomando Isso criará muita saída de texto; marcando 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 ele é compilado, gccmas você sempre pode redirecionar a stringssaída para um arquivo e examiná-lo.

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

Hemant
fonte
11
+1, permite que você veja os sinalizadores de compilação (se gcc)
Ivan Black
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 da seção no binário. Anote o número de série do .comment cabeçalho da seção. No meu sistema, ele mostrou 27 (pode ser diferente para o seu caso)

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

Ranjini
fonte
4

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 o conteúdo completo, "j" para indicar o nome da seção. Esse 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 quiser.

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

liuyang1
fonte
readelf -ntrabalhou para mim - exemplo de saída:Displaying notes found in: .note.gnu.build-id Owner Data size Description GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) Build ID: b88bae04e9043b71b329bac0ce2a2e5314183272
Den-Jason
4

Você também pode usar esse script inteligente que conta os números de várias instruções da CPU usadas pelo binário. É baseado na análise da saída objdump. Lembre-se de que pode levar muito tempo para terminar se você o usar em um grande binário.

rozcietrzewiacz
fonte
Vale a pena notar que é apenas x86.
Victor Sergienko
0

Pode valer a pena um tiro de sorte, 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 conjunto nulo). Aqui está um exemplo particularmente proveitoso, o 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
Joshua Huber
fonte
0

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

Lembre-se de que a seção ".comment", se existir, parece começar com um caractere nulo; portanto, escolha um aplicativo visualizador para uso no 7-zip que não fique confuso com isso (por exemplo, tente interpretar o dados como Unicode). Outras seções que podem existir e ser interessantes são ".nota. *".

Joe
fonte