Come Sbirciare all’Interno di File Binari Dalla Riga di Comando di Linux

0
330
fatmawati achmad zaenuri/Shutterstock

Sono un mistero il file? Il file Linux comando rapidamente dirà che tipo di file si tratta. Se si tratta di un file binario, però, si può scoprire ancora di più su di esso. file ha tutta una serie di compagni di stable che vi aiuterà a analizzare. Vi mostreremo come utilizzare alcuni di questi strumenti.

Identificare I Tipi Di File

I file di solito hanno caratteristiche che permettono di pacchetti software per identificare il tipo di file è, così come quello che i dati in esso rappresenta. Non avrebbe senso per tentare di aprire un file PNG in un lettore musicale MP3, quindi è utile e pragmatico che contiene un file con qualche forma di identificazione.

Questo potrebbe essere un paio di firma byte dall’inizio del file. Questo consente a un file per essere più espliciti il suo formato e il contenuto. A volte, il tipo di file che viene dedotto dal caratteristico aspetto dell’organizzazione interna dei dati stessi, conosciuto come il file di architettura.

Alcuni sistemi operativi, come Windows, sono completamente guidata da un file di estensione. Si può chiamare creduloni o la fiducia, ma Windows non si assume qualsiasi file con estensione DOCX è davvero un DOCX file di elaborazione testi. Linux non è così, come si vedrà subito. Vuole una prova e guarda dentro il file di trovare.

Gli strumenti qui descritti sono stati già installati su Manjaro 20, Fedora 21, e Ubuntu 20.04 distribuzioni che abbiamo usato per la ricerca di questo articolo. Iniziamo la nostra indagine utilizzando il comando file.

Utilizzando il Comando file

Abbiamo una collezione di diversi tipi di file nella nostra directory corrente. Sono una miscela di documento, il codice sorgente, file eseguibile e il file di testo.

Il comando ls ci mostrano cosa c’è nella directory e -hl (leggibile dimensioni, lunga lista) opzione ci mostra la dimensione di ogni file:

ls -hl

Proviamo file su alcuni di questi e vedere quello che si ottiene:

file build_instructions.odt
file build_instructions.pdf
file COBOL_Report_Apr60.djvu

I tre formati di file sono correttamente identificati. Dove possibile, i file ci dà un po ‘ più di informazioni. Il file PDF è segnalato per essere la versione 1.5 formato.

Anche se si rinomina il file ODT avere un’estensione con il valore arbitrario di XYZ, il file viene correttamente identificato, sia all’interno dei File browser di file e la riga di comando che utilizza file.

All’interno del file il file browser, ha dato l’icona corretta. Sulla riga di comando, file ignora l’estensione e guarda dentro il file per determinare il tipo:

file build_instructions.xyz

Utilizzo di file multimediali, come immagini e file musicali, di solito produce informazioni per quanto riguarda il loro formato, la codifica, la risoluzione, e così via:

file di immagine.png
file screenshot.jpg
file Pachelbel_Canon_In_D.mp3

È interessante notare che, anche con dei file di testo, file non giudicare il file con la sua estensione. Per esempio, se si dispone di un file con l’ “.c” estensione, che contiene standard di testo normale, ma non il codice sorgente, file non sbaglio è una vera C file di codice sorgente:

la funzione file+intestazioni.h
file makefile
file ciao.c

file identifica correttamente il file di intestazione (“.h”) come parte di un codice sorgente in C di una collezione di file, e si sa che il makefile è uno script.

Utilizzando il file con i File Binari

I file binari sono più di una “scatola nera” di altri. I file immagine possono essere visualizzati, i file audio possono essere riprodotti, e i file di documento può essere aperto con il pacchetto software più appropriato. I file binari, però, sono più di una sfida.

Per esempio, il file di “ciao” e “wd” sono eseguibili binari. Sono programmi. Il file si chiama “wd.o” è un oggetto file. Quando il codice sorgente viene compilato da un compilatore, uno o più oggetti vengono creati dei file. Questi contengono il codice macchina, il computer verrà eventualmente eseguire quando è finito il programma viene eseguito, insieme con le informazioni per il linker. Il linker controlla ogni file oggetto per le chiamate di funzione per le biblioteche. Si collega a qualsiasi librerie che utilizza il programma. Il risultato di questo processo è un file eseguibile.

Il file di “watch.exe” è un binario eseguibile che è stato cross-compilato per funzionare su Windows:

file wd
file wd.o
file ciao
file watch.exe

