Hur man Kika in Binära Filer Från kommandoraden i Linux

0
26
fatmawati achmad zaenuri/Shutterstock

Har ett mysterium fil? Linux-fil kommandot kommer snabbt att berätta vilken typ av fil det är. Om det är en binär fil, men du kan ta reda på ännu mer om det. filen har en hel rad av stablemates som kommer att hjälpa dig att analysera den. Vi kommer att visa dig hur du använder vissa av dessa verktyg.

Identifiera Filtyper

Filer brukar ha egenskaper som gör att programpaket för att identifiera vilken typ av fil det är, liksom vad uppgifterna inom den representerar. Det skulle inte vara någon mening att försöka att öppna en PNG-fil i en MP3-spelare, så det är både bra och pragmatiskt som en fil bär med sig någon form av ID.

Detta kan vara ett par signatur byte i början av filen. Detta gör att en fil att vara explicit om dess form och innehåll. Ibland, filtypen är slutsatsen från en utmärkande aspekt av den interna organisationen av data själv, känd som den fil arkitektur.

Vissa operativsystem, som Windows, är helt styrs av ett filtillägg. Du kan kalla det för lättlurad eller lita på, men Windows förutsätter någon fil med filändelsen DOCX är verkligen en DOCX-ordbehandling-fil. Linux är inte som att, som du snart kommer att se. Den vill ha bevis och ser ut inuti filen för att hitta det.

De verktyg som beskrivs här redan var installerat på Manjaro 20, Fedora 21, och Ubuntu 20.04 distributioner vi att användas till forskning denna artikel. Låt oss börja vår undersökning med hjälp av filen kommandot.

Med file Kommandot

Vi har en samling av olika filtyper i vår aktuella katalog. De är en blandning av dokument, källkod, körbar, och textfiler.

Ls-kommandot kommer att visa oss vad som finns i katalogen, och -hl (lättläst storlekar, långa lista) alternativ kommer att visa storleken av varje fil:

ls -hl

Låt oss försöka fil på några av dessa och se vad vi får:

fil build_instructions.odt
fil build_instructions.pdf
fil COBOL_Report_Apr60.djvu

Tre format som är korrekt identifierade. Där så är möjligt, fil ger oss lite mer information. PDF-filen är rapporterade att vara i version 1.5-format.

Även om vi byter namn på ODT filen för att få en förlängning med godtyckligt värde av XYZ-filen är fortfarande identifieras på rätt sätt, både inom-Filer filen i webbläsaren och på kommandoraden med hjälp av filen.

Inom de Filer filen webbläsare, det är visst rätt ikon. På kommandoraden, fil ignorerar förlängning och ser ut inuti filen för att fastställa dess typ:

fil build_instructions.xyz

Du använder filen på medier, såsom bild och musik filer, ger oftast information om deras format, kodning, upplösning, och så vidare:

fil skärmdump.png
fil screenshot.jpg
fil Pachelbel_Canon_In_D.mp3

Intressant, även med vanlig text filer, fil inte döma filen genom dess förlängning. Om du till exempel har en fil med “.c” förlängning, som innehåller vanlig oformaterad text, men inte källkoden, fil inte missta den för en äkta C-källkod-fil:

filen function+rubriker.h
filen makefile
fil hej.c

filen identifierar header-filen (“.h”) som en del av en C-källkod samling av filer, och det vet makefile är ett skript.

Med hjälp av filen med Binära Filer

Binära filer är mer av en “black box” än andra. Bildfiler kan visas, ljudfiler kan spelas upp, och dokument-filer kan öppnas med hjälp av lämplig programvara paket. Binära filer, men är mer av en utmaning.

Till exempel filer “hej” och “wd -” är binära filer. De är program. Filen heter “wd.o” är ett objekt-fil. När källkoden kompileras av en kompilator, en eller flera objekt-filer skapas. Dessa innehåller maskinkod som datorn kommer så småningom att köra när det färdiga programmet körs, tillsammans med information för länkaren. Länkaren kontrollerar varje objekt-fil för funktionen samtal till bibliotek. Det länkar dem till något bibliotek som programmet använder. Resultatet av denna process är en körbar fil.

