it-swarm-vi.com

Chúng ta có thể lấy thông tin trình biên dịch từ nhị phân elf không?

Có một số cơ hội để biết làm thế nào một nhị phân được xây dựng, trong Linux? (và hoặc Unix khác)

Trình biên dịch, phiên bản, thời gian, cờ vv ...

Tôi đã xem readelf và không thể tìm thấy nhiều, nhưng có thể có nhiều cách khác để phân tích mã/phần nhị phân, v.v ...

Bất cứ điều gì bạn biết làm thế nào để giải nén?

53
elmarco

Không có một cách phổ quát, nhưng bạn có thể đoán được bằng cách tìm kiếm những thứ chỉ được thực hiện bởi một trình biên dịch.

GCC là dễ nhất; nó viết một .comment phần chứa chuỗi phiên bản GCC (cùng chuỗi bạn nhận được nếu bạn chạy gcc --version). Tôi không biết có cách nào để hiển thị nó với readelf không, nhưng với objdump đó là:

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

Tôi chỉ nhận ra tôi bỏ qua phần còn lại của câu hỏi của bạn. Cờ thường không được lưu ở bất cứ đâu; họ sẽ ở trong một phần bình luận rất có thể, nhưng tôi chưa bao giờ thấy điều đó được thực hiện. Có một vị trí trong tiêu đề COFF cho dấu thời gian, nhưng không có tương đương trong ELF, vì vậy tôi không nghĩ rằng thời gian biên dịch có sẵn

52
Michael Mrozek

Làm thế nào về:

readelf -p .comment a.out
29
Colin King

Bạn có thể thử sử dụng lệnh strings. Nó sẽ tạo ra rất nhiều văn bản đầu ra; bằng cách kiểm tra nó bạn có thể đoán trình biên dịch.

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

Ở đây tôi biết nó được biên dịch với gcc nhưng bạn luôn có thể chuyển hướng strings xuất ra một tệp và kiểm tra nó.

Có một tiện ích rất tốt được gọi là peid cho Windows nhưng tôi không thể tìm thấy bất kỳ thay thế nào cho nó trên Linux.

19
Hemant

sẵn sàng hoặc objdump cả hai có thể làm điều này.

Tệp ELF được biên dịch bởi gcc sẽ thêm hai phần .note.ABI-tag và .note.gnu.build-id. cả hai có thể được hiển thị bởi

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

tùy chọn "s" có nghĩa là hiển thị đầy đủ nội dung, "j" để chỉ tên phần. Phong cách này có được nội dung hex của các phần đó.

readelf -n

sẽ hiển thị nội dung có thể đọc được của ELFFILE một lần. tùy chọn "n" có nghĩa là GHI CHÚ.

Chọn một cái như bạn thích.

Nhân tiện, sử dụng objcopy, bạn có thể thêm phần của riêng bạn vào tập tin elf.

5
liuyang1

Có hai phương pháp. Cả hai sẽ cho kết quả như nhau

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

Sử dụng lệnh readelf, readelf -S binary sẽ hiển thị 40 tiêu đề phần trong nhị phân. Lưu ý số sê-ri của .comment phần tiêu đề. Trong hệ thống của tôi, nó hiển thị là 27 (có thể khác với trường hợp của bạn)

readelf -x 30 path/to/binary -> sẽ hiển thị kết xuất Hex của phần '.comment'. Trong kết xuất đó, bạn có thể thấy trình biên dịch được sử dụng để xây dựng nhị phân.

5
Ranjini

Bạn cũng có thể sử dụng tập lệnh thông minh này để đếm số lượng các lệnh CPU khác nhau được sử dụng bởi nhị phân. Nó dựa trên phân tích đầu ra objdump. Coi chừng rằng có thể mất nhiều thời gian để hoàn thành nếu bạn sử dụng nó trên một nhị phân lớn.

4
rozcietrzewiacz

Nếu bạn mở tệp nhị phân ELF trong 7-Zip, nó sẽ liệt kê các phần khác nhau bên trong. Từ đó, bạn có thể sử dụng tùy chọn Xem ngữ cảnh menu, nói "phần", để xem các bình luận của nhà soạn nhạc (ví dụ: "GCC: (GNU) 4.9 20150123 (phát hành trước) Android = clang phiên bản 3.8.256229 (dựa trên LLVM 3.8.256229) ").

Xin lưu ý rằng phần ".comment", nếu nó tồn tại, dường như bắt đầu bằng ký tự null, vì vậy hãy chắc chắn chọn ứng dụng trình xem để sử dụng trong 7-Zip mà không bị nhầm lẫn bởi điều này (ví dụ: cố gắng diễn giải dữ liệu dưới dạng Unicode). Các phần khác có thể tồn tại và được quan tâm là ".note. *".

0
Joe

Có thể là giá trị một shot may mắn, tùy thuộc vào chương trình. Một số chương trình sẽ được biên dịch thành thông tin và có thể truy cập bằng một số loại cuộc gọi phiên bản (-V, --version, -Version, v.v.). Bạn có thể tìm thấy bất kỳ tập hợp con của những mục bạn đang tìm kiếm (bao gồm cả tập hợp null). Đây là một ví dụ đặc biệt hiệu quả, 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