Prendendo l’ultimo, file ci dice “watch.exe” il file è un PE32+ eseguibile, console di programma, per la famiglia dei processori x86 su Microsoft Windows. PE sta per portable executable format, che ha 32 – e 64-bit. Il PE32 è la versione a 32 bit, e il PE32+ è la versione a 64 bit.

Gli altri tre sono tutti i file identificati come Eseguibile e Linkable Format (ELF) file. Questo è uno standard per i file eseguibili i file oggetto, come le biblioteche. Daremo uno sguardo al ELF header formato breve.

Che cosa potrebbe prendere il tuo occhio è che i due eseguibili (“wd” e “ciao”) sono identificati come Linux Standard Base (LSB) oggetti condivisi, e il file oggetto “wd.o” è identificato come un LSB rilocabile. L’eseguibile di word è ovvio, in sua assenza.

File oggetto sono riposizionabili, vale a dire il codice all’interno di essi, può essere caricato in memoria in qualsiasi posizione. Gli eseguibili sono elencati come oggetti condivisi, perché sono stati creati dal linker dall’oggetto file in modo che essi ereditano questa capacità.

Questo permette l’Address Space Layout Randomization (ASMR) sistema per caricare i file eseguibili nella memoria a indirizzi di sua scelta. Gli eseguibili Standard dispone di un indirizzo di caricamento codificato nel loro intestazioni, che determinano dove sono caricati in memoria.

ASMR è una tecnica di protezione. Caricamento di file eseguibili nella memoria prevedibile indirizzi li rende suscettibili di attacco. Questo è perché i loro punti di ingresso, e le posizioni delle loro funzioni, sarà sempre conosciuto per gli attaccanti. Posizione Indipendente file Eseguibili (PIE) posizionato ad un indirizzo casuale superare questa suscettibilità.

Se si compila il nostro programma con il compilatore gcc e fornire i -n-opzione torta, genereremo un convenzionale eseguibile.

-O (file di output) opzione ci permette di fornire un nome per il nostro eseguibile:

gcc-o ciao -non-pie ciao.c

Utilizzeremo il file eseguibile di nuovo e vedere cosa è cambiato:

file ciao

Le dimensioni del file eseguibile è la stessa di prima (17 KB):

ls -hl ciao

Il binario è identificato come un eseguibile standard. Stiamo facendo questo solo per scopo dimostrativo. Se si compilare le applicazioni in questo modo, si perde tutti i vantaggi del ASMR.

Perché È un Eseguibile Così Grande?

Il nostro esempio ciao il programma è di 17 KB, quindi, difficilmente potrebbe essere chiamato grande, ma poi, tutto è relativo. Il codice sorgente è di 120 byte:

gatto ciao.c

Cosa c’è di infagottarti il binario, se non è possibile stampare una stringa nella finestra di terminale? Sappiamo che c’è un’intestazione ELF, ma che solo il 64-byte per una versione a 64-bit binari. Chiaramente, deve essere qualcos’altro:

ls -hl ciao

Facciamo una scansione del binario con le stringhe di comando come un semplice primo passo per scoprire cosa c’è al suo interno. Ti pipe in meno:

stringhe ciao | meno

Ci sono molte stringhe all’interno dei binari, oltre al “Ciao, mondo Geek!” dal nostro codice sorgente. La maggior parte di loro sono etichette per le regioni all’interno del binario, e i nomi e le informazioni di collegamento di oggetti condivisi. Questi includono le librerie e le funzioni all’interno di tali librerie, in cui il binario dipende.

Il comando ldd ci mostra l’oggetto condiviso dipendenze di un binario:

ldd ciao

Ci sono tre voci in uscita, e due di questi includono un percorso di directory (il primo non):

  • linux-vdso.quindi: Virtuale Dynamic Shared Object (VDSO) è un kernel, un meccanismo che consente a un insieme di kernel-space di routine per essere accessibili da un utente-spazio binario. Questo consente di evitare il sovraccarico di una commutazione di contesto dall’utente in modalità kernel. VDSO oggetti condivisi aderire all’Eseguibile e Linkable Format (ELF), formato, permettendo loro di essere collegati in modo dinamico per il binario in fase di runtime. Il VDSO è allocata in modo dinamico e sfrutta ASMR. Il VDSO capacità è fornito da standard GNU C Library, se il kernel supporta l’ASMR regime.
  • libc.così.6: La Libreria GNU C oggetto condiviso.
  • /lib64/ld-linux-x86-64.così.2: Questo è il linker dinamico binario vuole utilizzare. Il linker dinamico interroga il binario per scoprire le dipendenze che si ha. Si lancia a quelli condivisi oggetti in memoria. Prepara il binario di eseguire e di essere in grado di trovare e accedere alle dipendenze in memoria. Quindi, si lancia il programma.

