Hoe neem een Kijkje In de Binaire Bestanden Van de Linux Commando-Regel

0
218
fatmawati achmad zaenuri/Shutterstock

Een mystery-bestand? De Linux file-commando zal u snel vertellen wat voor type bestand het is. Als het een binair bestand, echter, kunt u nog meer ontdekken over. het bestand heeft een hele reeks van gamma ‘ s die u zullen helpen analyseren. Wij laten u zien hoe u sommige van deze tools.

Het Identificeren Van Bestandstypen

Bestanden hebben meestal de kenmerken waarmee software pakketten te bepalen welk type bestand het is, evenals de betekenis van de gegevens binnen het vertegenwoordigt. Zou het niet zinvol zijn om te proberen te openen van een PNG-bestand in een MP3-speler, dus het is zowel nuttig en pragmatische dat een bestand gepaard met enige vorm van ID.

Dit kan een enkele signature bytes aan het begin van het bestand. Dit maakt een bestand aan het expliciet over de indeling en inhoud. Soms is het bestandstype is afgeleid van een onderscheidend aspect van de interne organisatie van de gegevens, die bekend staat als het bestand architectuur.

Sommige besturingssystemen, zoals Windows, worden volledig begeleid door een bestand met de extensie. Noem het naïef, of het vertrouwen op, maar Windows wordt ervan uitgegaan dat een bestand met de extensie DOCX is echt een DOCX word-processing file. Linux is niet zo, zoals u zult al snel zien. Het wil bewijs en ziet er in het bestand om het te vinden.

De tools die hier beschreven werden reeds geïnstalleerd is op de Manjaro 20, Fedora 21, en Ubuntu 20.04 distributies hebben we gebruikt om het onderzoek in dit artikel. Laten we beginnen ons onderzoek met de opdracht bestand.

Met de Opdracht bestand

We hebben een collectie van verschillende soorten bestanden in de huidige directory. Ze zijn een mengeling van het document, broncode, uitvoerbare en tekst bestanden.

Het ls commando toont ons wat er in de map, en de -hl (human-readable maten, lange lijst) optie zal ons de grootte van elk bestand:

ls -hl

Laten we proberen het bestand op een paar van deze en zien wat we krijgen:

bestand build_instructions.odt
bestand build_instructions.pdf
bestand COBOL_Report_Apr60.djvu

De drie bestandsformaten zijn correct geïdentificeerd. Waar mogelijk, bestand geeft ons een beetje meer informatie. Het PDF-bestand wordt gerapporteerd te worden in de versie 1.5 van formaat.

Zelfs als we de naam van de ODT-bestand om een uitbreiding met de willekeurige waarde van XYZ, het bestand is nog steeds correct geïdentificeerd, zowel binnen de Bestanden in de bestandsbrowser en op de commando-regel van het bestand te gebruiken.

Binnen de Bestanden het bestand browser wordt gegeven, de juiste pictogram. Op de commando-regel, bestand negeert de uitbreiding en ziet er in het bestand om de soort te bepalen:

bestand build_instructions.xyz

Met behulp van file op media, zoals beeld-en muziekbestanden, leidt meestal tot informatie over hun formaat, codering, resolutie, en dus op:

bestand screenshot.png
bestand screenshot.jpg
bestand Pachelbel_Canon_In_D.mp3

Interessant is dat, zelfs met platte tekst, bestanden beoordeelt niet het bestand met de extensie. Als u bijvoorbeeld een bestand met de “.c” – extensie, die standaard platte tekst, maar niet broncode-bestand niet verwarren met een echte C-broncode-bestand:

file-functie+headers.h
bestand makefile
bestand hallo.c

bestand correct identificeert de header-file (“.h”) als onderdeel van een C-bron-code collectie van bestanden, en het weet de makefile is een script.

Met behulp van een bestand met Binaire Bestanden

Binaire bestanden zijn meer van een “black box” zijn dan anderen. Afbeelding-bestanden kunnen worden bekeken, geluid-bestanden kunnen worden afgespeeld, en document-bestanden kunnen worden geopend door de juiste software pakket. Binaire bestanden zijn echter meer van een uitdaging.

Bijvoorbeeld, worden de bestanden “hallo” en “wd” zijn binaire uitvoerbare bestanden. Ze zijn programma ‘ s. Het bestand met de naam “wd.o” is een object bestand. Wanneer de bron-code is samengesteld door een compiler, een of meer object-bestanden worden gemaakt. Deze bevatten de machine code zal de computer uiteindelijk uitvoeren wanneer het afgewerkte programma wordt uitgevoerd, samen met de gegevens voor de linker. De linker controleert elk bestand voor de functie oproepen naar bibliotheken. Het verbindt hen aan alle bibliotheken worden gebruikt door het programma. Het resultaat van dit proces is een uitvoerbaar bestand.

