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


50

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 xét readelfvà 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?

Câu trả lời:


48

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 .commentphần có 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ị hay không readelf, nhưng với objdumpnó:

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


28

Làm thế nào về:

readelf -p .comment a.out

3
Điều này khác với Michael như objdumpthế nào? Nó cung cấp thêm thông tin? Có sẵn trên các nền tảng khác nhau? Định dạng đầu ra sạch hơn?
Caleb

9
Định dạng đầu ra sạch hơn.
marcin

19

Bạn có thể thử sử dụng stringslệnh. 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.

pubuntu@pubuntu:~$ 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 cùng gccnhưng bạn luôn có thể chuyển hướng stringsđầu ra sang một tệp và kiểm tra nó.

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


1
+1, cho phép bạn xem các cờ tổng hợp (nếu gcc)
Ivan Black

4

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 tệp nhị phân. Lưu ý số sê-ri của .comment tiêu đề phần. 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.


4

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" cho biết 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 trong tệp elf.


readelf -nlàm việc cho tôi - ví dụ đầu ra: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

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 khá 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.


Đáng lưu ý rằng đó chỉ là x86.
Victor Sergienko

0

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

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) phiên bản Android clang 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. *".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.