L’Intestazione ELF

Siamo in grado di analizzare e decodificare l’intestazione ELF utilizzando il readelf utilità e l’-h (file di intestazione) opzione:

readelf -h ciao

L’intestazione viene interpretato per noi.

Il primo byte di tutti i binari ELF è impostato al valore esadecimale 0x7F. I prossimi tre byte sono impostati per 0x45, 0x4C, e 0x46. Il primo byte è un flag che identifica il file binari ELF. Per fare questo limpido, i prossimi tre byte magia di “ELFO” in ASCII:

  • Classe: Indica se il binario è a 32 o 64 bit eseguibile (1=32, 2=64).
  • Dati: Indica la modalita ‘ in uso. Endian codifica definisce il modo in cui multibyte numeri sono memorizzati. Nel big-endian la codifica di un numero memorizzato con il suo bit più significativi di prima. In little-endian codifica, il numero viene memorizzato con la bit meno significativi di prima.
  • Versione: La versione di ELF (attualmente è 1).
  • OS/ABI: Rappresenta il tipo di interfaccia binaria dell’applicazione in uso. Questo definisce l’interfaccia tra i due binari, come moduli di un programma e una libreria condivisa.
  • ABI Versione: La versione dell’ABI.
  • Tipo: Il tipo di binari ELF. I valori comuni sono ET_REL per un rilocabile risorsa (ad esempio un file oggetto), ET_EXEC per un file eseguibile compilato con l’opzione-no-torta bandiera, e la SOLUZIONE per un ASMR-conoscenza eseguibile.
  • Macchina: Il set di istruzioni per l’architettura. Questo indica la piattaforma di destinazione, per cui il binario è stato creato.
  • Versione: Sempre impostato a 1, per questa versione di ELF.
  • Punto di ingresso Indirizzo: L’indirizzo di memoria all’interno del binario a cui esecuzione ha inizio.

Le altre voci sono la dimensione e il numero delle regioni e delle sezioni all’interno del binario in modo che le loro posizioni possono essere calcolati.

Una rapida occhiata al primo otto byte di binario con hexdump mostra la firma di byte e di “ELF” stringa nei primi quattro byte del file. L’-C (canonica) opzione ci dà la rappresentazione ASCII del byte a fianco dei loro valori esadecimali, e l’-n (numero) opzione consente di specificare il numero di byte che vogliamo vedere:

hexdump -C -n 8 ciao

objdump e il Granulare di Vista

Se si desidera visualizzare il nocciolo dettaglio, è possibile utilizzare il objdumpcommand con l’-d (smontare) opzione:

objdump -d ciao | meno

Questo smonta il codice macchina eseguibile e lo visualizza in byte esadecimali, accanto al linguaggio assembly equivalente. L’indirizzo del primo bye in ogni riga viene visualizzata sulla sinistra.

Questo è utile solo se è in grado di leggere il linguaggio assembly, o siete curiosi di sapere cosa c’è dietro il sipario. C’è un sacco di output, così abbiamo convogliato in meno.

La compilazione e Collegamento

Ci sono molti modi per compilare un file binario. Per esempio, lo sviluppatore sceglie se includono informazioni di debug. Il modo in cui il binario è legata svolge anche un ruolo nel suo contenuto e dimensioni. Se il binario riferimenti condivisione di oggetti come le dipendenze esterne, sarà più piccolo rispetto a quello a cui le dipendenze di collegamento statico.

La maggior parte degli sviluppatori sanno già i comandi che abbiamo trattato qui. Per altri, però, offrono alcuni semplici modi per rovistare in giro e vedere cosa c’è all’interno del binario scatola nera.

CONTINUA A LEGGERE

  • “Come Modificare la Larghezza o l’Altezza della Barra delle applicazioni di Windows 10
  • “Come Sbirciare all’Interno di File Binari Dalla Riga di Comando di Linux
  • “Microsoft Si fonderanno UWP e Win32 App Con il Progetto di Reunion
  • “Windows 10 È Sempre Grafica Applicazioni Linux Con Supporto per GPU
  • “Windows 10 PowerToys Ottenere un Launcher e Tastiera Rimappatore