Filen “watch.exe” är en binär körbar som har varit cross-kompilerad för att köras på Windows:

filen wd
filen wd.o
fil hej
fil watch.exe

Tar det sista först, fil talar om för oss “watch.exe” filen är en PE32+ körbar, konsol-program, för x86-processorer på Microsoft Windows. PE står för portabla körbara-format, som har 32 – och 64-bitars versioner. Den PE32 är 32-bitars versionen, och PE32+ är en 64-bitars version.

De andra tre filer är alla identifierade som Körbara och Samman-Format (ELF) filer. Detta är en standard för körbara filer och delade objekt-filer, till exempel bibliotek. Vi kommer att ta en titt på ELF-huvudet-format inom kort.

Vad som kan fånga ditt öga är att de två körbara filer (“programvaran wd” och “hej”) är identifierade som Linux Standard Base (LSB) delade objekt, och objekt-fil “wd.o” har identifierats som en LSB relokerbara. Ordet körbara är uppenbar i dess frånvaro.

Objekt-filer är flyttbara, vilket innebär att koden inuti dem kan laddas in i minnet på valfri plats. De program som anges som gemensamt objekt, eftersom de har skapats av länkaren från objekt-filer på ett sådant sätt att de har ärvt denna förmåga.

Detta gör att den Address Space Layout Randomisering (ASMR) för att läsa de filer i minnet på adresser till dess att välja. Standard körbara har en laddning adress kodat i deras huvuden, som avgör om de är laddad i minnet.

ASMR är en säkerhet teknik. Inläsning av filer i minnet på förutsägbara adresser gör dem mottagliga för angrepp. Detta beror på att deras startpunkter, och det platser av deras funktioner, kommer alltid att vara känt för angripare. Position Oberoende Körbara filer (PAJ) placerad vid en slumpmässig adress övervinna detta mottaglighet.

Om vi sammanställa vårt program med gcc-kompilatorn och ge -inga-paj alternativ, vi kommer skapa en konventionell körbar.

-O (utfil) alternativet låter oss ge ett namn till vår körbar:

gcc -o hello-ingen paj hej.c

Vi kommer att använda filen på ny körbar och se vad som har förändrats:

fil hej

Storleken av den körbara filen är samma som innan (17 KB):

ls -hl hej

Binär är nu identifierad som en standard körbar. Vi gör det här för demonstrationssyfte. Om du sammanställa ansökningar på detta sätt, du kommer att förlora alla fördelar av ASMR.

Varför Är en Körbar Så Stor?

Vårt exempel hej programmet är 17 KB, så det kan knappast kallas stora, men sedan, allt är relativt. Källkoden är 120 byte:

katt hej.c

Vad som fyllnadsmedel ut den binära om allt den gör är att skriva ut en sträng till terminalfönstret? Vi vet att det finns en TOMTE header, men det är bara 64 byte lång för en 64-bitars binära. Klart det måste vara något annat:

ls -hl hej

Låt oss skanna med binära strängar kommandot som ett enkelt första steg för att upptäcka vad som finns inuti den. Vi ska spritsa den i mindre:

strängar hej | mindre

Det finns många strängar inuti den binära, förutom “Hej, Geek världen!” från vår källkod. De flesta av dem är etiketter för regioner inom de binära, och namn och länka information av delade objekt. Dessa inkluderar bibliotek, och funktioner inom de bibliotek, som binära beror på.

Den ldd kommandot visar oss den delade objekt beroenden av ett binärt:

ldd hej

Det finns tre poster i produktionen, och två av dem har en sökväg till katalog (den första inte):

  • linux-vdso.så: Dynamiska Virtuella Delade Objekt (VDSO) är en kärna mekanism som gör att en uppsättning av kernel-utrymme rutiner för att kommas åt av en användare-binära rymden. Detta gör att man undviker att behöva ett sammanhang växla från användaren kernel-läge. VDSO delade objekt ansluta sig till den Körbara och Samman-Format (ELF) format, vilket möjliggör för dem att vara dynamiskt länkade till den binära vid runtime. Den VDSO är allokeras dynamiskt och tar fördel av ASMR. Den VDSO kapacitet som tillhandahålls av standard GNU C-Bibliotek om kärnan stödjer ASMR system.
  • libc.så.6: GNU C-Biblioteket för delade objekt.
  • /lib64/ld-linux-x86-64.så.2: Detta är den dynamiska länkaren att den binära vill använda. Den dynamiska länkaren förhör binären för att upptäcka vilka beroenden de har. Det lanserar de delade objekt i minnet. Förbereder det binära att köra och kunna hitta och få tillgång till beroenden i minnet. Då startar programmet.