Het bestand “watch.exe” is een binair uitvoerbaar bestand dat is cross-compiled om te draaien op Windows:

bestand wd
bestand wd.o
bestand hallo
bestand watch.exe

Het nemen van de laatste de eerste, bestand, vertelt ons de “watch.exe’ het bestand is een PE32+ uitvoerbare bestand van de console-programma, voor de x86-familie van processors op Microsoft Windows. PE staat voor portable executable-formaat, die 32 – en 64-bits versies. De PE32 is de 32-bit versie, en de PE32+ is de 64-bits versie.

De andere drie bestanden zijn al geïdentificeerd als Uitvoerbaar en Koppelbare Formaat (ELF) bestanden. Dit is een standaard voor uitvoerbare bestanden en de gedeelde-object-bestanden, zoals bibliotheken. We nemen een kijkje op de ELF header formaat kort.

Wat kunnen vangen uw oog is, is dat de twee uitvoerbare bestanden (“wd” en “hallo”) worden geïdentificeerd als de Linux Standard Base (LSB) gedeelde objecten, en het object bestand “wd.o” is geïdentificeerd als een LSB-verplaatsbare. Het woord uitvoerbaar is duidelijk in zijn afwezigheid.

Object-bestanden zijn verplaatsbare, wat betekent dat de code binnen hen kan in het geheugen worden geladen op elke locatie. De uitvoerbare bestanden worden weergegeven als een gedeelde objecten, omdat ze zijn gemaakt door de linker van de object-bestanden op een zodanige wijze dat zij erven deze mogelijkheid.

Dit maakt de Address Space Layout Randomization (ASMR) systeem voor het laden van de uitvoerbare bestanden in het geheugen adressen van haar keuze. Standaard uitvoerbare bestanden hebben een laad-adres gecodeerd in hun kop, die bepaalt waar ze in het geheugen geladen.

ASMR is een beveiligingstechniek. Het laden van uitvoerbare bestanden in het geheugen voorspelbaar adressen maakt ze gevoelig zijn voor de aanval. Dit is omdat de punten van binnenkomst, en de locaties van hun functies, zal altijd bekend bij de aanvallers. Positie Onafhankelijk Uitvoerbare bestanden (PIE), geplaatst op een willekeurig adres overwinnen van deze gevoeligheid.

Als we compileren van ons programma met de gcc compiler en zorgen voor het -geen-optie taart, we zullen het genereren van een conventionele uitvoerbaar.

De -o (output file) optie laat ons een naam voor ons uitvoerbaar:

gcc -o-hallo -geen-pie hallo.c

We gebruiken bestand op de nieuwe uitvoerbaar en te zien wat er veranderd is:

bestand hallo

De grootte van het uitvoerbare bestand is dezelfde als voorheen (17 KB):

ls -hl hallo

De binary is nu geïdentificeerd als een standaard uitvoerbaar bestand. We doen dit voor demonstratie doeleinden. Als het compileren van toepassingen op deze manier verliest u alle voordelen van de ASMR.

Waarom Is een Uitvoerbaar Zo Groot?

Ons voorbeeld hallo programma is 17 KB, dus het kon wel groot, maar alles is relatief. De bron code is 120 bytes:

kat gedag.c

Wat bulking uit de binaire als alles wat het doet is het afdrukken van een string naar het terminal venster? We weten dat er een ELF kop, maar dat is alleen de 64-bytes lang voor een 64-bits binair getal. Kortom, het moet iets anders zijn:

ls -hl hallo

Laten we scannen de binaire met de snaren opdracht als een eenvoudige eerste stap om te ontdekken wat erin zit. We pijp in minder:

snaren hallo | minder

Er zijn veel zinnen in het binaire, naast de “Hallo, Geek wereld!” van de source code. De meeste van hen zijn labels voor de regio ‘ s binnen de binaire, en de namen en het koppelen van informatie van gedeelde objecten. Deze omvatten de bibliotheken en functies binnen de bibliotheken, waarop de binaire hangt.

De ldd commando toont ons het gedeelde object dependencies van een binair:

ldd hallo

Er zijn drie vermeldingen in de output, en twee van hen hebben een pad (de eerste niet):

  • linux-vdso.dus: Virtuele Dynamische Shared Object (VDSO) is een kernel mechanisme waarmee een set van kernel-ruimte routines om te worden benaderd door een user-space binaire. Dit voorkomt dat de overhead van een context switch van de user kernel-modus. VDSO gedeelde objecten voldoen aan de Uitvoerbare en Koppelbare Formaat (ELF) formaat, zodat ze dynamisch worden gekoppeld aan de binaire tijdens runtime. De VDSO wordt dynamisch toegewezen en maakt gebruik van ASMR. De VDSO vermogen wordt geleverd door de standaard GNU C Bibliotheek als de kernel ondersteunt de ASMR regeling.
  • libc.dus.6: De GNU C Bibliotheek gedeeld object.
  • /lib64/ld-linux-x86-64.dus.2: Dit is de dynamische linker de binaire wil gebruiken. De dynamische linker ondervraagt de binaire om te ontdekken wat de afhankelijkheden heeft. Hij lanceert die gedeelde objecten in het geheugen. Het bereidt de binaire om te rennen en te kunnen zoeken naar en openen van de afhankelijkheden in het geheugen. Daarna start het programma.

