Чи можемо ми отримати інформацію про компілятор із двійкового ельфу?


50

Чи є якийсь шанс дізнатися, як було створено бінарний під Linux? (та або інший Unix)

Компілятор, версія, час, прапори тощо ...

Я переглянув readelfі не зміг знайти багато, але можуть бути й інші способи аналізу бінарного коду / розділу тощо ...

Що ви знаєте, як видобути?

Відповіді:


48

Не існує універсального способу, але ви можете зробити здогадку про здогадку, шукаючи речі, зроблені лише одним компілятором.

GCC - найпростіший; він пише .commentрозділ, що містить рядок версії GCC (той самий рядок, який ви отримуєте, якщо ви запускаєте gcc --version). Я не знаю, чи є спосіб відобразити це readelf, але з objdumpйого допомогою:

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

Я щойно зрозумів, що проігнорував решту вашого питання. Прапори взагалі ніде не зберігаються; вони, швидше за все, опиняться в розділі коментарів, але я ніколи цього не бачив. У заголовку COFF є місце для часової позначки, але в ELF немає еквівалента, тому я не думаю, що час компіляції також доступний


28

Як щодо:

readelf -p .comment a.out

3
Чим це відрізняється від Майкла objdump? Це дає більше інформації? Доступні на різних платформах? Чистіший формат виводу?
Калеб

9
Чистіший формат виводу.
marcin

19

Можна спробувати скористатися stringsкомандою. Це створить багато виводу тексту; перевіривши це, ви можете здогадатися про компілятор.

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

Тут я знаю, що він компілюється, gccале ви завжди можете перенаправляти stringsвихід у файл і перевіряти його.

Існує одна дуже хороша утиліта, яка називається peidдля Windows, але я не можу знайти альтернативу для неї в Linux.


1
+1, дозволяє бачити прапори компіляції (якщо gcc)
Іван Чорний,

4

Існує два методи. Обидва дадуть однаковий результат

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

Використовуючи команду readelf, readelf -S binary відобразиться 40 заголовків розділів у двійковій формі. Зверніть увагу на порядковий номер .comment заголовка розділу. У моїй системі він показав як 27 (може бути різним у вашому випадку)

readelf -x 30 path/to/binary ->, що відобразить шестнадцятковий дамп розділу ".comment". На цьому дампі ви можете побачити компілятор, який використовується для побудови бінарного файлу.


4

readelf або objdump обидва можуть це зробити.

Файл ELF, складений gcc, додасть .note.ABI-тег та .note.gnu.build-id два розділи. обидва могли відображатись

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

опція "s" означає відображення повного вмісту, "j" для вказівки назви розділу. Цей стиль отримує шістнадцятковий вміст цього розділу.

readelf -n

один раз покаже вміст ELFFILE, прочитаний людиною. опція "n" означає ПРИМІТКИ.

Виберіть собі подібний.

До речі, використовуйте objcopy, ви можете додати свій власний розділ у файл ельфів.


readelf -nпрацював для мене - приклад виведення: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

Ви також можете використовувати цей розумний сценарій, який підраховує кількість різних інструкцій процесора, використовуваних двійковим файлом. Він заснований на синтаксичному аналізі обхідного виводу. Слідкуйте за тим, що закінчення може зайняти досить багато часу, якщо ви використовуєте його на великому бінарному файлі.


Варто зазначити, що це лише x86.
Віктор Сергієнко

0

Можливо, варто пощастило зняти, залежно від програми. У деяких програмах це буде складено як інформація та доступне у вигляді виклику версії (-V, --version, -Version тощо). Ви можете знайти будь-яку підмножину тих елементів, які шукаєте (включаючи нульовий набір). Ось особливо плідний приклад, 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

0

Якщо ви відкриєте двійковий код ELF у 7-zip, він перелічить різні розділи всередині. Звідти ви можете скористатися параметром контекстного меню Переглянути, скажімо, розділом ".comment", щоб побачити коментарі компілятора (наприклад, "GCC: (GNU) 4.9 20150123 (попередня версія) Android clang версія 3.8.256229 (на основі LLVM 3.8.256229) ").

Не забудьте, що розділ ".comment", якщо він існує, здається, починається з нульового символу, тому не забудьте вибрати програму для перегляду для використання в межах 7-zip, яка цим не заплутається (наприклад, намагається інтерпретувати дані як Unicode). Інші розділи, які можуть існувати та представляти інтерес, - це ".note. *".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.