ELF-Huvudet

Vi kan undersöka och tolka ELF header med hjälp av readelf verktyg och -h (file header) alternativ:

readelf -h-hej

Rubriken tolkas för oss.

Den första byten i alla ELF-binärer är satt till hexadecimalt värde 0x7F. De tre nästa byte är satt till 0x45, 0x4C, och 0x46. Den första byten är en flagga som identifierar filen som en ALV binära. För att göra detta kristallklart, de tre nästa byte stava ut “TOMTEN” i ASCII:

  • Klass: Anger om binära är en 32 – eller 64-bit-exekverbar (1=32, 2=64).
  • Data: Visar endian i bruk. Endian kodning definierar på vilket sätt multibyte-nummer lagras. I big-endian kodning, telefonnummer lagras med den mest signifikanta bitarna först. I little-endian kodning, numret är lagrat med sin minst signifikanta bitarna först.
  • Version: Den version av TOMTEN (för närvarande, det är 1).
  • OS/ABI: Representerar den typ av binära programgränssnittet i bruk. Detta definierar gränssnitt mellan två binära moduler, till exempel ett program och ett delat bibliotek.
  • ABI Version: Den version av ABI.
  • Typ: typ av ELF-binär. De gemensamma värderingarna är ET_REL för en relokerbara resurs (till exempel ett föremål fil), ET_EXEC för ett körbart sammanställts med -nr-paj flagg, och ET_DYN för en ASMR-medveten körbar.
  • Maskin: Den instruktion arkitektur. Detta indikerar att målet plattform för vilka binära skapades.
  • Version: Alltid sätts till 1 för denna version av ELF.
  • Entry Point Adress: minnet adress inom den binära på vilket utförande påbörjas.

Andra poster storlekar och antal regioner och sektioner inom binära så deras platser kan beräknas.

En snabb titt på de första åtta byte av binär med hexdump kommer att visa signatur byte och “ELF” strängen i den första fyra byte av fil. -C (canonical) alternativet ger oss ASCII-representation av byte tillsammans med sina hexadecimala värden, och -n (antal) alternativet låter oss ange hur många byte som vi vill se:

hexdump -C -n 8 hej

objdump och Detaljerad Vy

Om du vill se praktiska detaljer detalj, kan du använda objdumpcommand med-d (plocka isär) alternativ:

objdump -d hej | mindre

Detta disassembles körbar maskinkod och visar det i hexadecimal-byte vid sidan av församlingen språket motsvarande. Adressen platsen för den första bye i varje linje visas längst ner till vänster.

Detta är endast användbart om du kan läsa assembler, eller om du är nyfiken på vad som händer bakom ridån. Det finns en hel del av produktionen, så vi pep det till mindre.

Kompilering och Länkning

Det finns många sätt att sammanställa en binär. Till exempel, utvecklaren väljer om felsökning information. Hur binära är kopplad spelar också en roll för dess innehåll och storlek. Om den binära referenser dela objekt som externa beroenden, det kommer att vara mindre än en som beroenden är statiskt länkade.

De flesta utvecklare redan vet de kommandon som vi har beskrivit här. För andra, men de erbjuder några enkla sätt att rota runt och se vad som ligger inne i den binära svart låda.

LÄS NÄSTA

  • “Microsoft Merge UWP och Win32-program Med Projekt Återförening
  • “Windows-10 Är att Få Grafiska Linux-program Med GPU-Stöd
  • “Windows 10 PowerToys Få en Launcher och Tangentbord Remapper
  • “Microsoft Kanten Är att Få en webbsökning Sidebar
  • “Den Nya Windows Terminal Är Klar, Här är Varför Det är Fantastiska