De ELF Kop

We kunnen onderzoeken en te decoderen van de ELF kop met de readelf bruikbaarheid en de op de -h (header-bestand) optie:

readelf -h-hallo

De kop is geïnterpreteerd voor ons.

De eerste byte van alle ELF-binairen is ingesteld op hexadecimale waarde 0x7F. De volgende drie bytes worden ingesteld op 0x45, 0x4C, en 0x46. De eerste byte is een vlag die aangeeft dat het bestand op als een ELF-binary. Om deze kristalheldere, de volgende drie bytes spreuk uit “ELF” in ASCII:

  • Klasse: Geeft aan of de binary is een 32 – of 64-bits uitvoerbaar (1=32, 2=64).
  • Gegevens: Geeft de endianness in gebruik. Endian codering bepaalt de wijze waarop de multibyte-nummers worden opgeslagen. In big-endian-codering, een nummer dat is opgeslagen met de meest significante bits eerste. In little-endian-codering, het nummer is opgeslagen met de minst significante bits eerste.
  • Versie: De versie van ELF (op dit moment, het is 1).
  • OS/ABI: geeft het type application binary interface in gebruik. Dit definieert de interface tussen twee binaire modules, zoals een programma en een gedeelde bibliotheek.
  • ABI Versie: De versie van de ABI.
  • Type: Het type van ELF-binairen. De gemeenschappelijke waarden zijn ET_REL voor een verplaatsbare bronnen (zoals een object file), ET_EXEC voor een uitvoerbaar programma gecompileerd wordt met de optie-no-pie vlag, en ET_DYN voor een ASMR-bewust uitvoerbaar.
  • Machine: De instructieset-architectuur. Dit geeft de target platform waarop de binaire werd gemaakt.
  • Versie: Altijd ingesteld op 1, wordt voor deze versie van ELF.
  • Entry Point Adres: Het geheugen adres in de binaire waarop de uitvoering begint.

De andere items zijn afmetingen en aantallen van de regio ‘ s en afdelingen binnen de binaire zo hun locaties kunnen worden berekend.

Een snelle blik op de eerste acht bytes van de binaire met hexdump zal te zien zijn van de handtekening van byte en “ELF” string in de eerste vier bytes van het bestand. De -C (canonieke) optie geeft ons de ASCII-representatie van de bytes, samen met hun hexadecimale waarden, en de -n (aantal) optie kunt ons aangeven hoeveel bytes we willen zien:

hexdump -C -n 8 hallo

objdump en de Granulaire Bekijken

Als u wilt zien van de nitty-gritty details, kunt u gebruik maken van de objdumpcommand met de -d (demonteren) optie:

objdump -d hallo | minder

Deze demonteert de machine uitvoerbare code en wordt weergegeven in hexadecimale bytes naast de assembly taal equivalent. Het adres van de locatie van de eerste bye in elke regel wordt weergegeven aan de linkerkant.

Dit is alleen handig als je het kan lezen assembly taal, of bent u nieuwsgierig wat er achter het gordijn. Er is veel van de output, zodat we doorgesluisd in minder.

Het compileren en Linken

Er zijn vele manieren om te compileren van een binary. Bijvoorbeeld, de ontwikkelaar kiest of debug informatie. De manier waarop het binair gekoppeld is ook een rol speelt bij de inhoud en omvang. Als de binaire verwijzingen objecten als externe afhankelijkheden, het zal kleiner zijn dan die van de afhankelijkheden statisch koppelen.

De meeste ontwikkelaars al kent de commando ‘ s die we hebben besproken hier. Voor anderen, maar ze bieden een aantal eenvoudige manier te kijk rond en zie wat ligt in de binaire black box.

LEES VERDER

  • “Hoe Wijzig Uw Persoonlijke Meeting-ID (PMI) in te Zoomen
  • “Hoe Naadloos de Overdracht van Je WhatsApp-Berichten naar Uw Nieuwe Telefoon
  • “Hoe u de Hoogte of Breedte van de Taakbalk in Windows 10
  • “Hoe neem een Kijkje In de Binaire Bestanden Van de Linux Commando-Regel
  • “Microsoft Zal Samenvoegen UWP en Win32 Apps Met Project Reünie