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

<p>есть ли шанс узнать, как был построен бинарный файл под linux? (и/или другой unix)</p><p>компилятор, версия, время, флаги и т.д ...</p><p>я посмотрел на <code>readelf</code> и не смог найти много, но могут быть другие способы анализа двоичного кода/раздела и т.д.</p><p>что-нибудь, что вы знаете, как извлечь?</p>

<p>универсального способа не существует, но вы можете сделать обоснованное предположение, ища вещи, которые выполняет только один компилятор.</p><p>gcc самый простой; он пишет <code>.comment</code> раздел, содержащий строку версии gcc (ту же строку, которую вы получите, если вы запустите <code>gcc --version</code>). я не знаю, есть ли способ отобразить это с помощью <code>readelf</code>, но с <code>objdump</code> это:</p><pre><code>objdump -s --section .comment /path/binary </code></pre><hr><p>я только что понял, что проигнорировал остальную часть вашего вопроса. флаги вообще нигде не сохраняются; скорее всего, они будут в разделе комментариев, но я никогда не видел, чтобы это было сделано. в заголовке coff есть место для метки времени, но в elf нет эквивалента, поэтому я не думаю, что время компиляции также доступно</p>

<p>как насчет:</p><pre><code>readelf -p .comment a.out </code></pre>

<p>вы можете попробовать использовать команду <code>strings</code>. это создаст много текстового вывода; проверив его, вы можете угадать компилятор.</p><p><code>pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc gcc: (ubuntu 4.4.3-4ubuntu5) 4.4.3здесь я знаю, что он скомпилирован с помощью gcc, но вы всегда можете перенаправить вывод strings в файл и просмотреть его.есть одна очень хорошая утилита, называемая <a href="http://www.peid.info/">peid для windows, но я не могу найти для нее альтернативы в linux.

readelf или objdump оба могут сделать это.elf-файл, скомпилированный gcc, добавит .note.abi-tag и .note.gnu.build-id в два раздела. оба могут отображатьсяobjdump -sj .note.abi-tag elffile objdump -sj .note.gnu-build-id elffile опция "s" означает отображение полного содержимого, "j" для указания названия раздела. этот стиль получает шестнадцатеричное содержимое этих разделов.readelf -n покажет удобочитаемый контент elffile один раз. опция "n" означает замечания.выберите тот, который вам нравится.кстати, используйте objcopy, вы можете добавить свой собственный раздел в файл elf.

есть два метода. оба дадут одинаковый результатobjdump -s --section .comment path/to/binary используя команду readelf, readelf -s binary отобразит 40 заголовков разделов в двоичном виде. обратите внимание на серийный номер .comment заголовок раздела. в моей системе это показывалось как 27 (может отличаться для вашего случая)readelf -x 30 path/to/binary -> который будет отображать шестнадцатеричный дамп раздела .comment. в этом дампе вы можете увидеть компилятор, используемый для сборки двоичного файла.

вы также можете использовать <a href="https://pastebin.com/eu23iavl">этот умный скрипт , который подсчитывает количество различных инструкций процессора, используемых двоичным файлом. он основан на разборе вывода objdump. помните, что это может занять довольно много времени, если вы используете его в большом двоичном файле.

если вы откроете бинарный файл elf в 7-zip, в нем будут перечислены различные разделы. оттуда вы можете использовать опцию view context-menu, например, в разделе ".comment", чтобы увидеть комментарии компилятора (например, "gcc: (gnu) 4.9 20150123 (prerelease) android"). = clang версия 3.8.256229 (на основе llvm 3.8.256229) ").помните, что раздел ".comment", если он существует, кажется, начинается с нулевого символа, поэтому обязательно выберите приложение для просмотра для использования в 7-zip, которое не смущается этим (например, пытается интерпретировать данные как unicode). другие разделы, которые могут существовать и представлять интерес: ".note. ".

может стоить удачного выстрела, в зависимости от того, какая программа. в некоторых программах это будет скомпилировано как информация и доступно с помощью какого-либо вызова версии (-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 </code></pre>