it-swarm-tr.com

Derleyici bilgilerini bir elf ikili dosyasından alabilir miyiz?

Linux altında nasıl bir ikili yapı inşa edildiğini bilmek için bir şans var mı? (ve diğer Unix)

Derleyici, sürüm, zaman, bayraklar vb.

readelf'a baktım ve fazla bir şey bulamadım, ancak ikili kodu/bölümü vb. Analiz etmenin başka yolları olabilir ...

Nasıl çıkarılacağını bildiğin bir şey var mı?

53
elmarco

Evrensel bir yol yoktur, ancak yalnızca bir derleyici tarafından yapılan şeyleri arayarak eğitimli bir tahmin yapabilirsiniz.

GCC en kolay olanıdır; GCC sürüm dizesini içeren bir .comment bölümü yazar (gcc --version komutunu çalıştırdığınızda aldığınız dizenin aynısı). readelf ile görüntülemek için bir yol olup olmadığını bilmiyorum, ama objdump ile:

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

Sorunuzun geri kalanını görmezden geldiğimi fark ettim. Bayraklar genellikle hiçbir yere kaydedilmez; büyük olasılıkla bir yorum bölümünde olacaklardı, ama bunu hiç görmedim. COFF başlığında bir zaman damgası için bir nokta var, ancak ELF'de eşdeğer yok, bu yüzden derleme zamanının da mevcut olduğunu düşünmüyorum

52
Michael Mrozek

Nasıl olur:

readelf -p .comment a.out
29
Colin King

strings komutunu kullanmayı deneyebilirsiniz. Bir sürü metin çıktısı oluşturacak; kontrol ederek derleyiciyi tahmin edebilirsiniz.

[email protected]:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Burada gcc ile derlendiğini biliyorum ama her zaman strings çıktısını bir dosyaya yönlendirebilir ve inceleyebilirsiniz.

Windows için peid adında çok iyi bir yardımcı program var, ancak Linux'ta bunun için alternatif bulamıyorum.

19
Hemant

bunu kendiniz veya objdump yapabilirsiniz.

Gcc tarafından derlenen ELF dosyası .note.ABI-tag ve .note.gnu.build-id iki bölüm ekleyecektir. her ikisi de tarafından görüntülenebilir

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

"s" seçeneği tüm içeriği görüntülemek anlamına gelir, bölüm adını belirtmek için "j" Bu stil bu bölümlerin onaltılık içeriğini alır.

readelf -n

insan tarafından okunabilir ELFFILE içeriğini bir kez gösterecektir. "n" seçeneği NOTLAR anlamına gelir.

İstediğiniz birini seçin.

Bu arada, objcopy kullanın, elf dosyasına kendi bölümünüzü ekleyebilirsiniz.

5
liuyang1

İki yöntem vardır. Her ikisi de aynı sonucu verecek

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

Readelf komutunu kullanarak, readelf -S binary ikili kısımda 40 bölüm üstbilgisini görüntüler. Seri numarası .comment Bölüm başlığı. Sistemimde 27 olarak gösterildi (davanız için farklı olabilir)

readelf -x 30 path/to/binary -> '.comment' bölümünün Hex dökümünü görüntüler. Bu dökümünde, ikili dosyayı oluşturmak için kullanılan derleyiciyi görebilirsiniz.

5
Ranjini

İkili tarafından kullanılan çeşitli CPU talimatlarının sayısını sayan bu akıllı komut dosyası öğesini de kullanabilirsiniz. Objektif çıktısının ayrıştırılmasına dayanır. Büyük bir ikili dosyada kullanırsanız, işlemin tamamlanması uzun zaman alabilir.

4
rozcietrzewiacz

7-Zip'de bir ELF ikili dosyası açarsanız, içindeki çeşitli bölümleri listeler. Buradan, derleyicinin yorumlarını görmek için ".comment" bölümünde bağlam menüsünü görüntüle seçeneğini kullanabilirsiniz (örn. "GCC: (GNU) 4.9 20150123 (yayın öncesi) Android = clang sürüm 3.8.256229 (LLVM 3.8.256229'a göre) ").

".Comment" bölümünün, varsa, boş bir karakterle başlamış gibi göründüğüne dikkat edin, bu nedenle, 7-Zip içinde kullanım için bununla karıştırılmayan bir görüntüleyici uygulaması seçtiğinizden emin olun (örn. veri olarak Unicode). Varolabilecek ve ilgi çekebilecek diğer bölümler ".not. *".

0
Joe

Hangi programa bağlı olarak şanslı bir atış yapmaya değer olabilir. Bazı programlar bunu bilgi olarak derleyecek ve bir çeşit sürüm çağrısı (-V, --version, -Version, vb.) Tarafından erişilebilir olacaktır. Aradığınız bu öğelerin alt kümelerini bulabilirsiniz (null set dahil). İşte özellikle verimli bir örnek 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
Joshua Huber